バックグラウンド:
DISTRIB_ID=Ubuntu
DISTRIB_RELEASE=10.04
DISTRIB_CODENAME=lucid
DISTRIB_DESCRIPTION="Ubuntu 10.04 LTS"
Nginxをビルドしました。upstartを使用して開始します。
サイトのnginx upstartスクリプト:
description "nginx http daemon"
start on runlevel 2
stop on runlevel 0
stop on runlevel 1
stop on runlevel 6
console owner
exec /usr/sbin/nginx -c /etc/nginx/nginx.conf -g "daemon off;"
respawn
Initctlを使用して実行しようとすると、「不明なジョブ」が表示されます。これは、エラーがあることを意味します(エラーを説明するための「Error」の何が問題になっていますか?)
誰かが私を正しい方向に向けることができますか?私はドキュメントをそのまま読みましたが、SysV initの置き換えではまばらなようです...しかし、このジョブをリストに追加して実行する必要があるものは何でも、私の人生の残りの部分に取り掛かります。 .. 任意のヒント?
編集:initctl version init(upstart 0.6.5)
複数のstop on
Upstartのアップスタートジョブの説明に含まれるディレクティブ> = 0.5。
そしてconsole owner
はおそらく望んでいるものではありません(これによりnginxがシステムコンソールの所有者になります)。
試してください:
description "nginx http daemon"
start on runlevel 2
stop on runlevel [016]
console output
exec /usr/sbin/nginx -c /etc/nginx/nginx.conf -g "daemon off;"
respawn
私はここに何度も行ったことがあるので、ここの回答を使用した後、自分の経験に基づいて最新の回答を提供したいと思いました。特に@danortonと@orjの回答に感謝します。
このスクリプトは、Nginx 1.0.11およびPassenger 3.0.11を搭載したUbuntu 12.04で実行されているUpstart 1.5でテストされています。 Passengerを使用していない場合は、post-stop
行を試してみてください。 Upstartクックブックを参照してください。
空の/etc/init/nginx.conf
に次の行を追加します(必要に応じてコメントを削除できます)。
description "nginx http daemon"
start on (filesystem and net-device-up IFACE=lo)
stop on runlevel [!2345]
env DAEMON=/usr/local/nginx/sbin/nginx
env PIDFILE=/var/run/nginx.pid
# Needed to allow Nginx to start, however, the wrong PID will be tracked
expect fork
# Test the nginx configuration (Upstart will not proceed if this fails)
pre-start exec $DAEMON -t
# Ensure nginx is shutdown gracefully
# Upstart will be tracking the wrong PID so the following is needed to stop nginx
post-stop exec start-stop-daemon --stop --pidfile $PIDFILE --name nginx --exec $DAEMON --signal QUIT
# Start Nginx
exec $DAEMON
Nginx WikiからUpstartスクリプトを取得して微調整しました。必要な行がなく、混乱を引き起こしたり、機能しなかったりするためです。
NginxをインストールしてPIDを書き込んでいる場所に応じて、env DAEMON
およびenv PID
行を変更する必要がある場合があります。 PIDはnginxで設定できます。
expect
のすべての形式を試しました。 expect fork
のみが機能しているようです。 Passengerを使用すると、nginxは61のフォークを作成します。 Upstartには0、1、または2が必要です。他の人が示唆したように、Upstartは間違ったPIDを追跡します。同じ理由でおそらく何もしないので、respawn
も削除しました。いくつかの追加の開始前/後開始スクリプトは、実際のPIDを取得することで修正できる場合があります。ただし、私は再起動の処理にmonitを使用しているため、再起動は必要ありません。
daemon off
は使用しないでください。これは開発専用です。参照 http://wiki.nginx.org/CoreModule#daemon
参照:
できません。とにかく、少なくとも正しくはありません。
Nginxは、「expect fork」または「expectデーモン」を介して、upstartが必要とする2つの方法のいずれかでデーモンを生成しないため、upstartはマスターnginxプロセスを追跡できません。いくつかのハックがありますが、それらには独自の問題があります。
Upstartがマスタープロセスを追跡できず、シャットダウン時にそれを強制終了できないという事実に問題がない場合、これは機能します。
start on local-filesystems \
and (net-device-added INTERFACE=lo) \
and (runlevel [12345])
stop on runlevel [06]
env DAEMON=/usr/sbin/nginx
respawn
respawn limit 10 5
expect daemon
pre-start script
$DAEMON -t
end script
$DAEMON
NGINX Wiki に pstart設定ファイルの例 があります。
設定ファイルでnginxバイナリへのパスを調整する必要がある場合があります。
この構成ファイルは、Ubuntu 10.04とnginx 1.0.5でうまく動作します。
また、/etc/init.d
で/lib/init/upstart-job
を指すnginx
シンボリックリンクをインストールしたので、標準のservice
コマンドを使用してnginx
を開始および停止できます。
注:Phusion PassengerをNGINXと一緒にインストールする場合、Upstart構成スクリプトに次のスタンザを追加する必要がある場合があります。
env PID=/opt/nginx/logs/nginx.pid
post-stop script
start-stop-daemon --stop --pidfile $PID --name nginx --exec $DAEMON --signal TERM
end script
私はこれが私のUbuntuの設定で必要であるとわかりました。それ以外の場合、initctl stop nginx
またはservice nginx stop
を発行したときに、nginxが実際に停止しませんでした。 Upstartがnginxプロセスには実際にはPassengerプロセスの1つのPIDであるPIDがあると考えていることにも気付きました。 NGINX/PassengerがUpstartを少し混乱させているのは明らかです。
奇妙なことに、ここでの回答は実際には完全に機能しません。なぜなら、それらはupstartをstop/killed状態のままにし、別の開始が機能しないためです。この意味は restart nginx
は失敗します。
Upstartのバグは https://bugs.launchpad.net/upstart/+bug/406397 に詳細に記載されており、upstartの作者が修正するのに十分な注意を払っていないことに驚いていますそれ。私が見た中で機能する唯一の解決策は次のとおりです(同じバグレポートから盗まれました)。
# nginx - Nginx Web Server
#
description "Nginx Web Server"
start on (local-filesystems and
(net-device-up IFACE=eth1 or net-device-up IFACE=eth0) )
stop on runlevel [!2345]
env DAEMON=/usr/local/sbin/nginx
env PID=/var/run/nginx.pid
respawn
pre-start script
$DAEMON -s stop 2> /dev/null || true
$DAEMON -t > /dev/null
$DAEMON
end script
script
sleepWhileAppIsUp(){
while pidof $1 >/dev/null; do
sleep 1
done
}
sleepWhileAppIsUp $DAEMON
end script
post-stop script
if pidof > /dev/null $DAEMON;
then
$DAEMON -s stop
fi
end script
このように書くことの利点は、リスポーンでさえ機能することです。欠点は、醜くて厄介なハックであることです。
description "nginx"
start on (net-device-up and local-filesystems)
stop on runlevel [016]
expect fork
respawn
exec /usr/sbin/nginx
詳細は http://geeknme.wordpress.com/2009/10/15/getting-started-with-upstart-in-ubunt を参照してください。
私が使う:
description "Nginx HTTP Server"
start on filesystem
stop on runlevel [!2345]
respawn
exec /opt/nginx/sbin/nginx -g "daemon off;"
runlevel [!...]
の方が標準的なようです。これは、標準のssh/sambaスクリプトが行うことです。また、respawn
ビットを追加して、死んだ場合に再起動するようにしてください。また、なぜあなたが欲しいのかわかりませんconsole output
コンソール出力をstdoutに送信するだけです。デフォルトの動作では、コンソール出力をロガーに送信するだけです。
すべての スタンザ ドキュメントを pstart wiki で確認できます