システムの起動時に Upstart サービスが起動しないのはなぜですか?

システムの起動時に Upstart サービスが起動しないのはなぜですか?

に続いてこの質問、私はシンプルなスタートアップサービスを書きました(設定ファイル) をヘッドレス Ubuntu Server 11.04 ボックス用に次のように実行します。

start on filesystem and net-device-up IFACE=eth0
stop on runlevel [016]
respawn

exec /home/administrator/pms-current/PMS.sh

このサービスは、コマンドラインから自由に開始 (または停止) できます。

service pms start

そして、実際に実行されていることがわかります。

しかし、マシンを初めて起動したときには、サービスが開始されません。ボックスに SSH で接続してサービス ステータスを確認すると、次のメッセージが表示されます。

$ service pms status
pms stop/waiting

私の質問は、なぜこのようなことが起こるのかということです。起動時にサービスが開始しないのはなぜですか?

アップデート1: サービスが開始されてその後停止したのか、まったく開始されなかったのか不明なので、PMS.sh に次のコードを追加しました。

echo "STARTED" > $STARTLOG

これは明らかに私に何か探す。私は自分でサービスを開始して確認することでこれをテストしました開始.log.その後、開始.logそして再起動しました。再起動後には表示されなかったので、upstart がサービスを開始していないのは間違いないようです。プロセスの早い段階で停止している可能性もありますが、すべてが単純であることを考えると、その可能性は低いようです。

アップデート2: アップスタート アップグレードを含む 11.10 にアップグレードしましたが、この問題はまだ発生します。

アップデート3: 要求どおり、起動しました--debug。catの出力は/var/log/syslog | grep init質問に配置するには長すぎますが、ここ

アップデート4: ログがさらに追加されました。今回は、upstart conf が先頭に含まれています。実行 1そして2回目

答え1

たとえば、開始前/開始後のエントリを使用して、ジョブの詳細度を上げることをお勧めします。

pre-start script
  logger "pre-start for myprog"
end script

post-start script
  logger "post-start for myprog"
end script

# and for PMS itself:
script
  logger "just before executing PMS"
  exec /home/administrator/pms-current/PMS.sh
end script

詳しい情報はhttp://upstart.ubuntu.com/クックブック/

こちらもご覧くださいhttp://upstart.ubuntu.com/wiki/デバッグ

答え2

ここでおそらく起きていることは、pms がネットワーク アダプタが起動する前、おそらくループバック アダプタ (lo) よりも前に起動していることです。PS3 メディア サーバーについて話していると仮定すると、これはネットワーク サービスであり、インターフェイスが利用できない状態で起動するのは好ましくないと考えられます。

開始基準を次のように変更してみてください。

start on filesystem and net-device-up IFACE!=lo

つまり、任意の「実際の」ネットワーク インターフェイスが起動した後に起動します。ただし、これは理想的ではない可能性があります。eth0 が次のインターフェイスである場合、PMS は起動しますが、PMS に wlan0 を使用させたい場合、これはうまくいきません。サービスは起動しますが、リッスンするインターフェイスを選択できなかった可能性があります。ストリーミングするインターフェイスがわかっていて、それが変更されないと仮定すると、ジョブにハードコードします。例:

start on filesystem and net-device-up IFACE=wlan0

Oneiric (11.10) では、イベントを使用して、static-network-up静的に構成されたすべてのデバイスを待機できます。これは、インターフェイスをハードコーディングせずにネットワーク依存のジョブを記述できるため便利です。[注: 「静的に構成されたすべてのデバイス」とは、/etc/network/interfacesNetworkManager の代わりに を使用することを指します。静的 IP と DHCP の意味で静的であるという意味ではありません。]

答え3

syslog を調べると、pms プロセスはエラーなしで開始されますが、しばらくすると目標が開始から停止に変更され、強制終了されます。

これは少し奇妙です。なぜなら、repsawn 句を追加したため、停止後に再起動を試行するはずですが、決して実行されないからです。そのため、respawn 句を削除したと推測します。

pms サービスの開始と停止の間に、ufw と network-interface (eth0) の 2 つのサービスのみが開始され、udev-fallback-graphics の 1 つのサービスが開始されます。

start on ...プロセス pms が並行して開始されているようです。残念ながら、Upstart のドキュメントでは、Vanilla とstart on starting ...の正確な違いが少し不明瞭ですstart on started ...

スタートアップの節を次のように変更してみてください

start on started networking

あるいはあまりにも

start on net-device-up IFACE=eth0

net-device-up イベントはかなり後から発生しますが、pms はそれより前に開始されるため、ログ出力は少し奇妙です。

これにより、プロセスが一度だけ開始されることが保証されます。全てネットワークのセットアップが完了しました。つまり、ジョブは開始されただけでなく、終了しました。

また、ログ出力を完全に信頼しないでください。起動プロセスの初期段階では、ログ出力を任意のファイルに記録しても必ずしも機能するとは限りません。答えはUpstart のデバッグ

答え4

私も同じ問題を抱えていましたが、最終的には解決しました単にと:

start on runlevel [2345]

何もnet-device-upなしstarted networking

これは完全な Upstart スクリプトであり、完璧に動作します。

# MyApp

description     "MyApp"
author          "me"

start on runlevel [2345]
stop on runlevel [016]

respawn

exec /usr/bin/myapp 2>> /var/logs/myapp.log

関連情報