短い答え:送信SIGTERM
30秒後にSIGKILL
ます。つまり、送信しSIGTERM
て少し待ちます(プログラムによって異なる場合があります。システムの知識は豊富ですが、5〜30秒で十分です。マシンをシャットダウンすると、最大1分30秒待機することがあります。結局、なぜ急いでいるのですか?)、次に送信しますSIGKILL
。
合理的な回答:SIGTERM
、SIGINT
、SIGKILL
これは十分すぎるほどです。プロセスがします非常におそらく前に終了しますSIGKILL
。
ロング回答:SIGTERM
、SIGINT
、SIGQUIT
、SIGABRT
、SIGKILL
これは不要ですが、少なくともメッセージに関するプロセスを誤解させることはありません。これらのシグナルはすべて、プロセスが実行していることを停止して終了することを意味します。
この説明からどのような答えを選んだとしても、それを覚えておいてください!
他の何かを意味するシグナルを送信する場合、プロセスはそれを非常に異なる方法で処理する可能性があります(一方で)。一方、プロセスがシグナルを処理しない場合は、何を送信してもかまいません。とにかくプロセスは終了します(もちろん、デフォルトのアクションが終了する場合)。
したがって、プログラマーとして自分自身として考える必要があります。たとえば、SIGHUP
何かに接続するプログラムを終了するための関数ハンドラーをコーディングしますか、それともループして再接続を試みますか?それがここでの主な質問です!そのため、意図したことを意味する信号を送信することが重要です。
ほとんど愚かな長い答え:
次の表には、関連するシグナルと、プログラムがそれらを処理しない場合のデフォルトのアクションが含まれています。
本当にすべてを試す必要がある場合は、使用することを提案する順序で注文しました(BTW、ここではなく、合理的な回答を使用することをお勧めします)。彼らが引き起こすかもしれない破壊、しかしそれは完全に真実ではありません)。
アスタリスク(*)の付いた信号は推奨されません。これらについての重要なことは、それが何をするようにプログラムされているかを決して知らないかもしれないということです。特にSIGUSR
!それは黙示録を始めるかもしれません(それはプログラマーが彼/彼女が望むことを何でもするための無料の合図です!)。ただし、処理されない場合、またはまれに終了するように処理される場合、プログラムは終了します。
この表では、コアダンプを終了して生成するためのデフォルトのオプションを持つ信号は、最後のの直前に残されていSIGKILL
ます。
Signal Value Action Comment
----------------------------------------------------------------------
SIGTERM 15 Term Termination signal
SIGINT 2 Term Famous CONTROL+C interrupt from keyboard
SIGHUP 1 Term Disconnected terminal or parent died
SIGPIPE 13 Term Broken pipe
SIGALRM(*) 14 Term Timer signal from alarm
SIGUSR2(*) 12 Term User-defined signal 2
SIGUSR1(*) 10 Term User-defined signal 1
SIGQUIT 3 Core CONTRL+\ or quit from keyboard
SIGABRT 6 Core Abort signal from abort(3)
SIGSEGV 11 Core Invalid memory reference
SIGILL 4 Core Illegal Instruction
SIGFPE 8 Core Floating point exception
SIGKILL 9 Term Kill signal
それから私はこれをお勧めしますほとんど愚かな長い答え:
SIGTERM
、SIGINT
、SIGHUP
、SIGPIPE
、SIGQUIT
、SIGABRT
、SIGKILL
そして最後に、
間違いなく愚かな長い長い答え:
家でこれを試さないでください。
SIGTERM
、SIGINT
、SIGHUP
、SIGPIPE
、SIGALRM
、SIGUSR2
、SIGUSR1
、SIGQUIT
、SIGABRT
、SIGSEGV
、SIGILL
、SIGFPE
と、何も働いていない場合SIGKILL
。
SIGUSR2
SIGUSR1
プログラムがシグナルを処理しない方が良いので、前に試してみる必要があります。そしてSIGUSR1
、それらの1つだけを処理する場合、処理する可能性がはるかに高くなります。
ところで、キル:SIGKILL
他の答えが述べたように、プロセスに送信することは間違いではありません。さて、shutdown
コマンドを送信するとどうなるか考えてみてください。それは試しSIGTERM
てSIGKILL
みます。なぜそうだと思いますか?そして、shutdown
コマンド自体がこれら2つだけを使用するのに、なぜ他の信号が必要なのですか?
さて、長い答えに戻って、これは素晴らしいワンライナーです:
for SIG in 15 2 3 6 9 ; do echo $SIG ; echo kill -$SIG $PID || break ; sleep 30 ; done
信号の合間に30秒間スリープします。なぜ他にワンライナーが必要なのですか?;)
また、推奨:妥当な回答15 2 9
からのシグナルのみで試してください。
安全性:echo
行く準備ができたら秒を削除します。私はそれdry-run
をオンラインユーザーのために私のと呼んでいます。常にテストに使用してください。
巧みにスクリプト
実際、私はこの質問に非常に興味をそそられたので、それを行うための小さなスクリプトを作成することにしました。こちらからダウンロード(クローン)してください:
KillgracefullyリポジトリへのGitHubリンク