PIDが終了したら実行中であることが知られているPIDを終了するには?

PIDが終了したら実行中であることが知られているPIDを終了するには?

バイナリパスを渡し、すべてのアプリがバックグラウンドで実行される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とトラップの配列のリストを保持し、トラップハンドラはすべての子プロセスを終了します。

関連情報