新しく割り当てられたプロジェクトで、「シャットダウン」スクリプトである一連のスクリプトを見つけました。彼らはいくつかの基本的な検索を行い、Unixkill
コマンドを実行するだけです。この方法でプロセスをシャットダウンしてはならない理由はありますか? これにより、動的に割り当てられたメモリが適切に返されることが保証されますか? 他に悪影響はありますか?私は、これがプロセスを終了させる最後の手段であるという直感に基づいて操作してきました。
6 に答える
このkill
コマンドは、Unix プロセスにシグナルを送信します。そのシグナルはデフォルトで SIGTERM に設定されます。これは、プログラムを終了するための礼儀正しい要求です。
何らかの理由でプロセスが終了すると、Unix OSはそのメモリ割り当て、ファイル ハンドル、およびその他のリソースをクリーンアップします。クリーンアップされない唯一のリソースは、ファイルの内容や共有メモリ (System V IPC など) など、共有されるはずのリソースです。
多くのプログラムは、終了時に特別なクリーンアップを行う必要はなく、デフォルトの SIGTERM 動作を使用します。これは、OS にプロセスを停止させることです。
プログラムに特別な動作が必要な場合は、シグナル ハンドラーをインストールしてから、シグナルを処理する関数を実行できます。
9 番目の SIGKILL シグナルは悪ですが、必要でもあります。このシグナルがプロセス自体に到達することはなく、OS は単純にプロセスを停止します。これは、本当に、本当に必要な場合にのみ使用してください。これは、デッドロックに陥るマルチスレッド プログラムや、TERM シグナル ハンドラをインストールしたものの、終了プロセス中に失敗したプログラムで必要になることがよくあります。
killは、プログラムを終了するための丁寧な要求です。メモリをクリーンアップし、ハンドルを閉じたり、その他の機能を追加したりします。SIGTERM を送信します
kill -9は、オペレーティング システムにプロセスをつかみ、バーから投げ出すように指示します。明らかに、それは細かいことには関係ありませんが、すべてのメモリを再利用しますが、それを追跡するのはオペレーティング システムの責任であるためです。ただし、これは強制的なシャットダウンであるため、プログラムを再度実行しようとすると問題が発生する可能性があります (たとえば、.pid ファイルをクリーンアップしない)。
[wikipedia]( http://en.wikipedia.org/wiki/Kill_(Unix) も参照)
各プロセスは、独自の保護されたアドレス空間で実行され、プロセスが終了すると (プロセスが自発的に終了するか、外部シグナルによって強制終了されるかに関係なく)、そのアドレス空間は完全に再利用されます。そうです、そのメモリが適切に解放されていればすべてです。
プロセスによっては、次に実行しようとしたときに他の問題が発生する場合と発生しない場合があります。たとえば、予期せず強制終了された場合、いくつかのファイルが開いていて、一貫性のない状態のままになる可能性があります。(ファイルは自動的に閉じられますが、たとえば、一部のアプリケーション データの書き込みの途中である可能性があり、中断された場合、ファイルには不完全または矛盾したデータが含まれる可能性があります。)
通常、システムがシャットダウンするとき、すべてのプロセスにシグナル 15 (SIGTERM) が送信され、必要なクリーンアップ/シャットダウン アクションを実行できます。それからしばらくして、彼らはシグナル 9 (SIGKILL) を受け取り、反応する機会を与えずに即座に殺します。これにより、すべてのプロセスが自分でクリーンアップする機会が与えられ、すぐに応答しないプロセスは強制的に強制終了されます。
kill はデフォルトで終了シグナルを送信し、プロセスが正常に終了できるようにします。プロセスがタイムリーに終了しないと思われる場合、一部のスクリプトは kill -9 にフォールバックし、「準備完了かどうか」を強制的に終了します。
すべての場合において、動的メモリなどの OS 管理のものは返され、ファイルは閉じられます。しかし、アプリケーション レベルのものは -9 kill で整理されない場合があります。
kill -9
は最後の手段であり、 ではありませんkill
。
- はい、メモリが再利用されます (これは OS の責任です)
- プログラムは信号に応答することができますが、「正しいこと」を行うのは特定のプログラム次第です。
kill
プロセスにシグナルを送るだけです。プロセスは、シグナル (シグナル 9 を除く) をトラップし、コードを実行してシャットダウンを実行できます。アプリのシャットダウンは短時間であるはずですが、瞬時ではない場合があります。
いずれにせよ、プロセスが終了すると、オペレーティング システムは動的に割り当てられたメモリを再利用し、開いているファイル記述子やその他のリソースを閉じます。
たとえば、アプリが他の (まだ生きている) プロセスによっても保持されている共有メモリまたはソケットを保持している場合などです。