我正在使用 Ubuntu 14.04.4 LTS (GNU/Linux 3.13.0-85-generic x86_64),我在其中创建了一个简单的 Upstart 作业:
# content of /etc/init/listener.conf
start on runlevel [2345]
stop on runlevel [!2345]
respawn
exec /home/mk/log_listener
脚本本身如下所示:
#!/bin/sh
tail -F /var/log/vsftpd.log | while read line; do
if echo "$line" | grep -q 'OK UPLOAD:'; then
curl http://some.url/
fi
done
但由于某种原因,该作业启动了两个进程:
$ ps jax | grep lis
1 1234 1234 1234 ? -1 Ss 0 0:00 /bin/sh /home/mk/log_listener
1234 1236 1234 1234 ? -1 S 0 0:00 /bin/sh /home/mk/log_listener
我想这不是“正常”行为吗?我如何找出谁以及为什么启动第二个进程以及如何在我的 Upstart 作业中正确调用脚本?
答案1
我们看到这两个进程是相关的(PID 1236 的父进程是 1234),并且 PID 1234 是会话领导者(STAT 字段中的小写“s”)。
看https://unix.stackexchange.com/a/18178/117549我们看到 shell 脚本中的管道创建了一个新的进程组。
因此,我相信 Upstart 正在正确执行您的脚本,并且由于tail ... | while read
管道的原因您会看到两个进程。
如果我可以建议对您的脚本进行一些小改进,那么您不需要在循环内对 grep 的每一行进行回显;反而:
tail -F /var/log/vsftpd.log | grep --line-buffered 'OK UPLOAD:' | while read unused
do
curl http://some.url/
done