Bash 기능에서 GNU 병렬성을 종료합니다.

Bash 기능에서 GNU 병렬성을 종료합니다.

예를 들어, 서브셸 함수에서 gnu 병렬을 사용하고 있습니다.

func()(
    parallel --will-cite sleep ::: 60
)

함수로 보낸 후 SIGTERM병렬 처리도 종료되기를 원합니다. 하지만 난 이해해

$ func &
[1] 13255
$ pgrep -P 13255 # child of func -> the subshell
13256
$ pgrep -P 13256 # child of the subshell -> gnu parallel
13257
$ kill -TERM -- -13255 # terminating the process group
parallel: SIGTERM received. No new jobs will be started.
parallel: Waiting for these 1 jobs to finish. Send SIGTERM again to stop now.
parallel: sleep 60
$ kill -TERM -- -13255 # sending a second SIGTERM
bash: kill: (-18093) - No such process

따라서 프로세스 ID를 먼저 추적하지 않으면 병렬을 종료할 수 없습니다. 함수 내부에 트랩을 배치하려고 합니다.

func()(
    trap "pkill -P $$; pkill -P $$; exit" TERM
    parallel --will-cite sleep ::: 60
)

모든 하위 항목 을 pkill -P $$종료해야 하지만 검사 결과 ps $pid_of_parallel첫 번째 종료 신호 이후에도 병렬이 계속 실행되는 것으로 나타났습니다.

funct &; kill $!내 목표는 이 함수 와 모든 하위 프로세스가 즉시 종료 되도록 이 함수를 작성하는 것입니다 . 이 목표를 어떻게 달성할 수 있나요?

답변1

나는 이제 GNU Parallel의 최신 버전에 이것이 포함되어 있다고 믿습니다. GNU 병렬 개발 목록에서:

2019년 3월 10일 일요일 오후 8시 29분 Ole Tange가 썼습니다:

지금 GNU Parallel을 중지하려면 TERM을 보내 새 작업 시작을 중지한 다음 다른 TERM을 보내 실행 중인 작업을 종료해야 합니다.

새 작업 시작을 중지하려면 HUP를 보내고 실행 중인 작업을 종료하려면 TERM을 보내도록 변경할 생각입니다.

이렇게 하면 GNU Parallel을 더 쉽게 종료할 수 있습니다.

$ bash -c '병렬-j1 절전 ::: 111 222' &

그런 다음 bash를 사용하여 프로세스 그룹을 병렬로 종료하고

$ 죽이기-TERM-$!

이로 인해 이전 버전과 호환되지 않습니다.

따라서 최신 버전에는 이것이 포함됩니다. 제발, 제발, 제발, 이것을 깨뜨릴 수 있는지 확인해 보세요.

새로운 행동이 이전 행동보다 더 나쁜 예를 들어주실 수 있나요?

/올레

관련 정보