systemctl --user start foo.service
尝试运行包含ExecStart=touch /bar/baz
具有/bar
权限的systemd 服务drwxrwxr-x 1 root storage
。运行该命令的用户属于该组storage
,并且可以从 shell 运行该touch
命令而不会出现问题,从而创建文件。但是,该服务因权限错误而失败。
我认为该服务的权限将与运行它的用户相匹配 - 并且确实让服务${USER}
在其命令中使用环境变量确实会产生我的用户,并且该服务会出现在我的ps
或pstree ${USER}
列表中。
foo.service
不包含ProtectSystem
或除以下之外的任何条目:Description
,EnvironmentFile
,Environment
,ExecStart
,,。环境条目用于加载与权限无关的配置KillSignal
。Restart
RestartSec
该服务是否实际上不使用调用用户来获取权限?如果不是,解决问题的最佳方法是什么?/bar
位于已安装的驱动器上,因此我可以dmask 0000
在 fstab 中执行此操作,但我宁愿避免这种方法。
确实如此,但只是间接的,因为 systemctl 不会自行产生进程 - 它只联系
systemd --user
服务管理器,所以用户服务的组成员身份将始终从服务管理器进程继承,而不是从运行 systemctl 的调用者继承。服务管理
--user
器确实在您自己的用户帐户下运行,但实际上是作为后台服务 ( ) 启动的,并且其组成员身份与您的登录会话的组成员身份是分开初始化的。每个 UID 在所有会话中共享只有一个实例,因此它将保留您首次登录系统user@<uid>.service
时的组成员身份,即使您后来将自己添加到其他组。如果您从所有会话中注销(并且 loginctl 中没有“linger”标志),服务管理器将在约 10 秒的空闲延迟后退出。因此,组成员身份的任何更改只有在您 a) 注销并等待 10 秒让服务管理器退出,或 b) 手动重新启动[email protected]实例(可能会终止您的整个 GUI 会话)时才会传播。