사전 종료 처리기에서 bash 스크립트의 모든 백그라운드 프로세스와 생성된 프로세스를 종료하는 방법은 무엇입니까?

사전 종료 처리기에서 bash 스크립트의 모든 백그라운드 프로세스와 생성된 프로세스를 종료하는 방법은 무엇입니까?

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

관련 정보