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