2014-01-08 4 views
2

KornShell (ksh) 스크립트는 다른 ksh 스크립트에서 시작된 모든 프로세스를 종료/종료 할 수 있습니까?모든 KornShell (ksh) 스크립트를 종료하십시오.

#call scriptBSnippet 
scriptBSnippet.ksh ${a} 

scriptB : scriptA.ksh이 scriptB.ksh은 다음 코드가 충분 작동 호출하지만 경우

이것에 대한 더 나은 솔루션

scriptA.ksh이? :. ksh :

#if error: exit this script (scriptB) and calling script (scriptA)# 
kill ${PPID} 
exit 1 

scriptA가 scr을 호출하는 scriptB를 호출하면 복잡성을 추가하려면 어떻게해야합니까? iptC, scriptC에 오류가 있으면 세 스크립트 모두를 종료하는 방법은 무엇입니까?

scriptA.ksh :

#call scriptBSnippet 
scriptBSnippet.ksh ${a} 

scriptB.ksh :

#if error: exit this script (scriptB) and calling script (scriptA)# 
kill ${PPID} 
exit 1 

scriptC.ksh는 :에

#if error: exit this script (scriptC) and calling scripts (scriptA, scriptB)# 
#kill ${PPID} 
#exit 1 

감사합니다 전진.

답변

1

같은 스크립트로 시작된 모든 프로세스를 강제 종료하는 것은 약간의 무차별 방식입니다.

정상적으로 종료 할 수있는 프로세스간에 통신 방법이있는 것이 가장 좋습니다. 모든 프로세스가 동일한 프로세스 그룹에있는 경우

그러나, 당신은 전체 프로세스 그룹에 신호를 보낼 수 있습니다 : 두 개의 인수는이 경우에 필요하다는

kill -${Signal:?} -${Pgid:?} 

참고. -으로 시작하는 단일 인수는 항상 신호로 해석됩니다.

일부 테스트를 실행하여 프로세스가 프로세스 그룹에 포함되는지 확인하십시오.

parent.sh :

Shell=ksh 
($Shell -c :) || exit 

$Shell child1.sh & pid1=$! 

$Shell child2.sh & pid2=$! 

$Shell child3.sh & pid3=$! 

ps -o pid,sid,pgid,tty,cmd $PPID $$ $pid1 $pid2 $pid3 
exit 

child.sh : 터미널에서 parent.sh를 실행하면

sleep 50 

- 그것은 프로세스 리더가 될 것입니다.

granny.sh :

Shell=ksh 
($Shell -c :) || exit 

$Shell parent.sh & 

wait 
exit 

다른 스크립트 granny.sh에서 parent.sh를 실행하면 다음 즉, 프로세스 그룹의 리더가 될 것입니다, 당신은 kill -SIG -PGID 방법을 사용하는 경우 포함됩니다.

또한이 답변을 참조하십시오 : What are “session leaders” in ps? 세션 및 프로세스 그룹에 대한 배경 정보.

+0

이러한 ksh 스크립트 (scriptA, scriptB, scriptC)는 가능한 한 분리되어야하며 각 스크립트에는 가능한 적은 입력 매개 변수가 있어야합니다. 이 솔루션은 추가 입력 매개 변수가 필요합니다 ... – javaPlease42

+1

이 솔루션은 확실히 더 많은 작업이 필요합니다. –

+0

각 스크립트가 동일한 프로세스 그룹 (Pgid)에 들어갈 수 있다면이 방법이 효과적 일 수 있으므로 어떻게해야하는지에 대한 통찰력이 있습니까? – javaPlease42

관련 문제