キンダー/ジェントラー/サブトラーに相当するkillallの代替品(例:「endall」)?


17

同じ名前のすべてのプロセスを、より穏やかな方法で終了するにはどうすればよいkillallですか?プロセスを中断したくありませんが、適切に終了する時間を残してください。


こちらもご覧ください:

Ubuntuでプロセスを強制終了するにはどうすればよいですか?

システムモニターで、Kill ProcessとEnd Processの違いは何ですか?

なぜkillall(時には?)を2回適用する必要があるのですか?

tl; dr


1
そしてあなたの質問は?
パイロット6

@ Pilot6の言い直し killallの「よりソフトな」代替手段は何ですか?
ナッツについてのナッツ

1
「ソフト」とは何ですか?
パイロット6

回答:


43

1. `killall`はすでに素晴らしい(SIGTERM)

killallデフォルトで送信しますSIGTERM。これはすでに、アプリケーションが自分でクリーンアップする機会を残す素晴らしいアプローチです。「今すぐ死ぬ!」アプローチはSIGKILLシグナルを送信することであり、これをオプションとして指定する必要がありますkillallGNU Cライブラリ:終結シグナル

マクロ:int SIGTERM

[...] プログラムの終了を丁寧に要求する通常の方法です。


2.システムモニターの「プロセスの終了」も同様に素晴らしい(SIGTERMも)

GNOMEシステムモニターに関する質問にリンクします。それはSIGTERMその「プロセスの終了」アクションにも使用します(そして、私はその質問に対する答えに矛盾していることに気付きます)。あなた自身を確認するためにソースコードでそれを見つけることができます:

data / menus.ui

<item>
  <attribute name="label" translatable="yes">_End</attribute>
  <attribute name="action">win.send-signal-end</attribute>
  <attribute name="accel">&lt;Primary&gt;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ず、最後の質問はリンクされた質問が行われる前のものでした。


7
ソースコードを参照するための+1!(「従来の知恵」と矛盾するために+2、それがあったように;)
ナッツについてのナッツ

さて、あなたは答えに矛盾していると述べる前に、ソースコードのすべてのバージョンが使用していることを確認しました15か?ある時点で変更されている可能性があるため、古い回答古いバージョンに対して100%正しい場合があります。
バクリウ

1
@Bakuriu私はどちらの方法でもその答えに矛盾しますが、公正な点、次回にできることを確認することを忘れないようにします。
hvd

ソースgitツリーの@Bakuriuは、git grep 'SIGQUIT'何も明らかにしません。git grep '>3<'どちらにも信号に関連するものは見つかりません。私は、おそらくgnome-system-monitorが使用しSIGQUITたことはないと結論付けています。
ルスラン

@Ruslan git grepは、履歴全体ではなく現在のツリーのみを検索します。私はgit blame(実際にはGithubに相当するものを)使ってもう少し詳しく調べましたが、それでも何もしませんでした。
hvd

5

@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 signalsignal()この方法での使用は移植性がないと見なされることに注意してください-ただし、他の方法よりもはるかに簡単です!

もう1つの小さな脚注-Solarisではkillall、すべてのプロセスを強制終了しようとします。それらのすべて。rootで実行すると驚くかもしれません:)


1
これは私が好む理由の1つですpkill。もう1つの理由は、それとペアpgrepになっていることです。これにより、どのプロセスが強制終了されるかを正確に確認しやすくなり、どのプロセス自体がのセマンティクスよりも一致しps | grepます。
Random832

1

「すべて終了」はになりますkillall -s SIGQUIT [process name]。おしゃれなソリューションが必要な場合は、を定義してくださいalias endall='killall -s SIGQUIT'


13
SIGQUITプロセスを作成するようなものabort(3)です。コアをダンプしてからプロセスを強制終了します。これは、のSIGTERMデフォルトよりも優れた/優雅/キンダーではありませんkillall
ルスラン

3
シグナルを処理するプロセスの場合SIGQUIT(またはSIGINTそれ以上)は、よりも「ソフト」に処理される場合がありますSIGTERMが、これはアプリケーション次第です。未処理の場合、それらのいずれかが即座に終了します。
R .. GitHub STOP HELPING ICE

1
ディスク全体のコアファイルをクリーンアップするのが好きな場合、これは素晴らしいアイデアです。
ネイト・エルドレッジ

2
@Qix:シグナルごとに異なることの1つは、デフォルトのアクションでコアファイルを作成するかどうか(アプリケーションで処理されない場合)です。コアファイルを生成しない信号を使用することをお勧めします。
R .. GitHub停止ヘルプICE

1
ubuntuはデフォルトでコアファイルサイズの制限を0に設定するため、制限を変更しない限り、SIGQUITは実際にコアファイルを作成しません(未処理の場合)。
ロジャーライト
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.