Systemd

systemd 服務不會啟動 nodejs

  • February 26, 2019

我正在嘗試讓我的 nodejs 應用程序在啟動時啟動。如果我以使用者 odroid 的身份從命令行啟動它,它執行良好。

這是我的服務文件:

[Unit]
Description=ProImage
After=network.target mysql.service

[Service]
ExecStart=/bin/node /proimage/app.js
Restart=on-failure
RootDirectory=/proimage
WorkingDirectory=/proimage
User=root

[Install]
WantedBy=multi-user.target

當我執行時:

sudo systemctl status proimage_daemon

我得到:

odroid@odroid:~$ sudo systemctl status proimage_daemon
● proimage_daemon.service - ProImage
  Loaded: loaded (/lib/systemd/system/proimage_daemon.service; enabled; vendor preset: enabled)
  Active: inactive (dead) (Result: exit-code) since Tue 2019-02-26 09:45:30 EST; 6s ago
 Process: 30797 ExecStart=/bin/node /proimage/app.js (code=exited, status=200/CHDIR)
Main PID: 30797 (code=exited, status=200/CHDIR)

Feb 26 09:45:29 odroid systemd[1]: proimage_daemon.service: Unit entered failed state.
Feb 26 09:45:29 odroid systemd[1]: proimage_daemon.service: Failed with result 'exit-code'.
Feb 26 09:45:30 odroid systemd[1]: proimage_daemon.service: Service hold-off time over, scheduling restart.
Feb 26 09:45:30 odroid systemd[1]: Stopped ProImage.
Feb 26 09:45:30 odroid systemd[1]: proimage_daemon.service: Start request repeated too quickly.
Feb 26 09:45:30 odroid systemd[1]: Failed to start ProImage.

我看過 journalctl 使用:

journalctl -u proimage_daemon.service

它給了我以下相同的資訊:

odroid@odroid:~$ journalctl -u proimage_daemon.service --since 09:38
-- Logs begin at Tue 2019-02-26 09:02:47 EST, end at Tue 2019-02-26 10:02:34 EST. --
Feb 26 09:38:12 odroid systemd[1]: proimage_daemon.service: Trying to enqueue job proimage_daemon.service/stop/replace
Feb 26 09:38:12 odroid systemd[1]: proimage_daemon.service: Installed new job proimage_daemon.service/stop as 13040
Feb 26 09:38:12 odroid systemd[1]: proimage_daemon.service: Enqueued job proimage_daemon.service/stop as 13040
Feb 26 09:38:12 odroid systemd[1]: proimage_daemon.service: Job proimage_daemon.service/stop finished, result=done
Feb 26 09:38:12 odroid systemd[1]: Stopped ProImage ICU.
Feb 26 09:39:19 odroid systemd[1]: Started ProImage ICU.
Feb 26 09:39:19 odroid systemd[1]: proimage_daemon.service: Main process exited, code=exited, status=200/CHDIR
Feb 26 09:39:19 odroid systemd[1]: proimage_daemon.service: Unit entered failed state.
Feb 26 09:39:19 odroid systemd[1]: proimage_daemon.service: Failed with result 'exit-code'.
Feb 26 09:39:19 odroid systemd[1]: proimage_daemon.service: Service hold-off time over, scheduling restart.
Feb 26 09:39:19 odroid systemd[1]: Stopped ProImage ICU.

我看過十幾個關於這個問題的文章。他們都說 status=200/CHDIR 表示工作目錄有問題。

就我而言,工作目錄肯定存在,並且歸根使用者所有。我已經在這個目錄上遞歸地設置了 777 的權限。我用服務文件嘗試了很多不同的東西,但都無濟於事。

有人對我的問題有什麼建議嗎?

根據systemd exec 文件,設置RootDirectory類似於 chroot。結合設置WorkingDirectory,這意味著 systemd 正在將您的應用程序 chroot 到/proimage,然後在該目錄中嘗試到cd /proimage,這將轉換為/proimage/proimage.

如果您不需要 chroot 程序,請刪除該RootDirectory指令。如果您打算對程序進行 chroot,請刪除該WorkingDirectory指令。

引用自:https://unix.stackexchange.com/questions/503146