2010-12-01 43 views
3

私が使用している特定のアプリケーションでは奇妙な動作に陥っています。私はbashでコマンドをバックグラウンドで起動した場合、私はスクリプトにこれを投げるとき、しかしスクリプトでのプロセスの強制終了

$ command & 
$ kill -n 2 [PID of command] 
    killing command gracefully 

使用してそれを殺すことができます。

command & 
ID=$! 
kill -n 2 $ID 

それはまったく何もしません。微妙なところがありますか?

編集:もう一つの手掛かりは、スクリプトの実行が停止すると、私はあなたがターミナルに出力を命じる場合は-n 2.

+0

'ID = command&'はあなたの考えをしません。 – nmichaels

+0

申し訳ありませんが、私のコードの要約で怠惰になっています。編集されました。 – victor

+0

kill -9を使用しない理由$ PID – chemila

答えて

0

を殺す使用してコマンドを殺すことができないということです、bashはその意志、SIGSTOPでそれを停止します送信しているSIGINTを無視するようにしてください。

+0

$ IDをエコーすると、正しいPIDが出力されます。 – victor

0

$ IDはコマンド文字列に一致し、必要なものはPIDです。たぶんこれを試してみてください:

ID=`pidof -s command` 
kill -9 $ID 
+0

$ IDをエコーすると、正しいPIDが出力されます。 – victor

0

おそらく問題はありませんが、-nはbashの組み込みkillコマンドのオプションです。代わりに-NAMEを使用して、実際のコマンドでも機能するようにしてください。

0

対話モードでジョブ制御をサポートするシェルの中には、デフォルトでスクリプトでジョブ制御を有効にしないものがあります。 set -mはジョブ制御を有効にします。

0

killの直後にwaitコマンドを追加します。

0

スクリプトからコマンドを実行すると、いくつかの信号を処理/無視するようです。それにもかかわらず、あなたはまだSIGKILLは、(1)このようにプロセスを強制終了することができます

kill -n 1 $ID 
1

男7信号 あなたのプロセスに、INTを信号2を送信している、それはキーボードからの割り込みである、なぜ? 人々は信号1を送信すると言っています、なぜですか?

標準的な方法として、シグナル15、Termination sigalがあります。これはkillによって使用されるデフォルトです。

だから「

その後、場合にあなたのプロセスの実行サブプロセスは、あなただけの父を殺すためにしたくないが、あなたはそれらすべてを殺すので、使いたい「$ PIDを」殺す使う - $ PID "$ PID"の代わりに "$ PID"の代わりに、プロセスグループ全体を殺すことができますが、killはそのことを考えるでしょう。 "$ PID"はシグナル番号ですので、より正確でなければなりません。

kill -15 -"$PID" 

プログラムは、-9を殺す使用し、死にたくない場合 - "$ PID"

man 7 signal 
man kill 
関連する問題