예를 들어, 서브셸 함수에서 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-$!
이로 인해 이전 버전과 호환되지 않습니다.
따라서 최신 버전에는 이것이 포함됩니다. 제발, 제발, 제발, 이것을 깨뜨릴 수 있는지 확인해 보세요.
새로운 행동이 이전 행동보다 더 나쁜 예를 들어주실 수 있나요?
/올레