systemd 服务的自定义位置

systemd 服务的自定义位置

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

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

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

但它不起作用。

PS:我的服务是通过数据库总线

答案1

--系统总线

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.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/*

要设置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

在这种情况下,我不确定我们是否应该设置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/"

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

答案2

我相信您必须设置$XDG_DATA_DIR不具有 bashrc/profile.d 环境变量,而是设置为 systemd 环境变量。

我相信第一个例子systemd.环境生成器做你想做的事。我将其复制如下以供快速参考:

# 50-xdg-data-dirs.sh

#!/bin/sh
# SPDX-License-Identifier: CC0-1.0

# set the default value
XDG_DATA_DIRS="${XDG_DATA_DIRS:-/usr/local/share/:/usr/share}"

# add a directory if it exists
if [ -d /opt/foo/share ]; then
    XDG_DATA_DIRS="/opt/foo/share:${XDG_DATA_DIRS}"
fi

# write our output
echo "XDG_DATA_DIRS=${XDG_DATA_DIRS}"

另一种可能性是在每个服务文件中的.conf文件中定义 systemd 变量,如中所述/etc/systemd/system.conf.d/这另一个SO

相关内容