私は、SUNのSolaris8を使っています。

現在動いているプロセスを、killコマンドを使って終了させる際に、
-9または-KILLオプションを付けると、強制終了を行いますよね。

そこで質問なのですが、そもそもプロセスの『終了』と『強制終了』の違いとは何ですか?

とっても初歩的な質問だとは思いますが、いまいち理解できません。
よろしくお願いします。

このQ&Aに関連する最新のQ&A

A 回答 (6件)

いわゆる unix には、「シグナル」というイベント通知の仕組みがあります。



あるプロセスに対して、シグナルが送信されると、そのプロセスは、やっている
処理を中断して、シグナルハンドラという特別に割り当てられた処理を行います。

kill コマンドというのは、このシグナルの送信をするコマンドに他なりません。


シグナルは、番号でイベントを区別でき、何種類もあり、それぞれの番号毎に
意味が割り当てられています。

シグナルハンドラは、自分で作って登録することもできますが、その登録を行わない
ときには、それぞれのシグナルに「デフォルトの動作」が割り当てられています。

デフォルトの動作は、無視・コア・終了・停止の4種類あります。

シグナルの中で9(SIGKILL)だけは、ちょっと特別で、シグナルハンドラの登録が
無視されます。なので、このシグナルを送信することで、対象のプロセスを無条件に
終了させることが保証されています。

これを簡単に言うと「強制終了」ですね。

他にも、デフォルトの動作が「終了」シグナルがあります(例えば、1や2)。
こいつらも送信すると対象のプロセスは終了するのですが、シグナルハンドラを
登録することができるので、そのプロセスの作り方によっては終了しないことが
ありえます。


> そもそもプロセスの『終了』と『強制終了』の違いとは何ですか?

普通にプロセスが終了する場合、というのは exit システムコールを呼んだのと
同じなんですが、シグナルのデフォルトの動作での「終了」も exit システムコール
を呼ぶのと同じです。

なので、実は違いがありません。

kill -KILL は、「『終了』を無条件に例外無く行う」と考えて下さい。
    • good
    • 0
この回答へのお礼

ご回答ありがとうございました。

お礼日時:2001/10/24 18:07

cherry_moon> #3 の補足になりますが、どんなシグナルがあるかは、


cherry_moon> signal.h、sys/signal.h を見れば分かります。

では、補足返しを :-)

あれでは、OS によっては、すんごく重たくなるので

> while(1){
>   ;
> }

は、

pause();

としておいた方が良い、ということ。

もうひとつは、そのプログラムを動かしても SIGKILL だけは、my_handler() を
通らないことが、確認できますね、ということを付け加えておきます。
    • good
    • 1

kill、kill -TERM、kill -15 といったコマンドは、


終了を表す「SIGTERM」というシグナルをプロセスに送ります。
プロセスがこのシグナルを受け取ると、ただ終了するのではなく、
プログラム内で指定された終了時の処理を行います。
(trapコマンドでこの処理は指定できます)
たとえば、一時ファイルを削除したり、処理した項目をログに書き込むと行った処理が考えられます。
このシグナルを無視するようにも指定できます。

もしこれでプロセスを終了させられない場合、
kill -kill、kill -9 などのコマンドを利用することになります。
これらは、強制終了を表す「SIGKILL」というシグナルをプロセスに送ります。
この場合、naturalさんの書かれているように、プロセス自身の処理ではなく、
外部から強制的に終了させられるので、
終了時の処理などをプログラム内で指定できないのです。
(つまり、予想外の結果を招きかねません。)

ちなみに、シグナルにはかなり種類があります。
bashなどでは、kill -l で確認できます。
    • good
    • 0

#3 の補足になりますが、どんなシグナルがあるかは、


signal.h、sys/signal.h を見れば分かります。

下のプログラムを実行すると、どんなシグナルが入力されてるか見れます。

#include <stdio.h>
#include <stdlib.h>
#include <signal.h>
#include <unistd.h>

void my_handler(int sig);

int main(int argc, char **argv)
{
int sig;

for(sig=0;sig<256;sig++){
signal(sig, &my_handler);
}

while(1){
;
}

return 0;
}

void my_handler(int sig)
{
printf("signal: %d\n", sig);
return;
}
    • good
    • 0

終了とはプロセスに「終わってください」と言って、それに応答してプロセスが終わるものです。

だから、プログラムが暴走したりして話を聞いてないときは無駄でしょう。Windowsで暴走したプログラムの×を押しても何も起こらないのと同じです。強制終了の場合、シグナルという信号を投げます。シグナルには数種類あるのですが、この場合プログラムに割り込んで処理を中断、終了させます。
Windowsの「・・・は応答していません。終了しますか?」のような画面に例えるとわかりやすいですね。ソフトウェアの動きに割り込んで強制終了させます。
    • good
    • 0

プロセスの『終了』はプロセス自身の処理によって終了しますが、『強制終了』は外部からのシグナルによって強制終了命令を受け取ることによって終了させられるものです。


killコマンドには-9以外にもシグナルナンバーがあり、それぞれ送るシグナルによってプロセス側の反応も異なってきます。
killとはその名の通りプロセスを殺すことが代表的な役目ですが、実は様々なシグナルをプロセスに対して発行する役目を持っています。
    • good
    • 0

このQ&Aに関連する人気のQ&A

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています

このQ&Aを見た人が検索しているワード

このQ&Aと関連する良く見られている質問

Qコマンド一覧を取得するには?

「実行可能なコマンド一覧を出力する」コマンドはありますでしょうか?

個人的には,「~wm」という文字列で終わるコマンドを調べたいのですが,そのためにコマンド一覧からgrepで検索しようと思いました.

よろしくお願いいたします.

Aベストアンサー

$PATHのなかから実行可能なものをリストするスクリプトです。
ちなみに私の場合wmで終わるものは、
/usr/bin/pbmtocmuwm
/usr/bin/gnome-wm
/usr/bin/dh_installwm
でした。
-- 8< -- 8< -- 8< -- 8< -- 8< -- 8< -- 8< -- 8< -- 8< -- 8< --
#! /bin/sh
echo $PATH |
awk -F: '
{
for (i = 1; i <= NF; i++) {
printf("find %s -type f -ls\n", $i);
}
}' | sh |
awk '
$3 ~ /x/ {
print $NF
}'

QSUN Solaris8 サーバ間の時刻同期

タイトル通り SUNサーバ間で時刻同期を取りたいのですが
どの様な、方式で行うのが、簡単でしょうか?

SHELLより 日 1回時刻同期を取ろうと考えてます。

Aベストアンサー

rdateというコマンドがあります。

#/bin/rdate hogehoge

で、hogehogeに時刻を合わせるサーバの名前を入力します。
但し、相手先はntpなどで時間が正しい事が原則です。相手先の時刻が違うとrdateを実行したマシンの時刻も狂ってしまいます。(^^;;
詳しくはmanしましょう。

因みに、時刻設定は、shellで書くよりもcrontabに起動時間を決めて直接書いた方が楽だと思いますよ。:-)
参考まで…

QMS-DOSで使えるコマンド一覧を表示するコマンド

そのコマンドを入力すれば、MS-DOS内で使える
コマンド一覧が表示されるコマンドを知りたいのですが
どなたかご存知の方、いらっしゃいませんか?
UNIXで言うところのmanコマンドに当たるものです。

Aベストアンサー

Windowsカテゴリなので、MS-DOSのことじゃなくて、WindowsのDOSプロンプトとか、コマンドプロンプト内で使えるコマンドのことだと思います。

1) どんなコマンドが使えるか
Win9x,Me系: \windows\command のフォルダに主なコマンドがあります
Win2K,XP系: help で主なコマンドが出ます
どちらも管理系のコマンド等は別のところにあったりします。

unixでもmanコマンドでは「使えるコマンド一覧」はわかりません。網羅的に調べるには PATHにあるディレクトリをひとつずつ ls して調べるしかないです。Windowsでも同じで、PATHにあるディレクトリをひとつずつ調べるしかないのですが、GUIでしか使えないコマンドも混じっています。アイコンの絵がついているものはおおむねGUIですが、逆は真ではないので調べるのは難しいです。

上記の主なコマンド以外も含めたプロンプトで使えるコマンドを網羅的に知りたいなら書籍を見るのが早道でしょう。

2)unix の man 相当機能
上記主要コマンドについては、コマンド名 /? で使い方が出ますが、それ以外の管理系コマンドでは出ないことが多いです。Webか書籍で調べるしかないです。

Windowsカテゴリなので、MS-DOSのことじゃなくて、WindowsのDOSプロンプトとか、コマンドプロンプト内で使えるコマンドのことだと思います。

1) どんなコマンドが使えるか
Win9x,Me系: \windows\command のフォルダに主なコマンドがあります
Win2K,XP系: help で主なコマンドが出ます
どちらも管理系のコマンド等は別のところにあったりします。

unixでもmanコマンドでは「使えるコマンド一覧」はわかりません。網羅的に調べるには PATHにあるディレクトリをひとつずつ ls して調べるしかないです。Win...続きを読む

Qbash:あるプロセスをkillするスクリプト

こんにちは。
RedHat9を使っています。
bashシェルで、コマンドの実行結果を変数にわたすには、どうしたらいいですか?

mpg123でmp3を聞いています。
ターミナルからCtrl+Cを2回入力するのではなしに、スクリプトを走らせるだけで実行をとめたいです。

ps -A | grep 'mpg123'
の実行結果を変数に入れて、killコマンドの引数にその変数をわたせばいいんじゃないかと思ったんですが。

すみません、よろしくおねがいします。

Aベストアンサー

``で括って代入するだけです。

proc=`ps -A | grep 'mpg123'`

#2の方法だとmpg123が起動していなかったり複数起動していると問題が起こります。

proc=`ps -A | grep 'mpg123'`
for name in $proc
do
kill $name
done;

の方が安全ですね。

for name in `ps -A | grep 'mpg123'`
もちろんオッケーです。

Qコマンドプロンプトを使ってネットワークの一覧を表示

コマンドプロンプトを使ってネットワークの一覧を表示する方法
LAN内のPCやプリンタ、ネットワーク機器のIPアドレスを
調べて一覧にするコマンドプロンプトのコマンドはありませんか?
固定IPかDHCPから割り振られたIPか、わかると更に嬉しいです。

なければそういった機能があるソフトでもいいので
ご紹介頂けると幸いです。

Aベストアンサー

こちら参考に
★lan内のpcをipアドレスで一覧表示したい | OKWave
http://oshiete.goo.ne.jp/qa/5829669.html

Qunix、solarisでいうプロセスサイズってなに??

タイトルどおりなんですが、、というかUNIXやsolarisだけじゃないかもしれませんが、
「プロセスサイズ」というのはなんなのでしょうか?メモリの使用領域とかとはまた違うのでしょうか?

Aベストアンサー

「メモリの使用領域」と思っていいんじゃないでしょうか。
ヒープ領域を消費していくとその分だけプロセスサイズは増大し、
また仮想記憶でページアウト、スラッシングが起こるとディスクに退避された分だけ
プロセスサイズは減少します。

Qls コマンドで *.jpg と *.JPG の画像一覧を出したい

ls コマンドいっぱつで、
*.jpg または *.JPG の画像一覧を出したいのですが
どう引数を指定したらよいでしょうか..??

Aベストアンサー

ls *.[jJ][pP][gG]

でどうですか?

QUNIXの強制終了

非常につまらない質問なのですがよろしくお願いします
現在SUNのマシンにSolarisが入っているテスト環境で
UNIXの勉強中なのですがフロッピーを開いてから
フリーズしてしまいました
マウスのポインタは動くのですがクリックイベントを拾ってもらえません
UNIXにはWindowsにあるタスクマネージャのような機能はないのでしょうか
ちなみにスタンドアローンの環境なので他のユーザとの絡みはありません
よろしくお願いします

Aベストアンサー

こんにちは. Esnaです.
terra5さんがおっしゃるとおりpsコマンドとkillコマンドで停止させるのが一番よい方法と思います.
他の方法での最後の手段として,フリーズしたときに再起動をかける方法としては,
SUNのマシンならば,キーボードにstopキーがあると思うので,
stop-A
でokプロンプトにした後に,
ok>reboot
で再起動がかけられます.ちなみにシャットダウンは,
ok>power-off
です.

Qコマンドプロンプトの操作一覧

コマンドプロンプトでできる操作一覧のようなサイト、もしくは書籍を探しています。

たとえば、ipconfig /renew でIPアドレス再取得 …など

今一番知りたいのは、回線速度が安定して通信できているかを
先日、業者さんがきて、PCでやってたのが知りたいのですが
こんごもいろいろ調べて行きたいので
わかりやすい一覧のサイトがあればと思います。
よろしくお願いいたします。

Aベストアンサー

業者さんがカッコよく仕事してる姿見てると
ホント、惚れますよね~~(笑)

んでまあ、つい最近の記事(これから追加されていく)なんですけど、
ネットワーク関係ならこのへん読むといいかもですね~。

で、IT Proなんですけど、ひじょーに為になるのでぜひブックマーク
しておいてください。毎日読んでると結構勉強になりますよ~~。


っちゅうわけで、以上な感じで。


*****************************************

ネットワーク・コマンド道場

目次

日経NETWORK

 ネットワーク技術者を目指す人なら,ぜひ身につけておきたい
コマンドの使い方を解説していきます。コマンドによって何ができ,
実行結果から何が読み取れるか,現場で役立つ実践的な知識
が身につきます。(2006年02月06日)

http://itpro.nikkeibp.co.jp/article/COLUMN/20060125/227900/

↑ネットワーク技術者を目指してなくても、読んだら面白い…
と思うよ。はい。


結果を読めなきゃ意味ないから、全部読んでね☆

業者さんがカッコよく仕事してる姿見てると
ホント、惚れますよね~~(笑)

んでまあ、つい最近の記事(これから追加されていく)なんですけど、
ネットワーク関係ならこのへん読むといいかもですね~。

で、IT Proなんですけど、ひじょーに為になるのでぜひブックマーク
しておいてください。毎日読んでると結構勉強になりますよ~~。


っちゅうわけで、以上な感じで。


*****************************************

ネットワーク・コマンド道場

目次

日経NETWORK

 ネットワーク...続きを読む

Qグーグルクローム 強制終了しました

今日 フリー素材(Zip)をDLしたあと、
Google Chromeを使用し10分ほど開いたタブを放置していると、
「強制終了しました」と紫色の画面中央にメッセージが出てきます。

他には「メモリが不足しているかウェブページのプロセスが何らかの原因で強制終了しました。
続行するには、ページを再読み込みするか別のページに移動してください。」と出ます。

※念のため、フリーのセキュリティソフトでフルスキャンしたら、
悪意あるナンチャラが見つかり削除しました。

以下スペックです。
Win8
メモリ 16GB 
64bit
i7-3770
Cドライブ容量 1.52TB/1.80TB
Dドライブ容量 1.18TB/1.81TB
Google Chrome 製品Ver. 39.0.2171.99
です。

何とかして強制終了~のメッセージを表示できなくしたいです。
メモリは空いてますし、CPU使用量も常に5%以下です。
何か足りない情報があれば載せますので、
どうかお力を貸して頂けないでしょうか。
よろしくお願いします。

Aベストアンサー

>製品Ver. 39.0.2171.99

ver.40.0.2214.91 mに更新アップされていますが、一旦、削除して、入れなおしても同じですか?


このQ&Aを見た人がよく見るQ&A

人気Q&Aランキング

おすすめ情報