
myprogram
埋め込みファイルがある場合
sleep 200
date
バックグラウンドで次のコマンドを実行します。
$ sh myprogram &
myprogram
コマンドの使用がいつ完了するかを知りたいです。wait
$ cat >notify
wait PID
echo "Program completed"
$ sh notify &
PID
3番目のコマンドによって提供されたプロセスID。私の質問は、「Program Complete」メッセージが最後のコマンドの直後に端末に印刷されることです。なぜ待機しないのですか? 、Ubuntu 11.10を使用しています
答え1
親と子の関係は、関連するすべての「&」のために壊れます。
組み込み関数は、明らかに呼び出しプロセスの直接子PIDでのみ機能するこのwait(2)
システム呼び出しに基づいています。wait
wait(2)
を呼び出すと、対話型シェルの子として実行されますsh myprogram &
。sh
呼び出すと、対話型シェルの子になりますsh notify &
。sh
したがって、2番目の項目はsh
最初の項目と直接の親関係がなく、機能しませんsh
。wait
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
以下のようにコマンドが完了したことを再確認するためにも使用できます。このシェルスクリプト(該当する場合はコマンドの終了コードを教えてくれませんが)