2014-05-14 35 views
1

我有一個bash腳本,我已經設置爲一個monit服務。該腳本以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電話在幾個不同的方式:

1)在前臺,輸出bash腳本PID在PID文件

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

2)沒有使用子外殼的背景,輸出什麼應該是最後一個後端過程PID到PID文件

{ tail -q -n 0 -f $args | nc server.foo.com 1234; } & 
echo "$!" > $PID_FILE 
使用子shell在後臺

3),輸出應該是什麼子shell PID的PID文件

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

奇怪的是,所有這些方法似乎導致上面所示的行爲:bash腳本PID總是使用,當monit停止服務時,bash腳本進程終止,tail進程不會。

我想知道爲什麼會發生這種情況,以及如何在關聯服務被monit終止時如何終止由bash腳本調用的任何進程。

回答

0

嘗試:

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

行爲沒有什麼區別,我害怕。 – elazar

+0

問題的癥結在於某些東西似乎是由於調用命令而導致腳本monit運行和由該腳本產生的進程分離,以致這些進程在服務停止時甚至在monit殺死腳本進程後仍然存在。我仍然不確定爲什麼或如何。 – elazar