Systemd 有一个标志--global
,在我的发行版 Ubuntu 上,我发现了一个 catch-22。
- 如果我以非特权用户身份运行它,systemctl 将没有适当的权限将单元文件复制到
/etc
. - 它无法通过 工作
sudo
,因为sudo
无法设置$DBUS_SESSION_BUS_ADDRESS
和$XDG_*
变量。
它可能会或可能不会通过sudo -E
保护环境起作用。如果从会话运行root
(例如从虚拟控制台),它肯定有效。
正确的使用方法是什么systemctl --global
?
答案1
--global
enable
:与 和一起使用时disable
,对全局用户配置目录进行操作,从而为所有用户将来的所有登录全局启用或禁用单元文件。
该systemctl --global
标志引用systemctl --user
“全局”级别的服务,主要用于enable
/disable
用户单位全部用户在系统上。
与单位相反systemctl --system
,启用的--global
单位不开始直到个人用户登录从而“想要”用户单元。 (请注意,sudo
/su
不要在这个意义上“登录”用户;请参阅下面的替代方案。)
如果你看一下systemd 用户单元搜索路径,您会注意到它包含一些非用户不可写入的“全局”目录root
。这些目录中的单元可以由sudo systemctl --global
(对于所有用户)或systemctl --user
(对于单个用户)进行管理。
ls -l /usr/lib/systemd/user
ls -l /etc/systemd/user
使用sudo systemctl --global
仅限于管理单位文件,主要是启用/禁用它们。全局手动启用用户单元会将其符号链接到/etc/systemd/user
;中的 Targets/wants 目录下对于个人用户来说是~/.config/systemd/user
.
ls -l ~/.config/systemd/user
在桌面系统上,可能有相当多的可用全局用户单元,可能在(包)安装期间默认启用。 “内存中”的单元列表还包括生成的和瞬态的单元/“文件”,例如设备和范围。例如,使用--type service
缩小范围。
systemctl --global list-unit-files
systemctl --global list-units
systemctl --global list-units --all
虽然用户单元文件的列表--global
可能看起来与个体的列表非常相似--user
,但后者在搜索路径中包括(非全局)用户特定的目录。也可以看看user.conf
, 在哪里附加用户目录可以配置。
systemctl --user list-units
systemctl --user list-unit-files
对于单位搜索目录的“实时”列表,包括user.conf
当前用户的自定义添加,请使用systemctl show
。
systemctl --user show --property 'UnitPath' --value
(刚刚注意到,虽然systemctl --global list-unit-files
排除了 中的那些~/.config/systemd/user
,systemctl --global list-units
但包括了它们。似乎不正确,或者至少不一致?)
由于用户单元在用户登录之前不会加载/执行,因此它们没有--global status
.您可以查看每个登录用户(您自己和其他人)的设备状态。
由于从 systemd 的角度来看, sudo
/su
实际上并没有执行“正确的登录”,因此它不应该用于管理其他用户的单位。相反,看看--machine
,其中@
和.host
可用于指代当前系统:。sudo systemctl --user --machine [email protected]
# NOTE: demo status for yourself, but via sudo.
sudo systemctl --user --machine "${USER}@.host" status
要以另一个用户的身份“登录”,作为具有所有 DBus 等设施的单独会话,请使用machinectl
开始一个shell
. (请注意,这machinectl login
也会启动一个 shell,但作为一个更麻烦的“手动”登录过程。)
# NOTE: demo logging in as yourself, but with a custom/different login shell.
sudo machinectl shell "${USER}@.host" /bin/sh
也可以看看loginctl
,特别是enable-linger
它允许长时间运行的--user
服务,而无需“手动”登录。