쉘 스크립트가 있습니다:
#!/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 myscript
PID를 사용하여 테스트하거나 찾아 사용할 수 있습니다kill -9 PID
. do_something_4.py
스크립트가 시작되기 전에 중지할 정확한 시간을 찾을 수 없으므로 이는 이상적이지 않습니다 .
답변2
여기서 신호는 가장 간단한 솔루션입니다. Bash man
페이지에서:
bash
명령이 완료되고 a가 설정되었다는 신호를 받기를 기다리고 있다면 ,trap
trap
명령은 완료될 때까지 실행되지 않습니다..
한 가지 예( 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"