Systemd
systemd 可以在作為使用者分叉之前進行一些設置嗎?
在編寫了幾個供我個人使用的小型守護程序或 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
配置的範例。