Arch-Linux

systemd 服務的自定義位置

  • April 9, 2022

有沒有辦法告訴systemd在某些路徑中搜尋服務文件?

作為此手冊頁狀態,搜尋路徑是在編譯時確定的。所以我嘗試XDG_DATA_DIRS/etc/systemd/user.conf

Environment="XDG_DATA_DIRS=/custom/path/lib" 

但它不起作用。

PS:我的服務是通過DBus啟動的。

–system 匯流排

systemd--system匯流排是使用 systemd 的“正常”方式。它是系統範圍的匯流排,以root. 將匯流排的man systemd.unit負載路徑描述為:--system

/etc/systemd/system.control
/run/systemd/system.control
/run/systemd/transient
/run/systemd/generator.early
/etc/systemd/system          <-- local units usually go here
/run/systemd/system
/run/systemd/generator
/usr/local/lib/systemd/system
/lib/systemd/system          <-- packaged units usually go here
/run/systemd/generator.late

該手冊頁還說:

設置變數時$SYSTEMD_UNIT_PATH,此變數的內容會覆蓋單位負載路徑。如果$SYSTEMD_UNIT_PATH以空組件(“:”)結尾,通常的單元載入路徑將附加到變數的內容

將此變數設置為SYSTEMD_UNIT_PATH=/my/path/:將添加/my/path到載入路徑的前面。但是,我們不能簡單地從命令行執行它,因為 systemd 已經在執行

SYSTEMD_UNIT_PATH=/my/path: systemd

要設置systemd --system匯流排的環境,我們需要查看man systemd-system.conf. 然後在這些文件中設置值以影響系統匯流排:

/etc/systemd/system.conf
/etc/systemd/system.conf.d/*.conf   <-- Install your change here
/run/systemd/system.conf.d/*.conf
/lib/systemd/system.conf.d/*.conf

關於在此配置中放置的內容,手冊頁描述:

ManagerEnvironment=
   Takes the same arguments as DefaultEnvironment=, see above. Sets 
   environment variables just for the manager process itself. In contrast 
   to user managers, these variables are not inherited by processes spawned 
   by the system manager, use DefaultEnvironment= for that. Note that these
   variables are merged into the existing environment block. In particular, 
   in case of the system manager, this includes variables set by the kernel 
   based on the kernel command line.

因此將此文件安裝為/etc/systemd/system.conf.d/mypath.conf

[Manager]
ManagerEnvironment="SYSTEMD_UNIT_PATH=/my/path:"

免責聲明:雖然在我的機器上的版本 250.4 中有SYSTEMD_UNIT_PATH記錄,但這裡沒有記錄。這可能意味著他們正在棄用該功能。如果您的機器的手冊頁中沒有描述,那麼它還沒有(或不再)受支持。在這種情況下,唯一的選擇是在每個單元存在的任何位置創建符號連結。man systemd.unit``SYSTEMD_UNIT_PATH``/etc/systemd/system/

–user 匯流排

systemd--user匯流排是為每個登錄的使用者執行的東西。它對於使用者備份、使用者掛載、啟動 GUI 或其他桌面環境的東西(如 VNC 伺服器)很有用。要管理此匯流排上的單元,請執行systemctl --user {start,stop} ...(不帶sudo)。 將匯流排的man systemd.unit負載路徑描述為:--user

$XDG_CONFIG_HOME/.config/systemd/user.control
$XDG_RUNTIME_DIR/systemd/user.control
/run/systemd/transient
/run/systemd/generator.early
$XDG_CONFIG_HOME/.config/systemd/user or $HOME/.config/systemd/user
$XDG_CONFIG_DIRS/.config/systemd/user or /etc/xdg/systemd/user
/etc/systemd/user
$XDG_RUNTIME_DIR/systemd/user
/run/systemd/user
$XDG_RUNTIME_DIR/systemd/generator
$XDG_DATA_HOME/systemd/user or $HOME/.local/share/systemd/user
$XDG_DATA_DIRS/systemd/user or /usr/local/share/systemd/user
$dir/systemd/user for each $dir in $XDG_DATA_DIRS
/usr/local/lib/systemd/user/*
/usr/lib/systemd/user/*
$XDG_RUNTIME_DIR/systemd/generator.late/*

要設置 systemd--user匯流排的環境,我們需要查看man systemd-user.conf. 這些文件中的此設置值會影響user匯流排:

~/.config/systemd/user.conf     <-- Here if it should affect one user
/etc/systemd/user.conf
/etc/systemd/user.conf.d/*.conf <-- Here if it should affect all user buses
/run/systemd/user.conf.d/*.conf
/usr/lib/systemd/user.conf.d/*.conf

在這種情況下,我不確定我們是否應該設置DefaultEnviornment=or ManagerEnviornment=,所以我會同時設置。

[Manager]
ManagerEnviornment="XDG_DATA_DIRS=/my/path:/usr/share/gnome:/usr/local/share/:/usr/share/"
DefaultEnviornment="XDG_DATA_DIRS=/my/path:/usr/share/gnome:/usr/local/share/:/usr/share/"

然後你需要把你的單位/my/path/systemd/user/

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