待って、待たないで

待って、待たないで

myprogram埋め込みファイルがある場合

sleep 200
date

バックグラウンドで次のコマンドを実行します。

$ sh myprogram &

myprogramコマンドの使用がいつ完了するかを知りたいです。wait

$ cat >notify
wait PID
echo "Program completed"
$ sh notify &

PID3番目のコマンドによって提供されたプロセスID。私の質問は、「Program Complete」メッセージが最後のコマンドの直後に端末に印刷されることです。なぜ待機しないのですか? 、Ubuntu 11.10を使用しています

答え1

親と子の関係は、関連するすべての「&」のために壊れます。

組み込み関数は、明らかに呼び出しプロセスの直接子PIDでのみ機能するこのwait(2)システム呼び出しに基づいています。waitwait(2)

を呼び出すと、対話型シェルの子として実行されますsh myprogram &sh

呼び出すと、対話型シェルの子になりますsh notify &sh

したがって、2番目の項目はsh最初の項目と直接の親関係がなく、機能しませんshwait

sh myprogram &; sh notify;このwaitコマンドは対話型シェルの子孫によって呼び出されるため、これらのいずれかを呼び出す場合は機能しません。

私にはうまくいきました:sh myprogram &; wait このwaitコマンドを使用すると、インタラクティブシェル(sh明示的に呼び出された親シェル)がsh終了するまで停止します。

答え2

waitこの特定の例では、Bruceの答えからわかるように、デフォルトシェルで実行する方が良いがこれを実行できない代替状況がある場合(たとえば、myprogramフォアグラウンドプロセスで実行する必要がある場合)、またはその場合は端末を制御するデーモンはありません。私が書いたプログラムを使うことができます待つすべてのプロセスが完了するまで待ちます。この例で使用するには、実行後

$ sh myprogram

myprogram以下を使用するnotify代わりに、プロセスIDを何らかの方法で取得できます。wait

pwait PID

pwait現在私のバージョンはLinux専用です。 FreeBSDを実行している場合は、彼らだけの悟り標準ユーティリティとして動作するようです。また、ps以下のようにコマンドが完了したことを再確認するためにも使用できます。このシェルスクリプト(該当する場合はコマンドの終了コードを教えてくれませんが)

関連情報