【问题标题】:Is there a way to reliably check that systemd supports --user?有没有办法可靠地检查 systemd 是否支持 --user?
【发布时间】:2026-01-04 18:30:01
【问题描述】:

我正在尝试使用 Ansible 和 systemd 设置一些用户服务。

在 Ubuntu 和 RHEL 7 上我得到了

# systemctl --user status
Failed to get D-Bus connection: Connection refused

对于 Ubuntu,我澄清了错误,这是因为:

https://docs.ansible.com/ansible/latest/modules/systemd_module.html

在给定的服务管理器范围内运行 systemctl,可以作为默认系统范围(系统)、当前用户的范围(用户)或所有用户的范围(全局)。 为了使 systemd 与“用户”一起工作,执行用户必须启动自己的 dbus 实例(systemd 要求)。用户 dbus 进程通常在正常登录期间启动,但不会在 Ansible 任务运行期间启动。否则您可能会收到“无法连接到总线:没有这样的文件或目录”错误。

基本上DBus需要先启动systemd --user才能工作。我也不知道该怎么做,但我想我可以通过其他方式解决它。

但是,目前的主要障碍是:一般来说,我如何检查功能的可用性?

我试过systemctl show 并没有明确的“用户”功能。标志是Features 行中的“+PAM”吗?我知道 systemd 至少部分使用 PAM 来实现它,我不知道其他功能是否需要它。

如何检查“我的”systemd 是否以可靠的方式支持--user?有文件可以查吗?命令?还有什么? DBus 巫毒教?

【问题讨论】:

    标签: linux ansible systemd dbus


    【解决方案1】:

    这不是 systemd 是否支持 --user(所有合理的最新版本都支持)的问题,而是 (a) 用户会话当前是否正在运行,以及 (b) 您的 Ansible 进程是否可以连接到它。

    这两个问题的解决方案是become_method: machinectl(参见Ansible documentation),但在某些systemd版本上它是has issues


    如果该方法不适合您,有一些变通方法。通常,Ansible 会话不会创建用户 systemd 实例;您需要在本地登录才能做到这一点。但是,您可以enable lingering 始终为该用户提供一个 systemd。

    第二个问题是连接到那个实例。这需要设置XDG_RUNTIME_DIR 环境变量;通常发送至/run/user/<UID>。它不是由通常的become_method: sudo 设置的,但您可以使用这些方法来找出它并将其传递给systemd 任务:

    - name: "Find uid of user"
      command: "id -u {{ the_user }}"
      register: the_user_uid
      check_mode: no # Run even in check mode, otherwise the playbook fails with --check.
      changed_when: false
    
    - name: "Determine XDG_RUNTIME_DIR"
      set_fact:
        xdg_runtime_dir: "/run/user/{{ the_user_uid.stdout }}"
      changed_when: false
    
    - name: "Enable some service"
      become: true
      become_user: "{{ the_user }}"
      environment:
        XDG_RUNTIME_DIR: "{{ xdg_runtime_dir }}"
      systemd:
        user: yes
        daemon_reload: yes
        name: the_service.service
        enabled: yes
        state: started
    

    【讨论】:

    • 该解决方法对我来说非常有效。谢谢!
    • 第二次写错the_user_id应该是the_user_uid
    最近更新 更多