내 스크립트에서는 데이터 세트를 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
가 동일한 프로세스 그룹에 배치됩니다.mksh
set -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
리디렉션은 로그를 저장하기 위한 것입니다. 당신은 아마 그것을 원하지 않을 것입니다.