PID をファイルに書き込み、次のようにアプリを起動します。
pidFile=...
( app ; rm $pidFile ; ) &
pid=$!
echo $pid > $pidFile
( sleep 60 ; if [[ -e $pidFile ]]; then killChildrenOf $pid ; fi ; ) &
killerPid=$!
wait $pid
kill $killerPid
これにより、タイムアウトのためにスリープし、それまでに完了していない場合はプロセスを強制終了する別のプロセスが作成されます。
プロセスがより速く完了すると、PID ファイルが削除され、キラー プロセスが終了します。
killChildrenOf
すべてのプロセスをフェッチし、特定の PID のすべての子プロセスを強制終了するスクリプトです。この機能を実装するさまざまな方法については、この質問の回答を参照してください:すべての子プロセスを強制終了する最良の方法
BASH の外に出たい場合は、PID とタイムアウトをディレクトリに書き込んで、そのディレクトリを監視できます。約 1 分ごとにエントリを読み、どのプロセスがまだ残っているか、タイムアウトになっているかどうかを確認します。
編集プロセスが正常に終了したかどうかを知りたい場合は、使用できますkill -0 $pid
EDIT2または、プロセスグループを試すことができます。kevinarpeは次のように述べています: PID(146322) の PGID を取得するには:
ps -fjww -p 146322 | tail -n 1 | awk '{ print $4 }'
私の場合: 145974. 次に、PGID を kill の特別なオプションと共に使用して、グループ内のすべてのプロセスを終了できます。kill -- -145974