私のWeb開発ワークフローには、次の2つのプロセスがあります。
- フォルダの変更を監視しています
- ブラウザで自分のサイトをプレビューする
それらを実行し、後で両方を同時に停止できるようにしたいと思います。アンパサンド演算子の使用を提案している人を見てきました。
process_1 & process_2
しかし、押すCtrl + C
と2番目のものだけが停止します。私はkill
最初のものを手動でしなければなりません。このアプローチには何が欠けていますか?
私のWeb開発ワークフローには、次の2つのプロセスがあります。
それらを実行し、後で両方を同時に停止できるようにしたいと思います。アンパサンド演算子の使用を提案している人を見てきました。
process_1 & process_2
しかし、押すCtrl + C
と2番目のものだけが停止します。私はkill
最初のものを手動でしなければなりません。このアプローチには何が欠けていますか?
SIGINTに応答して、フォアグラウンドスクリプトでサブプロセスを明示的に強制終了することができます。
#!/bin/sh
trap 'kill $pid1 $pid2' 2
cmd1 &
pid1=$!
cmd2 &
pid2=$!
wait
この例には競合状態があります。割り当てられるSIGINT
前に親に送信すると、警告メッセージが送信され、どちらの子も終了しません。が割り当てられる前に送信した場合、実行中のプロセスのみにシグナルが送信されます。いずれの場合も、親は実行を継続し、1秒を送信できます。一部のバージョンでは、を使用してプロセスグループに信号を送信することでこの競合状態を回避できますが、すべてのバージョンがその使用法をサポートしているわけではありません。(いずれかの子プロセスがシグナルに応答して終了しない場合、親は終了せずに待機を継続することに注意してください。)pid1
kill
SIGINT
pid2
cmd1
SIGINT
kill
kill -$$
kill
2つのスクリプトを書いてみてください。1つには次のものが含まれています。
./process_1 &
./process_2 &
と2番目の
killall process_1
killall process_2
最初のスクリプトを実行して両方のプロセスを開始し、2番目のスクリプトを実行してプロセスを終了します。