bashスクリプトで生成されたすべての子プロセスを終了するには?

bashスクリプトで生成されたすべての子プロセスを終了するには?

次のスクリプトがあります。呼び方は./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表示されているので、両方の警告が表示されます。競争条件があるかどうかはわかりません。これは単なる概念証明です。プロセスリスト、フィルタなどを適切に処理するために、パイプの右側をコーディングできます。grepxargsNo such processkill

関連情報