同じ名前のすべてのプロセスを、より穏やかな方法で終了するにはどうすればよいkillall
ですか?プロセスを中断したくありませんが、適切に終了する時間を残してください。
こちらもご覧ください:
Ubuntuでプロセスを強制終了するにはどうすればよいですか?
システムモニターで、Kill ProcessとEnd Processの違いは何ですか?
同じ名前のすべてのプロセスを、より穏やかな方法で終了するにはどうすればよいkillall
ですか?プロセスを中断したくありませんが、適切に終了する時間を残してください。
こちらもご覧ください:
Ubuntuでプロセスを強制終了するにはどうすればよいですか?
システムモニターで、Kill ProcessとEnd Processの違いは何ですか?
回答:
killall
デフォルトで送信しますSIGTERM
。これはすでに、アプリケーションが自分でクリーンアップする機会を残す素晴らしいアプローチです。「今すぐ死ぬ!」アプローチはSIGKILL
シグナルを送信することであり、これをオプションとして指定する必要がありますkillall
。GNU Cライブラリ:終結シグナル:
マクロ:int SIGTERM
[...] プログラムの終了を丁寧に要求する通常の方法です。
GNOMEシステムモニターに関する質問にリンクします。それはSIGTERM
その「プロセスの終了」アクションにも使用します(そして、私はその質問に対する答えに矛盾していることに気付きます)。あなた自身を確認するためにソースコードでそれを見つけることができます:
<item>
<attribute name="label" translatable="yes">_End</attribute>
<attribute name="action">win.send-signal-end</attribute>
<attribute name="accel"><Primary>e</attribute>
<attribute name="target" type="i">15</attribute>
</item>
ここの15はシグナル番号です。信号15はSIGTERM
です。また、システムモニターはSIGTERM
、他の質問が出されて回答される前に使用されていました。
のGithub表現を見るとgit blame
、GNOMEシステムモニターのソースコードでの信号の表記方法に加えられた変更があります。
383007f2 GActionパラメータで信号を送信するために2013年7月24日に置き換え重複コードが
0e766b2d GActionに2013年7月18日ポートプロセスのポップアップメニューを
97674c79 ProcData構造を取り除く2012年10月3日に
38c5296cソースファイル間2011年7月3日メイクのインデントの制服。
これらはいずれもからSIGQUIT
に変更されておらSIGTERM
ず、最後の質問はリンクされた質問が行われる前のものでした。
15
か?ある時点で変更されている可能性があるため、古い回答は古いバージョンに対して100%正しい場合があります。
git grep 'SIGQUIT'
何も明らかにしません。git grep '>3<'
どちらにも信号に関連するものは見つかりません。私は、おそらくgnome-system-monitorが使用しSIGQUIT
たことはないと結論付けています。
git grep
は、履歴全体ではなく現在のツリーのみを検索します。私はgit blame
(実際にはGithubに相当するものを)使ってもう少し詳しく調べましたが、それでも何もしませんでした。
@hvdによる答えは基本的に正しいです。さらにバックアップするには、コンピューターをシャットダウンするときにinit
プロセスが最初SIGTERM
にプロセスに送信し、SIGKILL
まだ終了していない場合は遅延後に送信します。プロセスは処理/無視できませんSIGKILL
。
しかし、もう少し詳しく説明すると、本当の答えは、プログラムがそれを処理していることを確実に知る方法がないということです。SIGTERM
は、プログラムの終了を丁寧に要求するために使用する最も一般的なシグナルですが、すべてのシグナル処理は、プログラムがシグナルで何かを行うことに依存します。
別の言い方をすれば、他の回答に基づいて、@ Josまたは@AlexGregによって作成されたプログラムSIGQUIT
がある場合、おそらく処理されますが、処理されない可能性があるためSIGTERM
、送信SIGTERM
は「ソフト」よりも少なくなりSIGQUIT
ます。
あなたが自分でそれをいじることができるように、私はいくつかのコードを書きました。以下をとして保存し、signal-test.c
コンパイルして
gcc -o signal-test signal-test.c
それからそれを実行して./signal-test
、異なるシグナルを送ったときに何が起こるかを見ることができますkillall -s <signal>
。
#include <stdio.h>
#include <signal.h>
#include <unistd.h>
int flag = 0;
void handle_signal(int s)
{
flag = s;
}
int main(int argc, char *argv[])
{
signal(SIGTERM, handle_signal);
signal(SIGQUIT, handle_signal);
while(flag == 0){
sleep(1);
}
printf("flag is %d\n", flag);
return flag;
}
現状では、コードはSIGTERMとSIGQUITの両方を適切に処理します。行のコメントアウトを試してsignal(SIG...
(行//
の先頭でを使用)、シグナルハンドラーを削除してから、再度実行してシグナルを送信できます。これらの異なる出力を見ることができるはずです:
$ ./signal-test
Terminated
$ ./signal-test
Quit (core dumped)
$ ./signal-test
flag is 15
$ ./signal-test
flag is 3
信号を処理するかどうかによって異なります。
シグナルを無視してみることもできます:
signal(SIGTERM, SIG_IGN);
それを行うと、送信SIGTERM
は何もしなくなり、SIGKILL
プロセスを終了するために使用する必要があります。
詳細はをご覧くださいman 7 signal
。signal()
この方法での使用は移植性がないと見なされることに注意してください-ただし、他の方法よりもはるかに簡単です!
もう1つの小さな脚注-Solarisではkillall
、すべてのプロセスを強制終了しようとします。それらのすべて。rootで実行すると驚くかもしれません:)
pkill
。もう1つの理由は、それとペアpgrep
になっていることです。これにより、どのプロセスが強制終了されるかを正確に確認しやすくなり、どのプロセス自体がのセマンティクスよりも一致しps | grep
ます。
「すべて終了」はになりますkillall -s SIGQUIT [process name]
。おしゃれなソリューションが必要な場合は、を定義してくださいalias endall='killall -s SIGQUIT'
。
SIGQUIT
プロセスを作成するようなものabort(3)
です。コアをダンプしてからプロセスを強制終了します。これは、のSIGTERM
デフォルトよりも優れた/優雅/キンダーではありませんkillall
。
SIGQUIT
(またはSIGINT
それ以上)は、よりも「ソフト」に処理される場合がありますSIGTERM
が、これはアプリケーション次第です。未処理の場合、それらのいずれかが即座に終了します。