kill
コマンドの-9(または
KILL
)引数は、どうしても必要な場合にのみPOSIX互換システムで使用してください。 なんで?
KILL
シグナルはプロセスで処理できません。 これは、プロセスが
kill -9
で完了した後、子プロセスがメモリ内に残って孤立し、ファイルシステムが一時ファイルで詰まり、共有メモリセグメントがアクティブになり、ソケットがフリーズし、 atexit関数(3 )はまったく実行されません。 その結果、予期せずデバッグが困難な問題のリスクがあります。
代わりに、デフォルトの
TERM
シグナルと
KILL
使用します-問題の少ないシグナルが無効な場合のみ:
$ kill 6738
$ kill -INT 6738
$ kill -HUP 6738
$ kill -KILL 6738
KILL
シグナルがプロセスの完了に失敗した場合でも、これはプロセスがI / O操作中にハングするか、他の何らかの不完全な状態にある可能性が高いことを意味します。 バグのあるネットワークドライブを再起動するか、強制的にアンマウントする必要がある場合があります。
問題のあるアプリケーションで作業する場合、デフォルトで
kill -KILL
を使用
kill -KILL
は許容されます。たとえば、Netscapeの古いバージョンは多くの場合、
KILL
シグナルのみで終了しました。 ただし、これはルールのまれな例外です
KILL
はこれらの有名なアプリケーションにのみ使用します。
プロセス完了の問題
異なる信号をシリアル送信すると、次の問題が発生する可能性があります。まず、プロセスが正常に完了するまでに数秒または数十秒かかる場合があります。 私が使用しなければならなかった製品の1つは、
TERM
シグナルを受信してから正常に完了するまでに30秒以上かかりました。 幸いなことに、この機能はテスト中に発見されたため、このケースに適したスクリプトが作成されました。 次に、古いプロセスが終了し、新しいプロセスが
TERM
シグナルと
KILL
シグナルの間にIDを取得する状況があります。 特に危険なのは、プロセスフローが増加したシステムや、OpenBSDなど、カーネルがPIDをランダムに割り当てるシステムです。 新しいプロセスは同じ親のフォークであり、同じ名前を持つことができるため、プロセス名またはそのPPIDを確認することは必ずしも役立ちません。したがって、特に偏執的なスクリプトは、シグナルを送信する前にプロセス作成時間または他のメタデータを確認することもできます。 おそらくこれらの状況はめったに発生しませんが、重要なプロセスに対処する必要がある場合は考慮すべきです。
プロセス終了信号
プロセス終了シグナルは、名前またはシリアル番号で示すことができます
kill -1
と
kill -HUP
同等です。 ただし、信号名を使用する方が安全です。-1を指定すると、別のプロセスまたはプロセスのグループに信号を送信することで簡単に封印できるためです。 また、スクリプトで名前を使用するようにしてください。これは、コードを読む人に送信される信号の種類をよりよく理解するのに役立ちます。
HUP
シグナルはシェルを「ハングアップ」するため、これは入力を待ってハングしたシェルをクリアしたり、SSHセッションを閉じたりするのに適した方法です。
プロセス終了シグナルの詳細については、 kill(1)のマニュアルページを参照してください
kill -l
は、オペレーティングシステムでサポートされているシグナルをリストします。 kill(2)は、システムコールを詳細に説明します。 詳細については、「4.4 BSDオペレーティングシステムの設計と実装」または「 UNIX Internals:The New Frontiers」を参照してください 。