2011-09-15 15 views
3

コマンドを実行してしばらくしてから強制終了させる最も良い方法は何ですか?ここに私が持っているものがあります。それは仕事をしますが、私はamp: command not foundを得て、なぜアンプが最初にそこにあるのか分かりませんが、殺しはそれなしでは機能しません。bashから子プロセスを開いて終了させる

feh "$output""$ext" & 
echo $! 
sleep 1 
kill -s 9 $! 
exit 1 

私が実行しているプロセスのPIDはわかりません。実行時に割り当てることができますか?

+1

おそらく、HTMLとして表示するために変換されたコードを見る必要があります。 '&'はHTMLに '&'として表示されます。 –

+0

なぜ '$!'を変数に入れるのですか?これにはどんな利点がありますか? – octosquidopus

+1

'$!'を変数に入れると、バックグラウンドで何か他のものを実行すると値を失うことはありません。 –

答えて

7

GNU timeout、coreutilsの最近のバージョンの一部は、まさにあなたが望むものです。

timeout 1 feh "$output""$ext" 

fehを1秒間実行し、それが終了していない場合は終了します。あなたが現在&を使用してバックグラウンドに入れfehを使用している

レシピ:

このコメントの残りの部分は、あなたの現在のレシピに関するものです。 amp;は間違いの後、いくつかの過激なHTMLエンコーダ(&はHTMLの&の綴りです)の可能性があります。

すべてのプロセスには、起動時にカーネルによってPIDが割り当てられます。 $!は、最近バックグラウンド処理されたプロセスのpidのシェル変数です。

+0

最近の正確な意味は? – octosquidopus

+2

'timeout'の最初の安定版リリースは、2009年にリリースされたcoreutils 7.1の中で、わかりました。 – daxelrod

+2

エレガントで直感的です!非常に良い答え。 +1。 – ztank1013

4

"& amp;"あなたはただ "&"がほしいと思うだけです。アンパサンドは、プロセスをバックグラウンドで実行するようbashに指示します。

$!バックグラウンドプロセスのpidに設定されています。そうでなければ、サンプルは必要な処理を行う必要があります。

4
feh "$output""$ext" & 
FEHPID=$! 
sleep 1 
kill -s 9 $FEHPID 
exit 1 
+0

これは最も一般的な解決方法です。メインスクリプト上で他の作業を行うことができます.Daxelrodのソリューションでは実行できません。私はちょうど 'kill -9' :-) –

+0

それは元のユーザーの投稿コードに基づいていた:) –

関連する問題