1

起動後スクリプト スタンザ内でコマンド置換を使用するとエラーが発生する (syslog が「ステータス 1 で終了」と報告する) 問題が upstart で見られますが、それは最初のシステム起動時のみです。

太陽の下でほぼすべてのスタートアップ イベント フックを使用してみました。local-filesystems と net-device-up は 1/100 回の試行でエラーなく動作したため、競合状態のようです。手動のスタート/ストップで問題なく動作します。私が見たコマンド置換は、エラーを引き起こす単純な猫または日付であり、 $() 方法とバックティック方法の両方を使用してみました。また、プレスタートでスリープを使用して競合状態を打ち負かそうとしましたが、何もしませんでした。

Win7 ホストを使用して VMWare 上で Ubuntu 11.10 を実行しています。すでにこれをトラブルシューティングするのに何時間も費やしました...誰かアイデアがありますか?

参照用の私の.confファイルは次のとおりです。

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

env NODE_ENV=production
env MYAPP_PIDFILE=/var/run/myapp.pid

respawn

exec start-stop-daemon --start --make-pidfile --pidfile $MYAPP_PIDFILE --chuid node-svc --exec /usr/local/n/versions/0.6.14/bin/node /opt/myapp/live/app.js >> /var/log/myapp/audit.node.log 2>&1

post-start script
    MYAPP_PID=`cat $MYAPP_PIDFILE`
    echo "[`date -u +%Y-%m-%dT%T.%3NZ`] + Started $UPSTART_JOB [$MYAPP_PID]: PROCESS=$PROCESS UPSTART_EVENTS=$UPSTART_EVENTS" >> /var/log/myapp/audit.upstart.log
end script

post-stop script
    MYAPP_PID=`cat $MYAPP_PIDFILE`
    echo "[`date -u +%Y-%m-%dT%T.%3NZ`] - Stopped $UPSTART_JOB [$MYAPP_PID]: PROCESS=$PROCESS UPSTART_STOP_EVENTS=$UPSTART_STOP_EVENTS EXIT_SIGNAL=$EXIT_SIGNAL EXIT_STATUS=$EXIT_STATUS" >> /var/log/myapp/audit.upstart.log
end script
4

1 に答える 1

1

私が考えることができる最も可能性の高いシナリオは、$MYAPP_PIDFILEまだ作成されていないということです。

「expect」スタンザを指定していないため、メイン プロセスが fork されて実行されるとすぐに post-start が実行されます。したがって、ご想像のstart-stop-daemonとおり、ノードの実行とその pidfile の書き込みと、/bin/shフォーク、実行、および exec への再度のフォークとの間に競合が発生する可能性がありcat $MYAPP_PIDFILEます。

これを行う正しい方法は、ポストスタートを次のように書き直すことです。

post-start script
  for i in 1 2 3 4 5 ; do
    if [ -f $MYAPP_PIDFILE ] ; then
      echo ...
      exit 0
    fi
    sleep 1
  done
  echo "timed out waiting for pidfile"
  exit 1
end script

Upstart 1.4 (Ubuntu 12.04 に最初に含まれる) では、upstart がログ機能を追加したため、出力を特別なログ ファイルにリダイレクトする必要がないことに注意してください。すべてのコンソール出力のデフォルトは/var/log/upstart/$UPSTART_JOB.log(logrotate によってローテーションされます) です。したがって、これらのエコーは単なるエコーである可能性があります。

于 2012-09-07T19:04:25.880 に答える