systemd의 서비스 PID 파일에 문제가 있는 이유는 무엇입니까?

systemd의 서비스 PID 파일에 문제가 있는 이유는 무엇입니까?

저는 임베디드 하드웨어에서 맞춤형 Yocto 버전의 Linux를 실행하고 있습니다. nginx를 설치했는데 제대로 시작되지 않습니다.

systemctl start nginx.service실패하다

서비스를 시작하려고 하면 PID 파일이 성공적으로 생성되고 nginx가 시작됩니다(브라우저를 통해 연결할 수 있습니다). 모든 것이 정상입니다. 그런 다음 실패하고 nginx가 중지되고 PID 파일이 삭제됩니다.

PID 파일의 PID가 올바른지 확인했습니다(약 10초 동안 존재함).

결과는 다음과 같습니다 journalctl --xe.

-- Unit nginx.service has begun starting up.
Mar 03 13:40:34 imx8mq-var-dart systemd[1]: nginx.service: Permission denied while opening PID file or unsafe symlink chain: /run/nginx/nginx.pid
Mar 03 13:42:04 imx8mq-var-dart systemd[1]: nginx.service: Start operation timed out. Terminating.
Mar 03 13:42:04 imx8mq-var-dart systemd[1]: nginx.service: Failed with result 'timeout'.
Mar 03 13:42:04 imx8mq-var-dart systemd[1]: Failed to start Nginx Server.
-- Subject: Unit nginx.service has failed

/lib/systemd/service/nginx.service다음과 같습니다.

[Unit]
Description=Nginx Server
After=network.target
[Service]
Type=forking
PIDFile=/run/nginx/nginx.pid
ExecStart=/usr/sbin/nginx
ExecStop=/usr/sbin/nginx -s stop
ExecReload=/usr/sbin/nginx -s reload
[Install]
WantedBy=multi-user.target

디렉토리의 권한은 다음과 같습니다.

drwxr-xr-x   13 root     root           340 Feb 27 14:42 /run
drwxr-xr-x    7 root     root           140 Mar  3 13:42 /run/nginx

PID 파일이 존재할 때의 권한은 다음과 같습니다.

-rw-r--r--    1 root     root             5 Mar  3 13:59 /run/nginx/nginx.pid

/run은 tmpfs입니다.

tmpfs on /run type tmpfs (rw,nosuid,nodev,mode=755)

답변1

설치된 서비스 제거

systemctl disable nginx

nginx 서비스 파일을 이 템플릿으로 바꾸십시오.

# /etc/systemd/system/nginx.service
[Unit]
Description=The nginx HTTP and reverse proxy server
After=network.target remote-fs.target nss-lookup.target

[Service]
Type=forking
PIDFile=/run/nginx.pid
# Nginx will fail to start if /run/nginx.pid already exists but has the wrong
# SELinux context. This might happen when running `nginx -t` from the cmdline.
# https://bugzilla.redhat.com/show_bug.cgi?id=1268621
ExecStartPre=/usr/bin/rm -f /run/nginx.pid
ExecStartPre=/usr/sbin/nginx -t
ExecStart=/usr/sbin/nginx
ExecReload=/bin/kill -s HUP $MAINPID
KillSignal=SIGQUIT
TimeoutStopSec=5
KillMode=mixed
PrivateTmp=true

[Install]
WantedBy=multi-user.target

관련 정보