2009-06-10 4 views
6

백그라운드에서 장기 실행 프로세스를 생성 한 다음 쉘 스크립트를 작성하고 싶습니다. SIGTERM을 받으면 모든 서브 프로세스가 종료되기를 바란다.쉘 스크립트를 사용하여 프로세스 생성, SIGTERM에서 자식 종료

기본적으로 "마스터 프로세스"가 필요합니다.

는 여기에 지금까지 가지고있는 작업은 다음과 같습니다

#!/bin/sh 

sleep 600 & 
PID1="$!" 

sleep 600 & 
PID2="$!" 

# supposedly this should kill the child processes on SIGTERM. 
trap "kill $PID1 $PID2" SIGTERM 

wait 

위의 스크립트가 trap: 10: SIGTERM: bad trap 실패합니다.

편집 :이 스크립트는 제대로 표시 예상대로 나를 위해 작동 우분투 9.04

답변

5

조의 대답은 나를 올바른 길로 인도합니다. 나는 또한 내 기지를 커버하기 위해 더 많은 신호를 잡아야한다는 것을 알았습니다.

최종 스크립트는 다음과 같습니다

#!/bin/sh 

sleep 600 & 
PID1="$!" 

sleep 600 & 
PID2="$!" 

trap "kill $PID1 $PID2" exit INT TERM 

wait 
+1

신호 번호를 사용해야한다고 생각한다면 표준화 된 것만 사용해야합니다. 그러나 나는 당신의 시스템의 신호 이름을 대신 사용하는 것이 가장 좋습니다. – TheBonsai

+0

네 말이 맞아. 나는 이것이 마지막 버전이 되었길 바래 ... – itsadok

+0

당신의 코드이다. 원하는 버전을 많이 가질 수있다 ;-) – TheBonsai

1

을 사용하고 있습니다.

어떻게 SIGTERM 신호를 "마스터 프로세스"로 보냅니 까? kill -l을 실행하여 지원되는 신호를 확인하십시오. 오류 메시지는 시스템에서 인식하지 못하는 신호 "10"을 보내는 것으로 나타납니다.

그리고 다음 번에 같은 질문에 대한 운영 체제, 쉘 버전, 커널, ...을 추가해야

+0

감사합니다. 나는 우분투 9.04를 사용하고 있는데 이것이 아마 bash 대 대시 일이라는 것을 깨달았다. 첫 번째 줄을 #!/bin/bash로 바꾼다면 실제로 광고하는 것처럼 작동합니다. – itsadok

4

나는 당신이 '강타'와 같은 질문을 태그 비록 당신/빈/쉬 (배쉬없는 의심).

나는 메시지에서 DASH라고 생각합니다. 매뉴얼을 확인하거나 Bash 코드를 작성해야하는 경우 shebang을 수정하십시오.

10

이 나를 위해 작동합니다

trap "trap - SIGTERM && kill -- -$$" SIGINT SIGTERM EXIT 
  • kill -- -$$ 따라서도 후손을 죽이고, 전체 프로세스 그룹에 SIGTERM를 보냅니다.

  • 신호 EXIT을 지정하면 set -e (자세한 내용은 here)을 사용할 때 유용합니다.

+0

pid 0은 무엇을 의미 하는가? 문자 그대로, 또는 자리 표시자를 의미합니까? – itsadok

+0

어쨌든 이것은'kill - - $$'대신'kill-0'을 사용했을 때만 유용했습니다. 후자는 어떤 이유로 11641 : 프로세스를 찾을 수 없다고 말했다. – WorldSEnder