![systemd:启动用户(无需密码)特定的服务,该服务在注销后保持活动状态](https://linux22.com/image/1532991/systemd%EF%BC%9A%E5%90%AF%E5%8A%A8%E7%94%A8%E6%88%B7%EF%BC%88%E6%97%A0%E9%9C%80%E5%AF%86%E7%A0%81%EF%BC%89%E7%89%B9%E5%AE%9A%E7%9A%84%E6%9C%8D%E5%8A%A1%EF%BC%8C%E8%AF%A5%E6%9C%8D%E5%8A%A1%E5%9C%A8%E6%B3%A8%E9%94%80%E5%90%8E%E4%BF%9D%E6%8C%81%E6%B4%BB%E5%8A%A8%E7%8A%B6%E6%80%81.png)
我正在尝试使用 systemd 运行用户特定服务。我的职业不是管理员,而是一名开发人员。
我目前正在 Ubuntu 16.04 上测试我的解决方案,但计划在 Centos 7 上部署该解决方案。我希望一切都不会改变。
然而直到现在我设法通过脚本做到了以下几点:
- 通过命令行启动时检查我的服务是否有效运行
- 创建用户约翰带有
/home/john
目录(我需要这个目录)但是没有密码。我读到过它会更安全(希望我没有犯错……)。 - 创建目录
/home/john/.config/systemd/user
来存储我的服务文件。 - 根据以下条件启用徘徊本文档
所以现在我想测试打开与约翰的会话并启动服务,但不起作用。我正在尝试执行以下操作:
sam$ sudo su - john
john$ systemctl --user status my-service.service
并收集这些不愉快的事情:
Failed to connect to bus: No such file or directory
并且无论status/start/stop/list-units
我用什么命令来代替上述状态,它总是相同的消息。
将我连接到约翰的会话的命令通过以下行记录:
$journalctl -e
Jun 15 18:16:23 sam-dell sudo[5681]: sam : TTY=pts/2 ; PWD=/home/sam/IdeaProjects ; USER=root ; COMMAND=/bin/su - john
Jun 15 18:15:02 sam-dell su[5491]: Successful su for john by root
Jun 15 18:15:02 sam-dell su[5491]: + /dev/pts/2 root:john
Jun 15 18:15:02 sam-dell su[5491]: pam_unix(su:session): session opened for user john by (uid=0)
Jun 15 18:15:02 sam-dell su[5491]: pam_systemd(su:session): Cannot create session: Already running in a session
...当我尝试这些systemctl
命令时什么也没有发生。
注意:我为我的用户添加了密码,但它仍然无法从我用户的 gnome 会话中打开的终端运行。但由于我的用户现在有密码,Ubuntu 允许我使用 gnome 连接到它,我可以通过登录到 john gnome 会话毫无问题地sam
运行。systemctl --user status/start/stop
有人有想法吗?我可能以错误的方式处理了这个问题,我只是想在我的远程服务器上以另一个用户的身份运行 systemd 服务,所以我想我做得对,但也许不对。
非常感谢您的帮助
答案1
注意su
不创造嵌套登录会话。在 Sam 的会话中启动的所有进程仍然属于它。
您必须通过控制台、gdm、ssh 或machinectl login .host
(我认为有更短的别名)登录,因为它们都是从头开始的。(虽然……我不确定为什么单独启用 linger 不会启动 systemd 实例。它应该会启动。)
systemctl 本身不需要处于正确的会话中(您可以使用 sudo -u 命令),但它依赖于 $XDG_RUNTIME_DIR 环境变量来查找 systemd 实例。它通常应设置为/run/user/<UID>
,并且该目录应该有一个bus
套接字或systemd/private
一个。