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

관련 정보