Upstart操作はスクリプトを2回起動します。

Upstart操作はスクリプトを2回起動します。

私は単純なUpstartタスクを作成したUbuntu 14.04.4 LTS(GNU / Linux 3.13.0-85-generic x86_64)を使用しています。

# 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

しかし、何らかの理由でタスクは2つのプロセスを開始しました。

$ 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

私はこれが「正常な」行動ではないと思いますか? 2番目のプロセスが開始された人と理由をどのように確認し、Upstart操作でスクリプトを正しく呼び出すにはどうすればよいですか?

答え1

2つのプロセスが関連しており(PID 1236の親は1234)、PID 1234がセッションリーダー(STATフィールドの小文字「s」)であることがわかります。

バラよりhttps://unix.stackexchange.com/a/18178/117549シェルスクリプトのパイプが新しいプロセスグループを作成するのを見ることができます。

したがって、Upstartはスクリプトを正しく実行しており、tail ... | while readパイプによって2つのプロセスが表示されていると思います。

スクリプトに小さな改善を提案できる場合は、代わりにループ内にgrepの各行を表示する必要はありません。

tail -F /var/log/vsftpd.log | grep --line-buffered 'OK UPLOAD:' | while read unused
do
  curl http://some.url/
done

関連情報