답변:
프로세스 그룹을 사용할 수 있습니다.
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
기반 쉘, 그에만 최상위 쉘 프로세스에서 작동합니다. 따라서 해당 코드는 서브 쉘에 넣지 않으면 작동합니다.
AT & T ksh
또는 이전 SysV / Bourne 셸에서는 전혀 작동하지 않습니다 .
kill 0
현재 프로세스 그룹의 모든 멤버에게 SIGTERM 신호를 보냅니다.
bash
, dash
, yash
, mksh
, zsh
. 기본적으로 모든 POSIX 쉘이지만 AT & T ksh. set -m
POSIX에서 (미만) 지정되지만 선택적 기능입니다.
kill 0
부모가 무엇이든 프로세스 그룹의 모든 구성원을 종료합니다. 참조 ps -j
프로세스 그룹 ID를 볼 수 있습니다.
이것은 예입니다. 필요한 것을 정확하게 얻으려면 먼저이 게임을하십시오. 그대로 깨뜨릴 수 없습니다.
#!/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
리디렉션은 로그를 저장하기 위해 존재합니다. 당신은 그들을 원하지 않을 수 있습니다.
killfile
작업의 모든 pid를 포함하지 않을 수 있습니다.
[ $? -ne 0 ]
...