回答:
一般に、kill
()の前(kill -s TERM
、またはほとんどのシステムkill -15
)を使用して()の前にターゲットプロセスにクリーンアップする機会を与える必要があります。(プロセスはキャッチすることも無視することもできませんが、キャッチできることはよくあります。)プロセスが実行中の処理を完了してクリーンアップする機会をプロセスに与えないと、破損したファイル(またはその他の状態)がその周囲に残る可能性があります再起動すると理解できなくなります。kill -9
kill -s KILL
SIGKILL
SIGTERM
strace
/ truss
、ltrace
およびgdb
一般的にスタックプロセスがスタックしている理由を見ているために良いアイデアです。(truss -u
Solarisでは特に役立ちます。ltrace
ライブラリ呼び出しの引数を使用できない形式で提示することがよくあります。)Solarisには便利な/proc
ツールもあり、その一部はLinuxに移植されています。(pstack
多くの場合便利です)。
kill -9
ラストリゾートターミネーターとして、ラストリゾートを重視しています。最終リゾートの前にそれを使用する管理者は、a)管理者であることをあまり理解しておらず、b)本番システムにいるべきではありません。
Randal Schwartzは、リストに「(x)の無駄な使用」を頻繁に投稿していました。そのような投稿の1つはでしたkill -9
。理由と従うべきレシピが含まれています。再構築されたバージョンを以下に示します。
(かなり憎悪)
ダメダメダメ。kill -9を使用しないでください。
プロセスにきれいな機会を与えません:
1)ソケット接続をシャットダウンする
2)一時ファイルをクリーンアップする
3)子供たちにそれがなくなることを知らせる
4)端末の特性をリセットする
などなど。
通常、15を送信し、1〜2秒間待機し、それが機能しない場合は2を送信し、それが機能しない場合は1を送信します。それが機能しない場合、プログラムの動作が悪いためバイナリを削除します!
kill -9を使用しないでください。植木鉢をきれいにするためだけにコンバインを出さないでください。
Usenetのもう1つの無駄な使用、
(。署名)
kill -9
電源ケーブルを引っ張ってシャットダウンするのと同じように、常に実行してもかまいません。それは反社会的であり、ある程度の回復を余儀なくされるかもしれませんが、それは機能するはずであり、せっかちな人のためのパワーツールです。
これは、プレーンキル(15)を最初に試みる人としてこれを言います。これは、プログラムに何らかのクリーンアップを行う機会を与えるからです。しかし、キル-9での不正行為についての苦情は受け付けません。
理由は、多くの顧客がプログラマーが好むことを好むが、好まないことをするからです。ランダムキル-9テストは適切かつ公正なテストシナリオであり、システムがそれを処理しない場合、システムが破損します。
kill -9
、プラグをやってのけるOKではないだけのよう。もちろん、選択の余地がない状況もありますが、これは最後の手段です。もちろん、電源ケーブルを引っ張ったりkill -9
、アプリケーションまたはOSが正しく再起動しないようにするなどの悪影響はありませんが、たわごとが発生し、推奨される方法(kill [-15]
)または通常のシャットダウンを使用すると、次の場合に発生する混乱を回避できますその方法でプログラムとOSを定期的に中断します。いずれにしても、コードの堅牢性に関係なく、データを失うリスクは常にあります。
kill -9は、食器洗い機に台所用品を投げるのとほぼ同じ方法で使用します。台所用品が食器洗い機によって台無しになった場合、私はそれを望みません。
同じことはほとんどのプログラム(データベースであっても)に当てはまります:物事がうまくいかずにそれらを殺すことができないなら、私はそれらを本当に使いたくありません。(そして、これらの非データベースのいずれかを使用して、データを保持していないふりをすることをお勧めする場合:まあ、あなたは何をしているのかを考え始める時だと思います)。
現実の世界では、なんらかの理由でいつでも物事がダウンする可能性があるためです。
人々はすべきクラッシュに耐性があるソフトウェアを書きます。特にサーバー上。物事が壊れたり、クラッシュしたりすることを想定したソフトウェアの設計方法を学ぶ必要があります。
デスクトップソフトウェアについても同じことが言えます。ブラウザをシャットダウンする場合、通常はAGESでシャットダウンします。ありません、何も私のブラウザが必要それは秒の最大のカップルよりも多くを取る必要があります行うには。シャットダウンするように要求すると、すぐにそれを行うことができます。うまくいかない場合は、kill -9を引き出して作成します。
他のすべての回答で言及されてkill -9
いないのは、プロセスが強制終了され、強制終了<defunct>
できない場合に、まったく機能しないケースです。
親がinitである<defunct>プロセスを強制終了するにはどうすればよいですか?
プロセスにとって何が機能しないのか、なぜプロセスが強制終了しないのか?
したがってkill -9
、<defunct>
プロセスの実行ps -ef
を試行してから、その親が何であるかを確認し、その親に対して-15
(TERM)または-2
(INT)および最後に-9
(KILL)を試行します。
後の編集と注意:プロセス、その親またはその子を強制終了するときは、ファイルを開いたり破損したり、接続が未完成になったりkill -9
、プロセスがどうなるかわからない限りデータベースを破損したりする可能性があるため、最後の手段としてのみ使用してください、そしてkillを実行する必要がある場合は、使用する前に上記で指定したシグナルを使用します-9 (KILL)
絶対にしないでください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シグナルをプロセスに送信するだけです。ハングしたプロセスで終わる可能性があります。
kill -9 1
ほとんどの大学では無視されます。kill -9
for を回避する必要はありませんがmount
、その中にポイントはありません。「プロセスの順序を逆にする」という意味がわかりません。kill -9
文句を言う機会を与えずにプロセスを停止(強制終了など)しますが、プロセスが割り込み不可能なシステムコールにある場合、強制終了はすぐには発生しません。でプロセスを強制終了するとkill -9
、ほとんどのリソースが解放されますが、すべてではありません。
強制的にプロセスを強制終了するのはスムーズな動きではありません:データが失われる可能性があり、設計が不十分なアプリは、再インストールなしでは修正できない微妙な方法で破壊される可能性があります。与えられた状況。そして何が危険にさらされるでしょうか。ユーザーは、プロセスが何であるか、何をするべきか、その制約(ディスクIOPS、rss / swap)を把握し、長時間実行されるプロセスにかかる時間を見積もることができます(ファイルコピー、 mp3再エンコード、メールの移行、バックアップ、[ここでお気に入りのタイムシンク]。)
さらに、SIGKILL
pid に送信しても、それを強制終了する保証はありません。システムコールでスタックしている場合、または既にゾンビ化さZ
れps
ている場合(in )、ゾンビ化が継続する可能性があります。これは、多くの場合、^ Zの長時間実行プロセスであり、bg
試行前に忘れてkill -9
います。単純なfg
方法では、stdin / stdoutに再接続し、おそらくプロセスのブロックを解除します。通常はその後、プロセスが終了します。他の場所または他の形式のカーネルデッドロックでスタックしている場合、プロセスを削除できるのは再起動のみです。(ゾンビプロセスはSIGKILL
、カーネルによって処理された後、既に死んでいます(ユーザーランドコードはそれ以上実行されません)。プロセスが終了しないのは、通常、カーネルの理由(syscallの終了を待つ「ブロック」に似ています)です。
また、プロセスとそのすべての子を強制終了する場合は、PID自体だけでなくkill
、否定されたPIDで呼び出す習慣を身に付けます。SIGHUP
、SIGPIPE
またはSIGINT
その他のシグナルがクリーンアップする保証はありません。クリーンアップするために、無視されたプロセスがたくさんある(雑種を覚えていますか?)のは面倒です。
ボーナスの悪:kill -9 -1
わずかにダメージが大きくなりますkill -9 1
(破棄された重要でないVMで何が起こるかを見たい場合を除き、rootとしてはしないでください)。
kill -9
普通に処理したくないのかによるとman 7 signal
:
シグナルSIGKILLおよびSIGSTOPは、キャッチ、ブロック、または無視できません。
つまり、これらの信号のいずれかを受信するアプリケーションは、それらを「キャッチ」してシャットダウン動作を行うことができません。
kill -9
プロセスで実行する前にすべきことプロセスにシグナルを送信する前に、次のことを確認する必要があります。
kill -9
プロセスにを送信すると、基本的にこのデータが失われます。この問題の自動化に役立つスクリプトを作成しました。
それはstackoverflowで非常によく似た質問の私の完全な回答2に基づいています。
ここですべての説明を読むことができます。要約するSIGTERM
とSIGKILL
、私はただお勧めします、そして、あるいはSIGTERM
、SIGINT
そしてSIGKILL
。ただし、完全な回答ではより多くのオプションを提供します。
killgitfullyに github リポジトリからダウンロード(クローン)してください1