単純なupstartデーモンを作成しています。
Upstartのドキュメント[1]に従って、confスクリプトを作成します。
description "Super Daemon"
author "Bastian Baltasar Bux"
start on started dbus
stop on runlevel [06]
expect fork
exec /usr/bin/my-daemon
スクリプト/usr/bin/my-daemon
は、Pythonを呼び出すbashです。/var/logファイル内のpythonスクリプトログ情報。そのpythonスクリプトでは、fork
のみを作成します。しかし、Upstartのドキュメント[2]にあるようにフォークをチェックすると、このメソッドは、フォークを2回行うと言います。
これにより、開始ジョブは正しく実行されますが、upstart my-daemon status
で表示されるpidはログファイルにあるものとは異なります。 status my-daemon stop
の実行を停止しようとすると、エラーが表示されます。このコマンドは終了しません。Crtl-Cで終了する必要があります。
expect fork
をexpect daemon
に変更しようとしましたが、サービス停止も終了しません。
いつ問題になるのでしょうか?
exec
行を修正することで既に問題を修正していることに気付きました。将来の読者のために、問題と修正を要約しましょう。
問題:Upstartジョブのbashスクリプトからfork pythonを実行すると、正しく追跡されません。
問題:expect fork
またはexpect daemon
は問題を修正しません。
解決策:スクリプトを修正します。オプション:
exec /usr/bin/my-bash-wrapper
から直接python exec python /path/to/script
を呼び出す]に切り替えます(上記のコメントで示したように)
Bashスクリプトを修正します。の例の内容を含むbashスクリプトを持つ
#!/bin/bash python /path/to/script
python新しいプロセスIDを使用してbashとは別に実行されるという問題があります。したがって、Bashスクリプトを親とするコマンドであるため、Upstartでは無視されます。expect daemon
そもそも無視されるので助けにはなりません。
Upstartスクリプトで修正したのと同じ方法で、bashスクリプトを使用できます。接頭辞python exec
で呼び出すと、python Upstartによって追跡されるbashと同じPIDで実行されます。その後、expect fork
は、Pythonスクリプトでfork()をキャッチし、Upstartは適切なプロセスを問題なく追跡しています。
したがって、次のbashラッパーを使用します。
#!/bin/bash exec python /path/to/script
同じことをします。