systemd 服务的自定义位置

kim*_*aNO 2 arch-linux d-bus systemd

有没有办法告诉systemd在某个路径中搜索服务文件?

正如此联机帮助页所述,搜索路径是在编译时确定的。所以我尝试设置XDG_DATA_DIRS环境变量/etc/systemd/user.conf

Environment="XDG_DATA_DIRS=/custom/path/lib" 
Run Code Online (Sandbox Code Playgroud)

但它不起作用。

PS:我的服务是通过DBus激活的。

Ste*_*art 5

--系统总线

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
Run Code Online (Sandbox Code Playgroud)

这个手册页还说:

设置变量后$SYSTEMD_UNIT_PATH,该变量的内容将覆盖单元加载路径。如果$SYSTEMD_UNIT_PATH以空组件(“:”)结尾,则通常的单元加载路径将附加到变量的内容中

将此变量设置为SYSTEMD_UNIT_PATH=/my/path/:将添加/my/path到加载路径的前面。但是,我们不能简单地从命令行运行它,因为 systemd 已经在运行了

SYSTEMD_UNIT_PATH=/my/path: systemd
Run Code Online (Sandbox Code Playgroud)

要设置总线的环境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
Run Code Online (Sandbox Code Playgroud)

关于在此配置中放置的内容,手册页描述了:

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.
Run Code Online (Sandbox Code Playgroud)

因此,将此文件安装为/etc/systemd/system.conf.d/mypath.conf

[Manager]
ManagerEnvironment="SYSTEMD_UNIT_PATH=/my/path:"
Run Code Online (Sandbox Code Playgroud)

免责声明:虽然在我的计算机上的版本 250.4SYSTEMD_UNIT_PATH中有记录,但此处man systemd.unit未记录。这可能意味着他们正在弃用该功能。如果您机器的手册页中没有描述,则尚未(或不再)支持它。在这种情况下,唯一的选择是创建符号链接SYSTEMD_UNIT_PATH/etc/systemd/system/在这种情况下,唯一的选择是在每个单元存在的任何位置

--用户总线

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/*
Run Code Online (Sandbox Code Playgroud)

要设置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
Run Code Online (Sandbox Code Playgroud)

在这种情况下,我不确定我们是否应该设置DefaultEnvironment=ManagerEnvironment=,所以我会设置两者。

[Manager]
ManagerEnvironment="XDG_DATA_DIRS=/my/path:/usr/share/gnome:/usr/local/share/:/usr/share/"
DefaultEnvironment="XDG_DATA_DIRS=/my/path:/usr/share/gnome:/usr/local/share/:/usr/share/"
Run Code Online (Sandbox Code Playgroud)

然后你需要把你的单位放进去/my/path/systemd/user/