Upstart job 启动脚本两次

Upstart job 启动脚本两次

我正在使用 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

相关内容