다음과 같은 스크립트가 있습니다. 호출 방법은./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