昨日、私のdebianマシンでdist-upgradeを行った後、nginx initスクリプトで問題が発生しました。 initスクリプトを使用してnginxを起動しようとすると、エラーメッセージが表示されます。
# service nginx start
Job for nginx.service failed. See 'systemctl status nginx.service' and 'journalctl -xn' for details.
Systemctl status nginx.serviceの出力:
# systemctl status nginx.service
● nginx.service - A high performance web server and a reverse proxy server
Loaded: loaded (/lib/systemd/system/nginx.service; enabled)
Active: failed (Result: exit-code) since Tue 2015-05-19 12:36:12 CEST; 7s ago
Process: 14087 ExecStart=/usr/sbin/nginx -g daemon on; master_process on; (code=exited, status=0/SUCCESS)
Process: 14126 ExecStartPre=/usr/sbin/nginx -t -q -g daemon on; master_process on; (code=exited, status=203/EXEC)
Journalctl -xnの出力:
# journalctl -xn
systemd[1]: nginx.service never wrote its PID file. Failing.
systemd[1]: Failed to start A high performance web server and a reverse proxy server.
-- Subject: Unit nginx.service has failed
-- Defined-By: systemd
-- Support: http://lists.freedesktop.org/mailman/listinfo/systemd-devel
--
-- Unit nginx.service has failed.
--
-- The result is failed.
systemd[1]: Unit nginx.service entered failed state.
systemd[14126]: Failed at step EXEC spawning /usr/sbin/nginx: No such file or directory
-- Subject: Process /usr/sbin/nginx could not be executed
-- Defined-By: systemd
-- Support: http://lists.freedesktop.org/mailman/listinfo/systemd-devel
--
-- The process /usr/sbin/nginx could not be executed and failed.
--
-- The error number returned while executing this process is 2.
systemd[1]: nginx.service: control process exited, code=exited status=203
systemd[1]: Failed to start A high performance web server and a reverse proxy server.
-- Subject: Unit nginx.service has failed
-- Defined-By: systemd
-- Support: http://lists.freedesktop.org/mailman/listinfo/systemd-devel
--
-- Unit nginx.service has failed.
--
-- The result is failed.
systemd[1]: Unit nginx.service entered failed state.
init.dの私のnginxファイル:
#! /bin/sh
### BEGIN INIT INFO
# Provides: nginx
# Required-Start: $all
# Required-Stop: $all
# Default-Start: 2 3 4 5
# Default-Stop: 0 1 6
# Short-Description: starts the nginx web server
# Description: starts nginx using start-stop-daemon
### END INIT INFO
PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin
DAEMON=/usr/local/sbin/nginx
NAME=nginx
DESC=nginx
test -x $DAEMON || exit 0
# Include nginx defaults if available
if [ -f /etc/default/nginx ] ; then
. /etc/default/nginx
fi
set -e
. /lib/lsb/init-functions
case "$1" in
start)
echo -n "Starting $DESC: "
start-stop-daemon --start --quiet --pidfile /usr/local/nginx/logs/$NAME.pid \
--exec $DAEMON -- $DAEMON_OPTS || true
echo "$NAME."
;;
stop)
echo -n "Stopping $DESC: "
start-stop-daemon --stop --quiet --pidfile /usr/local/nginx/logs/$NAME.pid \
--exec $DAEMON || true
echo "$NAME."
;;
restart|force-reload)
echo -n "Restarting $DESC: "
start-stop-daemon --stop --quiet --pidfile \
/usr/local/nginx/logs/$NAME.pid --exec $DAEMON || true
sleep 1
start-stop-daemon --start --quiet --pidfile \
/usr/local/nginx/logs/$NAME.pid --exec $DAEMON -- $DAEMON_OPTS || true
echo "$NAME."
;;
reload)
echo -n "Reloading $DESC configuration: "
start-stop-daemon --stop --signal HUP --quiet --pidfile /usr/local/nginx/logs/$NAME.pid \
--exec $DAEMON || true
echo "$NAME."
;;
status)
status_of_proc -p /usr/local/nginx/logs/$NAME.pid "$DAEMON" nginx && exit 0 || exit $?
;;
*)
N=/etc/init.d/$NAME
echo "Usage: $N {start|stop|restart|reload|force-reload|status}" >&2
exit 1
;;
esac
exit 0
Nginxデーモンファイルは/usr/local/sbin/nginx
にあります(ここでコンパイルしました)。
これまでに試したこと:デーモンファイル/usr/local/sbin/nginx
を/usr/sbin/nginx
にコピーしました
service nginx start
を使用すると、nginxの起動時にハングします。ポート80に接続しようとしても機能します。それで、initスクリプトを編集し、PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin
をPATH=/usr/sbin:/usr/bin:/sbin:/bin:/usr/sbin:/usr/bin
に変更しました。しかし、これは同じ結果をもたらしました。
私はこれまで何も試していません。
init.dの私のnginxファイル:
…はまったく関係ありません。 systemctl
の出力を見てください。どのファイルを見るかを正確に伝えました:
ロード済み:ロード済み(/ lib/systemd/system/nginx.service; enabled)
Thatはサービスユニットです。そしてsystemctl
は、サービスを開始する準備のためにそのサービスユニットが何を構成したかを示しています。
プロセス:14126 ExecStartPre = / usr/sbin/nginx -t -q -g daemon on; master_process on;(code = exited、status = 203/EXEC)
これは、サービスユニットのExecStartPre
設定にあります。 PATH
もまったく無関係であることがわかります(systemdの仕様による)。ジャーナルは何が起こったかについてより明確でした:
systemd [14126]:/ usr/sbin/nginxを生成するステップEXECで失敗:そのようなファイルまたはディレクトリはありません
何を考えても、コンピューターは、そのサービスを開始しようとしたときに/usr/sbin/nginx
は、その名前のファイルが存在しないため、プログラムとして実行できませんでした。
私の学んだ推測では、サービスユニットにRootDirectory
設定があり、ファイルを/usr/sbin
つまり、変更されたルート環境内でnotまたはプログラムイメージのロードに必要ないくつかの補助共有ライブラリが、変更されたルート環境から欠落しています。
Debian 8でも同じ問題が発生しました。私にとっては
[date] debian systemd[1]: nginx.service never wrote its PID file. Failing.
/ var/log/syslogで、これは質問と同様です
# journalctl -xn
systemd[1]: nginx.service never wrote its PID file. Failing.
その理由は、/ lib/systemd/system/nginx.serviceに
PIDFile=/var/run/nginx.pid
しかし、nginxはビルドされているため、/ usr/local/nginx/log/nginx.pidにpidを書き込みます
修正は、/ usr/local/nginx/conf/nginx.confの行を変更/追加することです
pid /var/run/nginx.pid;