2014-05-14 2 views
1

나는 내가 monit 서비스로 설정 한 bash 스크립트를 가지고있다. 스크립트는 tail에 대한 장기 실행 호출로 끝나며 출력을 nc으로 파이프하여 외부 서버로 보냅니다.스크립트가 종료 된 후에도 monit 서비스로 사용되는 bash 스크립트에서 프로세스가 시작되는 이유는 무엇입니까?

내가 겪고있는 문제는 monit을 사용하여 서비스를 중지하면 bash 스크립트의 프로세스가 종료되지만 해당 스크립트에 의한 tail 호출 프로세스가 계속 유지된다는 것입니다. 아래에서이 동작의 예를 보여 줬습니다.

$ sudo monit start service 
$ ps aux | grep -E 'service|tail' 
root  26215 0.0 0.0 17876 464 ?  S 18:31 0:00 /bin/bash -x /path/to/service.sh &>/var/log/service.log 
root  26216 0.0 0.0 4344 352 ?  S 18:31 0:00 tail -q -n 0 -f /var/log/app.log /var/log/db.log /var/log/mail.log 
root  26217 0.0 0.1 20736 1060 ?  S 18:31 0:00 nc server.foo.com 1234 
$ sudo cat /var/run/service.pid 
26215 
$ sudo monit stop service 
$ ps aux | grep -E 'service|tail' 
root  26216 0.0 0.0 4344 352 ?  S 18:31 0:00 tail -q -n 0 -f /var/log/app.log /var/log/db.log /var/log/mail.log 
root  26217 0.0 0.1 20736 1060 ?  S 18:31 0:00 nc server.foo.com 1234 

내가 몇 가지 다른 방법으로 tail 통화를 시도했다 : PID를 파일

echo "$$" > $PID_FILE 
tail -q -n 0 -f $args | nc server.foo.com 1234 

2)에서에 bash는 스크립트 PID를 출력

1) 전경 서브 쉘을 사용하지 않는 배경, 마지막으로 배경 처리 된 프로세스가 무엇인지 출력 PID 파일에 대한 PID

{ tail -q -n 0 -f $args | nc server.foo.com 1234; } & 
echo "$!" > $PID_FILE 
PID가 항상 사용됩니다 bash는 스크립트를 서브 쉘을 사용하여 백그라운드에서

3),

이상하게
(echo $BASHPID > $PID_FILE; tail -q -n 0 -f $args | nc server.foo.com 1234) & 

이,이 모든 방법은 위의 행동 결과에 표시되는 PID 파일의 서브 쉘의 PID해야한다 무엇을 출력 , bash 스크립트 프로세스는 monit이 서비스를 중지 할 때 종료되고, tail 프로세스는 종료되지 않습니다.

관련 서비스가 monit에 의해 종료 될 때 이것이 bash 스크립트에 의해 호출 된 프로세스를 중단하는 이유와 그 이유를 알고 싶습니다.

답변

0

시도 : 행동

bash -c "tail -q -n 0 -f $args | nc server.foo.com 1234" 
+0

어떤 차이가 난 두려워하지 않는다. – elazar

+0

문제의 핵심은 명령을 호출 한 결과로 스크립트에 의해 생성 된 스크립트 monit 실행과 프로세스의 연결이 끊어지는 것입니다. 따라서 서비스가 중지되면 스크립트 프로세스를 중단 한 후에도 프로세스가 계속 유지됩니다. 나는 왜 또는 어떻게 아직도 확실하지 않다. – elazar