なぜ私たちは常にkill -9を使うのですか?

なぜ私たちは常にkill -9を使うのですか?

キルステップについて知りたいです。私たちは常にkill -9他の番号の代わりにこの番号を使用します。誰でも理由を説明できますか?

答え1

私は実際にボブの答えが好きです。

私が使用する信号は次のとおりです。

  • -1-HUP) - プロセスを再開します。
  • -2( -INT) - プロセス終了
  • -9-KILL) - カーネルにプロセスを終了するように指示します。
  • -11-SEGV) - プログラムが深刻にクラッシュします。
  • -15( -TERM) - 基本的にプログラムを終了してください。

信号終了は送信されません-15-TERM)。

上記のすべてのシグナル名はSIGプレフィックス(たとえば-SIGKILL)で指定できますが、これはオプションです。

分割エラーが原因でプログラムが強制終了されることに注意してくださいkill -11。時にはこの方法を使用しますが、kill -9プロセスは終了しません。 (発行中kill -9またはkill -11進行中の場合、データが失われる可能性がありますのでご注意ください!)

ps -ef | grep <program>プロセスを確認するために使用されます。親プロセスがPID 1のプロセスを削除するには、kill -HUP 1またはkill -1 1(両方ともルートとして)を使用する必要があります。 PID 1はあなたのものです。システム初期化

したがって、プロセスを終了するにはkill <pid>(正確に同じkill -15 <pid>)実行し、失敗した場合は別のことを試みます(データが失われる可能性があります!)。kill -2 <pid>(実行に似ていますCtrl+c)失敗すると、kill -9 <pid>失敗kill -11 <pid>するとプロセスが実行されます。最もゾンビのプロセスがある可能性があるため、ps -ef | grep <program_name>使用する場合はps -ef | grep <pid>プロセスの後に「期限切れ」に言及する必要があります。を発行する時ですkill -1 1

一部のプログラム (Java JVM など) は、シグナルの受信時に (トラブルシューティングのため) スレッド/ヒープをダンプするように構成できます。このような場合でもkillを使用してください。

答え2

最初は、killコマンド/システムコールがプロセスを終了します。これはカーネルによって行われ、プロセスは消え、何も通知されません。私の考えには、これが3版ごろで止まったようです。 Kill -9は、プロセスに9回信号を送信することを意味します。ほとんどの(すべて?状況によって異なります)他の信号とは異なり、プロセスは「キャプチャ」できず、どのような方法でも処理できません。プロセスを停止するより良い方法はkill -15(またはkill -TERM)です。これはプロセスが終了していることを知らせますが、クリーンアップを実行する機会を提供します。

kill -9を使用することは、プロセスを終了する「保証された」方法です。詰まった場合、kill -15 が常に動作していない可能性があります。したがって、多くの人はまだkill -9を「最初の手段」として使用しています。

「最終」キルシグナルが数字9である理由は、まさに彼らがする方法です。当時は少なくとも8つの異なる信号があり、その数はカーネルの対応する部分をプログラムした人(おそらくKen Thompson)が割り当てたものと推測されます。より低い数字のいくつかは、PDP-11ハードウェアのハードウェアコマンドおよび/またはイベントにマッピングされているため、これはほとんど過去のことです。そして他にもたくさんあります以上9.

実際の数字にはレベルや階層はありません。信号8は、信号9よりも「小さい」、または信号7よりも「大きい」ではありません。

答え3

うーん…人ごとにプログラミングスタイルが違うと思います。個人的には頑張ります。避けるkill -9殺すことができるプロセスを実行することは許可されていないため、ゾンビプロセスを作成する傾向があるため、可能であれば送信してください。どのユーザーが終了したいプログラムに存在する場合と存在しない可能性があるタスクをクリーンアップします。

これは「最後の手段」信号なのでまれですが、最初の選択言い換えれば、「常に動作する」ので、一般的に使用されるプログラム(特に誤って書かれたプログラムで)を終了する方法です。

プロセスがまたはをSIGINT無視すると、SIGTERM次のようになります。しなければならないこれが一つの理由です。プロセスが終了する前にロックファイルを解放し、いくつかの一時ファイルを削除し、他の「クリーンアップ」操作を実行する必要があるかもしれません。もちろん、プログラムは間違いを犯すので、SIGKILLこれらの(珍しいことを望む)シナリオが必ず必要です。

実際、適切な唯一の使用 SIGKILLは、プロセスが何らかの理由で誤動作し、正しく終了しない場合、またはユーザーが他の理由でプロセスをすぐに終了する必要がある場合(たとえば、誤ってトロイの木馬を実行してパニックに陥った場合)です。プログラムを迅速かつ完全に終了したい)

よく見る理由は、これがカーネルの唯一のシグナルだからです。できない無視する。シェルでtrapコマンドを実行して直接確認できますが、これはそのコマンドが実行する操作の良い説明を提供しますkill -9

宇宙からの信号9号

キャプチャできないシグナルがあります:SIGKILLまたはシグナル9.カーネルはこのシグナルを送信するすべてのプロセスを即座に終了し、シグナル処理を実行しません。中断、中断、またはその他の問題があるプログラムは常に終了するので、何かを停止して実行する必要があるときにこれが簡単な方法だと思いやすいです。通常、SIGKILL シグナルを送信する次のコマンドへの参照が表示されます。 kill -9

しかし、単純に見えますが、この信号を送信するときにアプリケーションは何もしません。通常、これは問題ありませんが、多くのプログラムではそうではありません。特に、多くの複雑なプログラム(および一部のあまり複雑ではないプログラム)は、プログラムの複数のコピーが同時に実行されるのを防ぐためにロックファイルを作成します。ロックされたファイルを使用するプログラムにSIGKILLを送信すると、ロックされたファイルを削除する機会もなく終了します。ロックファイルが存在する場合、ロックファイルを手動で削除するまでプログラムは再起動されません。

警告を受けます。最後の手段としてSIGKILLを使用してください。

源泉

答え4

私がこの投稿が好きなのは、私が現場で父親(80年代初頭)を助け、古いBurroughs / Unisysシステムの仕事をしていた時代を思い出させるからです。殺す(様々な理由で)少し進化しました。

最初に答えてくれた@thecarpyとBobに感謝します。

第二に、殺すUnix/Unixシリーズシステム(またはシェル)の実装によっては、異なる意味を持つことができます。最初は、殺すユーザーがメモリからアクティブプロセスを削除できるようにするモジュールベース/モノリシックベースのカーネルへの直接のシステムコール。要点は、このコマンドがカーネルスペース(ring0)、ring3(ユーザースペース)、またはより高いレベルのユーザーが古いメイン/ミッドフレームシステムリソースを吸い込む貪欲な/ランアウェイプロセスを破壊する手段であることです。

3. 全体的な目的殺すPIDにプロセスごと/ターミナル別/ランレベル別に送信されるSIGKILLへのハンドルがあることを確認することです。

Unixシリーズシステムでは、キル-9IMHOはゾンビプロセスを残す可能性があるため、あまりにも頻繁に使用されます。これは、分岐、パイプライニング、初期PID /プロセス生成子などに基づいて、上位->下位PID関係などの他の理由によるものです。

このコマンドは危険なほど便利ですが、関連するオプション(上記のように)と問題のあるPID(シェルスクリプトからコアデータベースプロセスまで)を理解するために最初に調査する必要があります。

ps-aef |

識別したら、kill -15を使用してゾンビプロセスやランアウェイプロセス(MySQLの初期など)を防止してシステムリソースを節約しますが、プロセスを送信するための正しいシグナルを知ることも重要です。https://en.wikipedia.org/wiki/Kill_(コマンド)

疑わしい場合はお試しください。削除mariadb/httpd や Kill -15 など、プロセス名を指定するために使用されるコマンドでプロセスをただちに終了します。

関連情報