有没有办法告诉系统在某个路径中搜索服务文件?
正如这个联机帮助页状态,搜索路径是在编译时确定的。所以我尝试设置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