環境:
ユーザーは、実行するカスタムスクリプトを提供します。これらのスクリプトは、複数のGUIプログラム、バックエンドサービスを開始するためのスクリプトに似たものにすることができます。スクリプトの記述方法を制御できません。これらのスクリプトはブロッキングタイプにすることができます。つまり、すべての子プロセス(順次実行されるプログラム)が終了するまで実行が待機します。
#exaple of blocking script
echo "START"
first_program
second_program
echo "DONE"
または非ブロッキングタイプ、つまり、バックグラウンドで子プロセスをフォークし、次のようなものを終了するタイプ
#example of non-blocking script
echo "START"
first_program &
second_program &
echo "DONE"
私は何を達成しようとしていますか?
ユーザー提供のスクリプトは、上記の2つのタイプのいずれか、または両方の組み合わせにすることができます。私の仕事は、スクリプトを実行し、スクリプトによって開始されたすべてのプロセスが終了するまで待機してから、ノードをシャットダウンすることです。ブロッキングタイプの場合、ケースは非常に単純です。つまり、スクリプト実行プロセスのPIDを取得し、ps -ef | grep -ef PIDにエントリがなくなるまで待機します。非ブロッキングスクリプトは私に問題を与えるものです
スクリプトの実行によって生成されたすべての子プロセスのPIDのリストを取得する方法はありますか?ポインタやヒントは高く評価されます
grep
だけで、ps –udummy_user
。また、プロセスグループも確認してください。
ps
引数なしで使用することで、このシェルから生成されたすべてのプロセスを一覧表示できます(最初のみbash
にps
してください)。そこでスクリプトを開始します。完了したら、ps | wc -l
期待値に達するまで待ちます。
pid$(foo.sh; echo $!)
場合は、PIDを提供するようなものでそれらをラップしてfoo.sh
、を使用できるようにすることができますps --ppid
。うまくいきますか?