私は単純な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