プロセスが死ぬまで殺すためのBashスニペット?


8

堅牢なbashスクリプトを記述しようとしています。その中で、バックグラウンドプロセスを作成します。スクリプトの最後に、私はそれを殺したいと思います。PIDがあります。

私はこのような何かを考えていました

while [[ ps ef $PID ]] ; do
  kill $PID
  sleep 0.5
done

より良い何かのための提案はありますか?このアプローチで考えられる問題はありますか?


もしかしてps -ef
user1686 2009

1
grawity:これはBSDスタイルとUNIXオプションの違いですが、efはUNIXオプションとの相性が良いようです。私は 'ps ao pid'を自分で使います
Kyle Brandt

while [[ ps ef $PID ]]構文エラーです。私はあなたが意味しwhile ps ef $PIDたと思います。
デニス

回答:


10

プロセスを繰り返し強制終了することの問題は、新しいプロセスの作成で競合状態が発生することです。特に可能性は低いですが、寝ている間にプロセスが終了し、新しいプロセスが同じPIDで起動する可能性があります。

なぜプロセスを繰り返し終了しなければならないのですか?プロセスが終了するためであるが、シグナルを受信して​​終了するまでに時間がかかる場合は、以下を使用できますwait

 kill $PID
 wait $PID

理想的なシステムでは、killまたは問題を繰り返す必要はありませんkill -9 $PID。必要がある場合は、実行しているものをすべて修正することを検討してください。そうする必要はありません。その間、おそらく競合状態にぶつかることはなく、プロセスを強制終了する直前に(たとえば)/ proc / $ PID /のタイムスタンプをチェックすることでそれを防ぐことができます。しかし、それは悪いハックです。


1
PIDが子プロセスに属していない場合、つまり、このスクリプトが他の場所で発生したプロセスの実行を制御しようとしている場合、これは機能しません。やってbash: wait: pid 32137 is not a child of this shellみるとゲット。:(
ジャスティンフォース

9

kill $PIDto からのステップをお勧めするすべての人にとってkill -9 $PID、私はkill -9の無用な使用を思い出さなければなりません。

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

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

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

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

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

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

などなど。

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

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

さて、「バイナリ部分を削除する」には同意しませんが、進行は単なるaよりも害が少ないようkill -9です。

また、ここで説明したものと同じPIDで新しいプロセスを作成する際の競合状態についての注意にも同意します


0

最初に通常のキルを行い、x秒のスリープを行い、それでもまだそれが残っている場合は-9をキルします。また、これはあなたが遭遇した奇妙な状況のように思われますが、より大きな問題を私たちに説明したいと思うかもしれません。


同意した。1つのSIGTERM(デフォルトではkillによって送信されるシグナル)の後で応答せず終了する場合、おそらく2番目、3番目、4番目などには応答しないため、次のアクションはSIGKILL(kill- 9)。もちろん、「スリープX秒」のXは、システムに大きな負荷がかかっている場合でも、プロセスが通常のデスクアンドリーブのクリア操作を実行できる十分な長さであることを確認する必要があります。通常は1秒ですが、システムがスラッシングしているときは数十秒です。
デビッドスピレット2009

0

通常kill $PID、最初に試したいのですが、

次に、少しスリープして、正常に終了するかどうかを確認します。

そうでない場合は、実行kill -9 $PIDして強制的に削除します。


-1

なぜか

kill -9 $PID


2
プロセスがクリーンアップして適切に終了する機会をプロセスに与えたいので、これがTERMシグナル(デフォルトのシグナル)が行うことです。KILLシグナル( "-9")はプロセスにそのチャンスを与えません。
ktower 2009

良い点ですが、元のポスターは彼がそれを殺したかっただけだと言っていました。
chris
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.