Nginx init.d 스크립트

Nginx init.d 스크립트

어제 내 데비안 컴퓨터에서 dist 업그레이드를 한 후 nginx init 스크립트에 몇 가지 문제가 발생했습니다. init 스크립트를 사용하여 nginx를 시작하려고 할 때마다 오류 메시지가 나타납니다.

# service nginx start
Job for nginx.service failed. See 'systemctl status nginx.service' and 'journalctl -xn' for details.

systemctl 상태 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.

내 nginx 파일은 init.d에 있습니다.

#! /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 startnginx를 시작할 때 멈춥니다. 포트 80에 연결하려고 하면 작동합니다. 그래서 계속해서 초기화 스크립트를 편집 PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin하고 PATH=/usr/sbin:/usr/bin:/sbin:/bin:/usr/sbin:/usr/bin.

나는 지금까지 다른 것을 시도하지 않았습니다.

답변1

내 nginx 파일은 init.d에 있습니다.

… 예전혀 관련이 없는. 출력을 살펴보십시오 systemctl. 보려는 파일을 정확하게 알려줍니다.

로드됨: 로드됨(/lib/systemd/system/nginx.service;활성화됨)

저것귀하의 서비스 단위입니다. systemctl서비스 시작을 준비하기 위해 서비스 단위가 구성한 내용을 알려줍니다 .

프로세스: 14126 ExecStartPre=/usr/sbin/nginx -t -q -g 데몬 프로세스가 시작되었습니다.(코드=종료, 상태=203/EXEC)

이는 ExecStartPre서비스 단위 설정에서 찾을 수 있는 내용입니다. 이 내용을 보면 이것도 전혀 관련이 없다는 것을 알 수 있습니다 PATH(이것은 systemd의 설계에 따른 것입니다). 그 잡지는 무슨 일이 일어났는지 더 분명하게 설명했습니다.

systemd[14126]: EXEC 빌드 단계에서 실패했습니다. /usr/sbin/nginx: 해당 파일 또는 디렉터리가 없습니다.

당신이 어떻게 생각하든 컴퓨터는 서비스를 시작하려고 할 때 /usr/sbin/nginx해당 이름을 가진 파일이 존재하지 않기 때문에 프로그램으로 실행할 수 없다고 생각합니다.

내 추측으로는 RootDirectory서비스 장치에 설정이 있거나 파일을 다음 위치 /usr/sbin로 복사하는 것입니다.아니요변경된 루트 환경에서 또는 프로그램 이미지를 로드하는데 필요한 일부 보조 공유 라이브러리가 변경된 루트 환경에서 누락되었습니다.

답변2

데비안 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가 빌드되었으므로 pid를 /usr/local/nginx/log/nginx.pid에 기록합니다.

해결 방법은 /usr/local/nginx/conf/nginx.conf의 줄을 변경/추가하는 것입니다.

pid        /var/run/nginx.pid;

관련 정보