プロセスを-9で殺すべきではないのはいつですか?


401

私は走るのをいつもためらっていますがkill -9、他の管理者がほとんど定期的にそれをするのを見ます。

私はおそらく賢明な中間点があると考えているので:

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

7
良い関連SO回答
jw013

回答:


362

一般に、kill()の前(kill -s TERM、またはほとんどのシステムkill -15)を使用して()の前にターゲットプロセスにクリーンアップする機会を与える必要があります。(プロセスはキャッチすることも無視することもできませんが、キャッチできることはよくあります。)プロセスが実行中の処理を完了してクリーンアップする機会をプロセスに与えないと、破損したファイル(またはその他の状態)がその周囲に残る可能性があります再起動すると理解できなくなります。kill -9kill -s KILLSIGKILLSIGTERM

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


67
SIGKILLを送信する習慣を身に付けた場合、たとえば、あなたやあなたの会社にとって重要なデータベースを破損するようなプログラムに到達したとき、それを本当に後悔するからです。 kill -9ラストリゾートターミネーターとして、ラストリゾートを重視しています。最終リゾートの前にそれを使用する管理者は、a)管理者であることをあまり理解しておらず、b)本番システムにいるべきではありません。
アルセージュ

9
@Mikelそれを通過する別のこと、SIGINT / SIGTERMに応答しない場合、SIGQUITやSIGSEGVなどの信号でアプリを自分自身をクリーンアップするのが最善の場合もあります。たとえば、フルスクリーンの3Dアプリ、さらにはXorgです。SIGQUITを使用すると、何かをクリーンアップする機会がなくなりますが、それをだましてセグメント障害が発生したと考え、クリーンアップして終了する以外に選択肢がないと感じます。
ペンギン359

12
@Arcege -9で殺された場合にデータを破損するデータベースを使用することは、結局のところ使用する価値があるデータベースだと思いますか?iirc、mysql、bdb、pgなどは、-9で強制終了したときにすべて正常に動作します。
dhruvbird 14年

13
killall -9 java ftw
dmourati 14年

23
@dhruvbird:DBに防弾チョッキが装備されているはずだからといって、必要のない場合は撃たなければならないというわけではありません。アルセージが言うほど危険ではないというのは正しいかもしれませんが、彼の主張は依然として危険であり、最後の手段であるべきだと思います。
iconoclast 14年

228

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

(かなり憎悪)

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

プロセスにきれいな機会を与えません:

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

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

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

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

などなど。

通常、15を送信し、1〜2秒間待機し、それが機能しない場合は2を送信し、それが機能しない場合は1を送信します。それが機能しない場合、プログラムの動作が悪いためバイナリを削除します!

kill -9を使用しないでください。植木鉢をきれいにするためだけにコンバインを出さないでください。

Usenetのもう1つの無駄な使用、

(。署名)


12
プロセスが終了すると、オペレーティングシステムは開いているファイル記述子(ソケットを含む)を閉じませんか?
ブライアンゴードン14年

3
はい、そうです。ただし、クライアントが接続された状態でサーバープロセスを強制終了すると、クライアントはタイムアウト前にサーバーがなくなったことに気付かないでしょう。
ビョルンリンドクヴィスト14年

45
ああ、古い「それが何らかの形で不完全であれば、それを使うのは愚かだ」という議論です。
Timmmm 14年

3
または、問題のプロセスがあなたの会社の生産である場合に使用する愚かな
ウォーレンP 14年

3
プロセスが強制終了されると、ソケットはピアにRSTを送信します。この場合、プロセスはソケットでcloseまたはshutdownを呼び出すかのように、ソケットはFINを送信します。タイムアウトは必要ありません。タイムアウト状態は、電源が落とされた場合、またはネットワークケーブルが取り外された場合にのみ発生します。
ctrl-alt-delor

78

kill -9電源ケーブルを引っ張ってシャットダウンするのと同じように、常に実行してもかまいません。それは反社会的であり、ある程度の回復を余儀なくされるかもしれませんが、それは機能するはずであり、せっかちな人のためのパワーツールです。

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

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


2
「ランダムキル-9」をどのようにテストしますか?kill -9が得られたら、完了です。
カレルビレック14年

18
@Karel:システムが後で回復できるかどうかをテストし、SIGKILLの時点で処理されていた破損したトランザクションをクリーンアップします。
タデウシュA.カドウボウスキ14年

7
やってOKではありませんkill -9、プラグをやってのけるOKではないだけのよう。もちろん、選択の余地がない状況もありますが、これは最後の手段です。もちろん、電源ケーブルを引っ張ったりkill -9、アプリケーションまたはOSが正しく再起動しないようにするなどの悪影響はありませんが、たわごとが発生し、推奨される方法(kill [-15])または通常のシャットダウンを使用すると、次の場合に発生する混乱を回避できますその方法でプログラムとOSを定期的に中断します。いずれにしても、コードの堅牢性に関係なく、データを失うリスクは常にあります。
jlliagre 14年

7
Michaelが「OK」と言ったのは、プログラムがこのような状況に適切に対処し、再起動時に何らかのクリーンアップを実行できるようにすることだと思います。たとえば、乳母車からおもちゃを捨てて開始を拒否するのではなく、PIDファイルなどをクリーンアップします。
ゲリック14年

2
@gerryk確かにそうすべきですが、問題は、状況や環境がどうであれ、その答えを「-9を殺すためのライセンス」と考える人がいることです。それは無責任な態度です。
jlliagre 14年

39

kill -9は、食器洗い機に台所用品を投げるのとほぼ同じ方法で使用します。台所用品が食器洗い機によって台無しになった場合、私はそれを望みません。

同じことはほとんどのプログラム(データベースであっても)に当てはまります:物事がうまくいかずにそれらを殺すことができないなら、私はそれらを本当に使いたくありません。(そして、これらの非データベースのいずれかを使用して、データを保持していないふりをすることをお勧めする場合:まあ、あなたは何をしているのかを考え始める時だと思います)。

現実の世界では、なんらかの理由でいつでも物事がダウンする可能性があるためです。

人々はすべきクラッシュに耐性があるソフトウェアを書きます。特にサーバー上。物事が壊れたり、クラッシュしたりすることを想定したソフトウェアの設計方法を学ぶ必要があります。

デスクトップソフトウェアについても同じことが言えます。ブラウザをシャットダウンする場合、通常はAGESでシャットダウンします。ありません、何も私のブラウザが必要それは秒の最大のカップルよりも多くを取る必要があります行うには。シャットダウンするように要求すると、すぐにそれを行うことができます。うまくいかない場合は、kill -9を引き出して作成します。


4
そのような失敗に耐えられるようにプロセスを記述する必要があることに同意しますが、これを行うことは依然として悪い習慣だと思います。データベースは回復しますが、失礼な中断を検出し、再起動時に重大な回復チェックをトリガーする場合があります。また、プロセスが処理しているリクエストについてはどうですか?それらはすべて即座に切断され、クライアントにもバグが発生して失敗する可能性がありますか?
ダニエルジェームズブライアーズ

3
いつでも殺すことができないデータベースは、適切に信頼できるデータベースではありません。一貫性が必要な場合、これは非常に基本的な要件です。クライアントについては、接続が切断されたときに問題が発生し、データが破損した場合、それらの設計も不適切です。サービスの損失に対処する方法は、冗長性と自動フェイルオーバー/再試行戦略を使用することです。通常、ほとんどのシステムでは、回復を試みるよりも速く障害を起こす方が望ましいです。
borud 14

4
@borud完全に書かれたソフトウェアではないかもしれませんが、それは人々が常に使用するソフトウェアです。どのシステム管理者が、突然の混乱から常に正常に回復するまで、完全に記述されたソフトウェアを常に選択できるという贅沢を持っていますか?多くはありません。個人的には、シャットダウンスクリプトを使用し、これを介してプロセスを開始/停止します。シャットダウンスクリプト(プロセスに適切なシグナルを送る)に応答しない場合、-9を強制終了します。
スティーブセザー14

2
基本的なものの調理と、ツールに関するより複雑な料理の間に違いはありません。違いは料理人です。(あなたが調理するように多くの時間を費やす場合、私がそうであるようにしかし、あなたは堅牢性は、キッチンツールの最小要件であり、消費者に台所用品を販売するほとんどの人は素晴らしいツールから悪いのツールを知っているだろうことをことを実現します。)
borud

1
だから、あなたは人々が物事を適切に行うのが難しいので、だらしないように勧めますか?一時的な運用環境で実行されるソフトウェアがますます増えています。正しくシャットダウンされない場合にうるさいソフトウェアを作成すると、雇用主に開発者としてあなたを雇うよう説得するのに苦労するでしょう。
borud

10

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

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

プロセスにとって何が機能しないのか、なぜプロセスが強制終了しないのか?

したがってkill -9<defunct>プロセスの実行ps -efを試行してから、その親が何であるかを確認し、その親に対して-15(TERM)または-2(INT)および最後に-9(KILL)を試行します。

注: 何をps -efます

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


6

絶対にしないでください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シグナルをプロセスに送信するだけです。ハングしたプロセスで終わる可能性があります。


1
ダウン票は他の誰かでした。しかし、どのリソースがリリースされていませんか?プロセスが通常のクリーンアップを実行できないという意味ですか?ファイルロック、セマフォなどはどうですか?詳しく説明してもらえますか?
ミケル

SysV共有メモリとセマフォは、少なくともクリーンアップする必要があるようです。 archives.postgresql.org/pgsql-general/2006-10/msg01065.php
Mikel

8
この答えは、一部が混乱し、一部が間違っています。kill -9 1ほとんどの大学では無視されます。kill -9for を回避する必要はありませんがmount、その中にポイントはありません。「プロセスの順序を逆にする」という意味がわかりません。kill -9文句を言う機会を与えずにプロセスを停止(強制終了など)しますが、プロセスが割り込み不可能なシステムコールにある場合、強制終了はすぐには発生しません。でプロセスを強制終了するとkill -9、ほとんどのリソースが解放されますが、すべてではありません
ジル

5

強制的にプロセスを強制終了するのはスムーズな動きではありません:データが失われる可能性があり、設計が不十分なアプリは、再インストールなしでは修正できない微妙な方法で破壊される可能性があります。与えられた状況。そして何が危険にさらされるでしょうか。ユーザーは、プロセスが何であるか、何をするべきか、その制約(ディスクIOPS、rss / swap)を把握し、長時間実行されるプロセスにかかる時間を見積もることができます(ファイルコピー、 mp3再エンコード、メールの移行、バックアップ、[ここでお気に入りのタイムシンク]。)

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

また、プロセスとそのすべての子を強制終了する場合は、PID自体だけでなくkill否定されたPIDで呼び出す習慣を身に付けますSIGHUPSIGPIPEまたはSIGINTその他のシグナルがクリーンアップする保証はありません。クリーンアップするために、無視されたプロセスがたくさんある(雑種を覚えていますか?)のは面倒です。

ボーナスの悪:kill -9 -1わずかにダメージが大きくなりますkill -9 1(破棄された重要でないVMで何が起こるかを見たい場合を除き、rootとしてはしないでください)。


3

どうしてkill -9普通に処理したくないのか

によるとman 7 signal

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

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

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

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

  1. プロセスがビジーでないことを確認します(つまり、「作業」を行っています)。kill -9プロセスにを送信すると、基本的にこのデータが失われます。
  2. プロセスが応答しないデータベースである場合、最初にキャッシュをフラッシュしたことを確認してください。一部のデータベースは、プロセスへのその他のシグナルの送信をサポートして、キャッシュのフラッシュを強制します。

3

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

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

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

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

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.