如何设置 Ubuntu 软件包来启动用户服务并仅在用户登录时启动它?

如何设置 Ubuntu 软件包来启动用户服务并仅在用户登录时启动它?

我正在尝试设置一个需要访问 X-Windows 和 DBus 的服务。首先我尝试将其作为后台应用程序,但这不起作用。我使用“自动登录用户”功能。现在我认为该服务需要作为自动登录用户运行(例如alexis)。我的问题是我可以轻松创建以该用户身份运行的服务(即设置User=alexisGroup=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 的评论,我最终使用了以下解决方案:

  1. 手动安装 my-daemon.service 文件

    my-daemon.service从项目debian目录移到另一个目录(我使用的conf目录)。

  2. 在我的项目文件中添加了一行.install以将该服务安装为用户服务

     conf/my-daemon.service      /usr/lib/systemd/user/.
    

    另请参阅此archlinux 页面(链接由@meuh提供)

  3. 启用服务

    为此,我无法使用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
    
  4. 清理

    如果您想要执行与 (3) 相反的操作,则必须删除软链接并删除文件夹。-f如果该选项已被删除,请使用该选项rmdir,并在 上使用--ignore-fail-on-non-empty。对于rmdir,请确保删除每一个,首先删除最深的一个,以便获得与安装前类似的状态。

  5. 自动启动?

    在(3)中创建链接是自动启动(启用),重新启动计算机或注销并重新登录,新用户和设备将自动启动。当然,这是假设服务功能正常。确保您的想要被正确定义:

     [Install]
     WantedBy=default.target
    

    还有其他选项在用户服务中不起作用。例如,您不能指定User=...Group=...选项。此类错误会出现在相应的期刊上

     journalctl --user -u my-daemon
    

    重要提示:这--user非常重要,如果您之前将服务作为系统服务运行,那么--user您将看到来自系统服务的日志,而不会看到用户日志中的任何内容。

另一个细节,我必须打开一个窗口,为了使其工作,我必须添加一个环境变量:

Environment="DISPLAY=:0"

您需要根据您在单位日志中看到的错误进行此类调整。

相关内容