次のスクリプトがあります。呼び方は./myscript.sh start
#!/bin/bash
if [[ "$1" == "start" ]]; then
echo "Dev start script process ID: $$"
cd /my/path1
yarn dev &> /my/path/logs/log1.log &
echo "started process1 in background"
echo "Process ID: $!"
echo "Logging output at logs/log1.log"
sleep 2
cd /my/path2
yarn start:dev &> /my/path/logs/log2.log &
echo "started process2 in background"
echo "Process ID: $!"
echo "Logging output at logs/log2.log"
sleep 2
cd /my/path2
yarn dev &> /my/path/logs/log3.log &
echo "started process3 in background"
echo "Process ID: $!"
echo "Logging output at logs/log3.log"
elif [[ "$1" == "stop" ]]; then
killList=`ps | grep node | awk '{print $1}'`
if [[ $killList != "" ]]; then
echo $killList | xargs kill
echo "Processes killed: $killList"
else
echo "Nothing to stop"
fi
else
echo "Invalid argument"
fi
このスクリプトを実行すると、コマンドps
によって開始されたと思われる複数のノードプロセス(3つ以上)を表示できますyarn dev
。./myscript.sh stop
以前の./myscript.sh start実行で作成されたすべてのノードプロセスを実行して停止したいと思います。
どうすればいいですか?
答え1
プロセスリストを入手できますまっすぐこれから生成してbash
送信しSIGTERM
てください。
pgrep -P $$ --signal SIGTERM
$$
現在のbashスクリプトのプロセス番号。
子供が信号を処理する方法によっては、孫が死ぬことも死ぬこともありません(繰り返し続けます)。
したがって、別のアプローチは、ユーザーから始まり、プロセスツリー全体を一覧表示しbash
て終了することです。
pstree -A -p $$ | grep -Eow "[0-9]+" | xargs kill
pstree
ツリー(人用にフォーマット)を出力し、プロセス番号を抽出し、各プロセスに対して実行するなど、grep
必要なタスクを実行します。kill
上記の行とプロセスも一覧pstree
表示されているので、両方の警告が表示されます。競争条件があるかどうかはわかりません。これは単なる概念証明です。プロセスリスト、フィルタなどを適切に処理するために、パイプの右側をコーディングできます。grep
xargs
No such process
kill