Systemd

systemd 可以在作為使用者分叉之前進行一些設置嗎?

  • July 30, 2016

在編寫了幾個供我個人使用的小型守護程序或 Web 應用程序之後,我喜歡使用 systemd 來管理它們(我使用的是 Arch Linux,如果這很重要的話)。所以我編寫如下服務文件:

[Unit]
Description=My example daemon

[Service]
Type=forking
User=example_user
ExecStart=/path/to/my_executable
ExecStop=kill -QUIT $MAINPID
PIDFile=/var/run/example/example.pid

[Install]
WantedBy=multi-user.target

my_executable 如果無法寫入其 PID 文件,則無法啟動,這通常意味著該目錄/var/run/example/不存在。每次重新啟動後都會發生這種情況,因為我有/var/run一個 tempfs。

一種解決方案是以 root 身份啟動 my_executable 並在創建其環境後將其降至正確的訪問權限,但我對此並不滿意,因為我不相信自己能正確地做到這一點。

有沒有辦法讓 systemd 在這裡完成繁重的工作(也許通過指定另一個應該在執行 ExecStart 之前執行的腳本)?什麼是最好的方法?

systemd提供systemd-tmpfiles了這個確切的目的。該systemd-tmpfiles服務處理易失性和臨時文件和目錄的創建、清理和刪除,這些文件和目錄通常位於目錄中,例如/run/tmp. 的配置在1的手冊頁中systemd-tmpfiles有描述。tmpfiles.d

systemd-tmpfiles在配置路徑之一中為您的服務創建一個配置文件,例如etc/tmpfiles.d. 配置文件的格式是每個路徑一行,格式如下:

type path mode ownership age argument

例如,線

d /var/run/example 0755 example_user - -

告訴systemd-tmpfiles創建如果不存在/var/run/example的目錄。example_user

1 Arch Linux wiki 文章systemd也提供了一些有關systemd-tmpfiles配置的範例。

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