web-dev-qa-db-ja.com

プロセスを-9で強制終了すべきでないのはいつですか?

私は常にkill -9を実行するのを非常にためらっていますが、他の管理者がほぼ日常的に実行しているのを見ています。

私はおそらく賢明な中間点があると思いますので、

  1. いつ、なぜkill -9を使用する必要がありますか?いつ、なぜですか?
  2. それを行う前に何を試すべきですか?
  3. 「ハングした」プロセスをデバッグすると、さらに問題が発生する可能性があります。
405
Mikel

通常、kill -s TERMkill -15)の前にkillkill -9の省略形、またはほとんどのシステムではkill -s KILL)を使用して、ターゲットプロセスにチャンスを与える必要があります。後片付けをします。 (プロセスはSIGKILLをキャッチまたは無視することはできませんが、SIGTERMをキャッチすることができます。)プロセスが実行中の処理を完了してクリーンアップする機会をプロセスに与えない場合は、再起動すると理解できないほど壊れたファイル(または他の状態)が残る場合があります。

strace/trussltraceおよびgdbは、スタックしたプロセスがスタックしている理由を調べるための一般的な良いアイデアです。 (Solarisのtruss -uは特に便利です。ltraceは、ライブラリ呼び出しの引数を使用できない形式で提示することが多すぎると思います。)Solarisには、便利な/procベースのツールもあります。 Linuxに移植されました。 (pstackはしばしば役に立ちます)。

366
geekosaur

Randal Schwartzは、「(x)の無用な使用」をリストに頻繁に投稿していました。そのような投稿の1つは、約kill -9でした。理由と従うべきレシピが含まれています。 これは再構成されたバージョンです (以下に引用)。

(引用嫌悪)

ダメダメダメ。 kill -9は使用しないでください。

プロセスにクリーンな機会を与えるものではありません。

1)ソケット接続をシャットダウンする

2)一時ファイルをクリーンアップする

3)子供たちにそれがなくなることを知らせる

4)端末の特性をリセットする

などなど。

通常、15を送信し、1、2秒待ちます。それが機能しない場合は2を送信し、それが機能しない場合は1を送信します。それが機能しない場合は、プログラムが正しく動作しないため、バイナリを削除してください。

Kill -9は使用しないでください。植木鉢を片付けるためだけにコンバインを持ち出さないでください。

Usenetのもう1つの役に立たない使用法

(。署名)

230
Shawn J. Goff

常に問題はありませんkill -9、電源ケーブルを引っ張ってシャットダウンしても常に問題ないように。それは反社会的であり、ある程度の回復を任せるかもしれませんが、機能するはずであり、せっかちな人にとっては強力なツールです。

これは、プログラムに何らかのクリーンアップを実行する機会を与えるため、最初にプレーンキル(15)を試す人としてこれを言います。しかし、私は-9を倒したときの不正行為についての苦情は一切受け付けません。

その理由は、多くの顧客がプログラマーが好むであろうことを望まないことをするためです。ランダムキル-9テストは適切で公正なテストシナリオであり、システムがそれを処理しない場合、システムは壊れています。

77
dbrower

私はkill -9を、食器洗い機でキッチンの道具を投げるのとほとんど同じ方法で使用します。キッチンの道具が食器洗い機によって台無しになっていると、私はそれを望みません。

同じことがmostプログラム(データベースも含む)にも当てはまります。問題が発生しない限り、プログラムを強制終了できないのであれば、実際には使用したくありません。 (そして、これらの非データベースの1つを使用していて、永続化されていないデータを保持しているふりをするように促している場合:まあ、それはあなたが何をしているのかについて考え始める時だと思います)。

なぜなら、現実の世界では、何かがいつでも何らかの理由で停止する可能性があるからです。

すべきクラッシュに強いソフトウェアを書いてください。特にサーバーで。物事が壊れたり、クラッシュしたりすることを想定したソフトウェアの設計方法を学ぶ必要があります。

デスクトップソフトウェアについても同様です。ブラウザをシャットダウンする場合、通常はAGESをシャットダウンする必要があります。 nothing my browser needsがあり、それを実行するには多くても数秒以上かかるはずです。シャットダウンするように依頼すると、すぐにシャットダウンできるはずです。うまくいかない場合は、kill -9を実行して作成します。

39
borud

他のすべての回答で言及されていないのは、プロセスが_kill -9_であり、強制終了できないときに_<defunct>_がまったく機能しない場合です。

親がinitである<defunct>プロセスを強制終了するにはどうすればよいですか?

プロセスの機能停止とは何であり、なぜ殺されないのですか?

したがって、_kill -9_を試みる前に_<defunct>_プロセスを実行して_ps -ef_を実行し、彼の親が何であるかを確認し、_-15_(TERM)または_-2_(INT)および最後に、彼の親に対して_-9_(KILL)を使用します。

注:_ps -ef_が行うこと

後で編集して注意してください:プロセス、その親または子を強制終了するときは、ファイルを開いたままにしたり、破損したり、接続が未完了になり、破損する可能性があるため、注意して続行してくださいデータベースなどは、プロセスで_kill -9_が何をするかを知らない限り、最後の手段としてのみ使用します。killを実行する必要がある場合は、-9 (KILL)を使用する前に上記で指定した信号を使用してください。

10

決してしないkill -9 1。また、mountなどの特定のプロセスでkillを実行しないでください。多くのプロセスを強制終了する必要がある場合(たとえば、Xセッションがハングし、特定のユーザーのすべてのプロセスを強制終了する必要がある場合など)は、プロセスの順序を逆にします。例えば:

ps -ef|remove all processes not matching a certain criteria| awk '{print $2}'|Ruby -e '$A=stdin.readlines; A.reverse.each{|a| puts "kill -9 #{a}"}'|bash

killはプロセスを停止してそのリソースを解放しないことに注意してください。プロセスにSIGKILLシグナルを送信するだけです。ハングアップするプロセスが発生する可能性があります。

6
HandyGandy

プロセスを強制終了するのはスムーズではありません。データが失われる可能性があり、設計が不適切なアプリは、再インストールなしでは修正できない微妙な方法で壊れる可能性があります。しかし、それは、何が安全で何が安全でないかを知ることに完全に依存します。与えられた状況。そして何が危険にさらされるでしょう。ユーザーは、プロセスが何であるか、または何であるか、およびその制約が何であるか(ディスクIOPS、rss/swap)を理解し、長時間実行されるプロセスにかかる時間(ファイルコピーなど)を推定できる必要があります。 mp3再エンコード、メールの移行、バックアップ、[お気に入りのタイムシンクはこちら])

さらに、SIGKILLをpidに送信しても、強制終了される保証はありません。 syscallでスタックしている場合、またはすでにゾンビ化されている場合(Zps)、ゾンビ化され続ける可能性があります。多くの場合、これは^ Zの長時間実行プロセスであり、kill -9を実行する前にbgを忘れることです。単純なfgは、stdin/stdoutを再接続し、おそらくプロセスのブロックを解除します。通常は、その後プロセスが終了します。他の場所や他のカーネルデッドロックでスタックしている場合は、再起動だけでプロセスを削除できます。 (SIGKILLがカーネルによって処理された後、ゾンビプロセスは既に停止しています(ユーザーランドコードは実行されません)。通常、プロセスが終了しないのには、カーネルの理由(syscallの終了を待機する「ブロック」と同様)があります。

また、プロセスとそのすべての子を強制終了する場合は、killPID自体だけでなく、否定されたPIDで呼び出す習慣をつけます。 SIGHUPSIGPIPESIGINT、またはその他の信号がクリーンアップ後にクリーンアップされる保証はなく、大量の取り除かれたプロセスがクリーンアップすることを覚えておく必要があります(mongrelを覚えていますか?)。

ボーナス悪:kill -9 -1kill -9 1よりも少しダメージが大きい(使い捨てで重要でないVMで何が起こるかを確認したい場合を除いて、rootとして実行しないでください) =

5
dhchdhd

この問題の自動化に役立つスクリプトを作成しました。

stackoverflow で非常によく似た質問の私の完全な回答 2 に基づいています。

あなたはそこですべての説明を読むことができます。要約すると、SIGTERMSIGKILL、またはSIGTERMSIGINTSIGKILLをお勧めします。しかし、私は完全な答えでより多くのオプションを提供します。

Githubからダウンロード(クローン)してください リポジトリをkillgracefullyに1

3
Dr Beco

なぜあなたはしたくないのですかkill -9通常のプロセス

による man 7 signal

シグナルSIGKILLおよびSIGSTOPは、キャッチ、ブロック、または無視できません。

つまり、これらの信号のいずれかを受信するアプリケーションは、それらを「キャッチ」してシャットダウン動作を実行することはできません。

実行する前にすべきことkill -9プロセス上

プロセスにシグナルを送信する前に、次のことを確認する必要があります。

  1. プロセスがビジーでないことを確認してください(つまり、「仕事」をしている)。 kill -9 to the processは基本的にこのデータの損失をもたらします。
  2. プロセスが応答しないデータベースの場合は、最初にキャッシュをフラッシュしたことを確認してください。一部のデータベースは、プロセスに他のシグナルを送信して、キャッシュを強制的にフラッシュすることをサポートしています。
3
user26053