저는 이 기술을 사용하여 병렬 작업을 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
.