![사전 종료 처리기에서 bash 스크립트의 모든 백그라운드 프로세스와 생성된 프로세스를 종료하는 방법은 무엇입니까?](https://linux55.com/image/203188/%EC%82%AC%EC%A0%84%20%EC%A2%85%EB%A3%8C%20%EC%B2%98%EB%A6%AC%EA%B8%B0%EC%97%90%EC%84%9C%20bash%20%EC%8A%A4%ED%81%AC%EB%A6%BD%ED%8A%B8%EC%9D%98%20%EB%AA%A8%EB%93%A0%20%EB%B0%B1%EA%B7%B8%EB%9D%BC%EC%9A%B4%EB%93%9C%20%ED%94%84%EB%A1%9C%EC%84%B8%EC%8A%A4%EC%99%80%20%EC%83%9D%EC%84%B1%EB%90%9C%20%ED%94%84%EB%A1%9C%EC%84%B8%EC%8A%A4%EB%A5%BC%20%EC%A2%85%EB%A3%8C%ED%95%98%EB%8A%94%20%EB%B0%A9%EB%B2%95%EC%9D%80%20%EB%AC%B4%EC%97%87%EC%9E%85%EB%8B%88%EA%B9%8C%3F.png)
저는 이 기술을 사용하여 병렬 작업을 wait -n
수행합니다 .max_jobs
#!/usr/bin/env bash
cleanup() {
echo "cleaning up..."
}
trap "cleanup" EXIT
do_task() {
echo "doing task" "$1" " ..."
sleep 3s
}
main_task() {
for ((j = 0; j < 10; j++)); do
((i++ < max_jobs)) || wait -n
do_task "$j" &
done
wait
}
i=0
max_jobs=4
main_task
cleanup
을 클릭하면 처리기에서 이 스크립트에 의해 생성된 모든 작업과 프로세스를 어떻게 종료할 수 있습니까 Ctrl+C
?
kill 0
시도해 보았지만 cleanup
보류 중인 작업을 종료하지 않는 것 같습니다 do_task
.
처음 3초 이내에 SIGTERM
( )를 보내면 Ctrl+C
스크립트가 종료됩니다. 그러나 5초를 기다린 후 를 보내면 SIGTERM
마치 무한 루프에 걸린 것처럼 갑자기 매달린 프로세스가 CPU의 100%를 소비합니다. 절차를 따라 수동 htop
으로 SIGKILL
보내야 합니다 .
답변1
권장사항: 대신 GNU Parallel을 사용하세요.
parallel --embed > myscript.sh
이것을 다음에 추가하십시오 myscript.sh
:
env_parallel --session
do_task() {
echo "doing task" "$1" " ..."
sleep 3s
}
seq 40 | env_parallel -j4 do_task
CTRLC이제 모든 가 종료됩니다 do_task
.