![如何设置 Ubuntu 软件包来启动用户服务并仅在用户登录时启动它?](https://linux22.com/image/182912/%E5%A6%82%E4%BD%95%E8%AE%BE%E7%BD%AE%20Ubuntu%20%E8%BD%AF%E4%BB%B6%E5%8C%85%E6%9D%A5%E5%90%AF%E5%8A%A8%E7%94%A8%E6%88%B7%E6%9C%8D%E5%8A%A1%E5%B9%B6%E4%BB%85%E5%9C%A8%E7%94%A8%E6%88%B7%E7%99%BB%E5%BD%95%E6%97%B6%E5%90%AF%E5%8A%A8%E5%AE%83%EF%BC%9F.png)
我正在尝试设置一个需要访问 X-Windows 和 DBus 的服务。首先我尝试将其作为后台应用程序,但这不起作用。我使用“自动登录用户”功能。现在我认为该服务需要作为自动登录用户运行(例如alexis
)。我的问题是我可以轻松创建以该用户身份运行的服务(即设置User=alexis
和Group=alexis
变量)。我还必须添加一个环境变量(DISPLAY=:0
)。但是,该服务仍然作为系统服务启动。
我的想法是以用户登录时启动的方式创建一个服务。当我运行时,我看到许多 systemd 条目:
systemctl --user list-units
但我不太确定如何创建这样的服务文件并获取 Ubuntu 包创建工具链来创建为用户而不是整个操作系统提供的服务。
以下是我当前的my-daemon.service
文件,它保留在debian
项目的文件夹中:
# Documentation available at:
# https://www.freedesktop.org/software/systemd/man/systemd.service.html
[Unit]
Description=Daemon
[Service]
Type=simple
WorkingDirectory=~
ProtectHome=false
NoNewPrivileges=true
ExecStart=/usr/sbin/my-daemon
ExecStop=kill "$MAINPID"
Restart=on-failure
RestartSec=1min
User=alexis
Group=alexis
LimitNPROC=1000
[Install]
WantedBy=xsession.target
因此,服务文件安装在下面/lib/systemd/system
,我认为这在我的情况下是错误的。否则,它看起来像预期的那样工作......但我并不能真正 100% 确定每个用户单位的设置是否正确。我环顾四周,但找不到太多有关用户单位的信息。这就像必须是绝密的事情......
答案1
根据 @ajgringo619 和 @meuh 的评论,我最终使用了以下解决方案:
手动安装 my-daemon.service 文件
我
my-daemon.service
从项目debian
目录移到另一个目录(我使用的conf
目录)。在我的项目文件中添加了一行
.install
以将该服务安装为用户服务conf/my-daemon.service /usr/lib/systemd/user/.
另请参阅此archlinux 页面(链接由@meuh提供)
启用服务
为此,我无法使用
systemctl
因为当我运行安装时,没有为该用户运行 dbus(即,我从我的帐户进行安装,并且安装包创建了一个存在但不活动的“newuser”)。所以要启用该服务我必须手动创建软链接。这需要一些工作。首先确保该文件夹存在,创建软链接,然后修复用户所有权:
mkdir -p /home/newuser/.config/systemd/user/default.target.wants ln -s /usr/lib/systemd/user/my-daemon.service /home/newuser/.config/systemd/user/default.target.wants/. chown -R newuser:newuser /home/newuser/.config/systemd
清理
如果您想要执行与 (3) 相反的操作,则必须删除软链接并删除文件夹。
-f
如果该选项已被删除,请使用该选项rmdir
,并在 上使用--ignore-fail-on-non-empty
。对于rmdir
,请确保删除每一个,首先删除最深的一个,以便获得与安装前类似的状态。自动启动?
在(3)中创建链接是自动启动(启用),重新启动计算机或注销并重新登录,新用户和设备将自动启动。当然,这是假设服务功能正常。确保您的想要被正确定义:
[Install] WantedBy=default.target
还有其他选项在用户服务中不起作用。例如,您不能指定
User=...
或Group=...
选项。此类错误会出现在相应的期刊上journalctl --user -u my-daemon
重要提示:这
--user
非常重要,如果您之前将服务作为系统服务运行,那么--user
您将看到来自系统服务的日志,而不会看到用户日志中的任何内容。
另一个细节,我必须打开一个窗口,为了使其工作,我必须添加一个环境变量:
Environment="DISPLAY=:0"
您需要根据您在单位日志中看到的错误进行此类调整。