バイナリパスを渡し、すべてのアプリがバックグラウンドで実行されるscript.shがあります。
./script.sh path/to/app_1 path/to/app_2 ... path/to/app_n
スクリプトは次のとおりです。
#!/bin/bash
for app in "$@"
do
$app &
done
私のすべてのアプリケーションは期待どおりに実行されます。そのうちのいくつかはウィンドウなしのコンソールアプリケーションですが、一部はインターフェイスを持っていてウィンドウアプリケーションを閉じることができます。
次のようにアプリケーションのPIDを取得できます。
pgrep "${app##*/}"
script.bashを介してパラメータとして渡されたpidを使用してすべてのアプリケーションをどのように終了できますか?ウィンドウのいずれかを閉じると、既知の実行中のアプリケーションはすべて終了します。
答え1
これはうまくいきます。
declare -a _procid
_kill_them_all()
{
for p in ${_procid[@]} ; do
kill -9 $p 2>/dev/null
done
exit
}
trap _kill_them_all SIGCHLD
for app in "$@"
do
$app &
_procid+=($!)
done
wait ${_procid[@]}
echo "doesn't get here if there were children"
bashスクリプトは、子プロセスの終了時に子pidとトラップの配列のリストを保持し、トラップハンドラはすべての子プロセスを終了します。