현재 실행 중인 명령이 완료된 후 실행 중인 bash 스크립트를 중지하는 방법은 무엇입니까?

현재 실행 중인 명령이 완료된 후 실행 중인 bash 스크립트를 중지하는 방법은 무엇입니까?

쉘 스크립트가 있습니다:

#!/bin/bash
python3 do_something_1.py
python3 do_something_2.py
python3 do_something_3.py
python3 do_something_4.py
python3 do_something_5.py

지금 실행 중이라면 python3 do_something_3.py.

bash 프로세스가 python3 do_something_3.py종료된 후 후속 명령을 실행하지 않도록 하려면 어떻게 해야 합니까(하위 프로세스를 종료하지 말고 기다리십시오) python3 do_something_4.py?python3 do_something_5.py

답변1

while루프를 사용하여 do_something_3.py아직 실행 중인지(예: 사용 pgrep) 시기를 확인할 수 있습니다 sleep.

루프가 끝나면 스크립트를 종료합니다.

while pgrep -f do_something_3.py >/dev/null ; then
    sleep 0.1
done && pkill -9 myscript
  • 정확한 pkill명령은 스크립트 이름을 지정하고 호출하는 방법에 따라 다르며, pgrep myscriptPID를 사용하여 테스트하거나 찾아 사용할 수 있습니다 kill -9 PID.
  • do_something_4.py스크립트가 시작되기 전에 중지할 정확한 시간을 찾을 수 없으므로 이는 이상적이지 않습니다 .

답변2

여기서 신호는 가장 간단한 솔루션입니다. Bash man페이지에서:

bash명령이 완료되고 a가 설정되었다는 신호를 받기를 기다리고 있다면 ,traptrap 명령은 완료될 때까지 실행되지 않습니다..

한 가지 예( thescript.sh):

trap 'echo "Exiting on USR1 after command"; exit' USR1

echo 'Beginning'
sleep 2  # long-running command
echo 'Middle'
sleep 2  # long-running command
echo 'End'

sleep첫 번째 작업이 완료된 후 종료 됩니다 .

./thescript.sh &
pid="$!"
sleep 1
kill -USR1 "$pid"  # roughly the middle of first sleep
wait -n "$pid"

sleep두 번째 작업이 완료되면 종료 됩니다 .

./thescript.sh &
pid="$!"
sleep 3
kill -USR1 "$pid"  # roughly the middle of second sleep
wait -n "$pid"

관련 정보