为什么在脚本终止后,从用作monit服务的bash脚本开始的进程是否仍然存在?

时间:2014-05-14 18:58:52

标签: linux bash process fork monit

我有一个bash脚本,我已将其设置为monit服务。该脚本以对tail的长时间调用结束,该调用将其输出通过管道传输到nc以发送到外部服务器。

我遇到的问题是,当我使用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)在后台不使用子shell,将最后一个后台进程PID输出到PID文件

{ tail -q -n 0 -f $args | nc server.foo.com 1234; } &
echo "$!" > $PID_FILE

3)在后台使用子shell,输出应该是子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脚本调用的任何进程。

1 个答案:

答案 0 :(得分:0)

尝试:

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