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

おすすめ記事