hadoopクラスタにkafkaマシンがあります。
Kafkaプロセスを停止するスクリプトは、次のタスクを実行します。
PID終了
しかし、私たちはkafkaを停止するスクリプトが実際にプロセスを終了しないことを確認しました。
だから私たちは次のように(手動で)それを殺しました:
キル-9 PID
したがって、この場合、プロセスは-9で終了する必要があると主張します(PIDのみを終了する代わりに)。
スクリプトの例
function kafkaKill {
local localPID=$1
kill $localPID || return 1
for ((i=0; i<MAX_WAIT_TIME; i++)); do
kafkaIsRunning $localPID
if [ $? -eq 0 ]; then return 0; fi
sleep 1
done
kill -s KILL $localPID || return 1
for ((i=0; i<MAX_WAIT_TIME; i++)); do
kafkaIsRunning $localPID
if [ $? -eq 0 ]; then return 0; fi
sleep 1
done
return 1
}
ベストアンサー1
デフォルトでは、プロセスに標準出口を送信すると(Wikipediaに従って)、SIGTERMが送信されます。その目的は、プロセスを終了する必要があることを知らせることです。プロセスにアクセスする良い方法は次のとおりです。
- プロセスレジスタSIGTERMの信号ハンドラ
- このプロセスを終了しますか?
- killを介してSIGTERMを送信します。
- シグナルハンドラが呼び出され、これはプロセスの機会です。
- 開いているファイルを閉じる
- すべてのバッファ書き込み
- すべてのサブスレッドを閉じます。
SIGTERM を送信してもプロセスは強制終了しません。完全に無視することも、必要なものは何でもできます。
Kill -9 は SIGKILL を送信します。 SIGKILLのハンドラを登録できません。これはデフォルトのハンドラが呼び出されることを意味します(私が考えているカーネルスペース - ここで誰かを修正してください)。この場合、上記のタスクを実行する機会はなく、実行可能なプロセスのリストからそのプロセスがすぐに削除され、そのメモリとその内容がすべて削除されます。ファイルに書き込むと、明らかに問題が発生する可能性があります。
いくつかのプロセスは、終了する前に複数のSIGTERM信号を受け入れます。これを試してみましたか?プロセスは、プロセスを完全に終了するために送信できる信号を記録することもできます。
間違った状態のプロセスは、シグナルハンドラを登録してもシグナルハンドラにアクセスできません。信号を受信できない点があります(停電状態、すでに他の信号を処理している、または現在では確認できない他の信号もあります)。何らかの理由でプロセスが中断されると、SIGTERM ハンドラは転送回数に関係なく絶対に実行されません。ここで唯一の解決策はSIGKILLですが、このシグナルが無視され、システムの再起動が必要な場合もありました。
実際の答え
あなたの質問に答えるには - どのような状況で無視し、-9で殺すと主張しますか?
- プロセスがプロセスを明示的に終了しないSIGTERMハンドラを登録しました(注 - デフォルトのSIGTERMはプロセスを終了します)。
- プロセスがシグナルブロック状態に停止し、SIGTERM ハンドラを実行できません。