생성된 하위 프로세스가 실패하면 모든 하위 프로세스를 종료하고 종료합니다.

생성된 하위 프로세스가 실패하면 모든 하위 프로세스를 종료하고 종료합니다.

내 스크립트에서는 데이터 세트를 input_aa, input_ab 등으로 분할했습니다. 그런 다음 다음과 같이 동일한 Python 스크립트를 통해 각 데이터 세트를 실행했습니다.

# Execute program on each split file
for part in input_*; do
        python3 $part &
done
wait

내 질문은 두 가지입니다. Python 프로세스 실패를 어떻게 감지합니까? 감지되면 생성된 모든 하위 프로세스를 종료하고 실패로 스크립트를 종료하려면 어떻게 해야 합니까?

답변1

프로세스 그룹을 사용할 수 있습니다.

set -m
(
   for part in input_*; do
     (python3 "$part" || kill 0) &
   done
   wait
)

set -m(및 선택적 POSIX 쉘 기능, 필수 Unix 쉘 기능) 자체 프로세스 그룹에서 작업을 실행하십시오. bash, yash, 에서는 하위 쉘이 활성화된 작업 이므로 외부 프로세스 와 그 안에 생성된 모든 프로세스 zsh가 동일한 프로세스 그룹에 배치됩니다.mkshset -m(...)

dash다른 쉘 기반 사례 와 마찬가지로 ash이는 최상위 쉘 프로세스에만 적용됩니다. 따라서 코드를 서브셸에 넣지 않으면 코드가 작동합니다.

ksh이것은 AT&T나 이전 SysV/Bourne 쉘에서는 전혀 작동하지 않습니다.

kill 0현재 프로세스 그룹의 모든 구성원에게 SIGTERM 신호를 보냅니다.

답변2

여기에 예가 있습니다. 필요한 것을 얻으려면 먼저 시도해보십시오. 이대로 너무 많이 망칠 수는 없습니다.

#!/bin/bash
# Example of killing off all children

> killfile
> outfile.err
kill_em()
{
   echo 'killing all children ' > 2
   while read pid
   do
      kill -0 $pid && kill -9 $pid  # if still running kill it
   done < killfile
   exit 1
}

export grandparentpid=$$
trap 'kill_em' 6
for i in 2 2 3 4 5 6 7 8 9 10
do
        ( sleep $i && ls oinkle  >> outfile 2>> outfile.err &
          pid=$!
          echo $pid >> killfile
          wait $!
          [ $? -ne 0 ] && kill -6 $grandparentpid
        ) &
done
wait

ls oinkle이는 (내 컴퓨터에서) 실패할 것이기 때문에 의도적인 설정입니다 .

시작 스크립트를 수정한 후 필요한 것을 얻으면 --- 다음을 변경하십시오.

for i in 2 2 3 4 5 6 7 8 9 10

도착하다:

for part in input_* 

변화:

sleep $i && ls oinkle 

도착하다:

python3 $part 

리디렉션은 로그를 저장하기 위한 것입니다. 당신은 아마 그것을 원하지 않을 것입니다.

관련 정보