web-dev-qa-db-ja.com

アップスタートジョブが正しく終了しない

単純な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 forkexpect daemonに変更しようとしましたが、サービス停止も終了しません。

いつ問題になるのでしょうか?

[1] http://upstart.ubuntu.com/cookbook

[2] http://upstart.ubuntu.com/cookbook/#id158

2
ssoto

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

同じことをします。

6
Tuminoid