我有一个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脚本调用的任何进程。
答案 0 :(得分:0)
尝试:
bash -c "tail -q -n 0 -f $args | nc server.foo.com 1234"