systemctl 服务 systemd-notify 不适用于非 root 用户

Bri*_*ian 6 bash systemd rhel7 systemctl

我有一个关于 Red Hat Enterprise Linux 7 上的服务单元和 bash 脚本的简单示例,Type=notify我正在尝试使用它来工作。

当服务单元配置为以 root 身份启动脚本时,一切都会按预期进行。添加的时候User=testuser就失败了。当脚本最初启动时(如进程列表中所示),systemctl服务从未收到指示就绪的通知消息,因此它挂起并最终超时。

[Unit]
Description=My Test
[Service]
Type=notify
User=testuser
ExecStart=/home/iatf/test.sh
[Install]
WantedBy=multi-user.target
Run Code Online (Sandbox Code Playgroud)

Test.sh(由具有执行权限的testuser拥有)

#!/bin/bash

systemd-notify --status="Starting..."
sleep 5
systemd-notify --ready --status="Started"

while [ 1 ] ; do
  systemd-notify --status="Processing..."
  sleep 3
  systemd-notify --status="Waiting..."
  sleep 3
done
Run Code Online (Sandbox Code Playgroud)

当以 root 身份运行时,systemctl status test 显示从我的 test.sh bash 脚本发送的正确状态和状态消息。当User=testuser服务挂起然后超时并journalctl -xe报告:

Jul 15 13:37:25 tstcs03.ingdev systemd[1]: Cannot find unit for notify message of PID 7193.
Jul 15 13:37:28 tstcs03.ingdev systemd[1]: Cannot find unit for notify message of PID 7290.
Jul 15 13:37:31 tstcs03.ingdev systemd[1]: Cannot find unit for notify message of PID 7388.
Jul 15 13:37:34 tstcs03.ingdev systemd[1]: Cannot find unit for notify message of PID 7480.
Run Code Online (Sandbox Code Playgroud)

我不确定这些 PID 是什么,因为它们没有出现在 ps -ef 列表中

And*_*omb 3

这似乎是已知的限制notify服务类型的已知限制

拉取请求systemd手册页

    Due to current limitations of the Linux kernel and the systemd, this
    command requires CAP_SYS_ADMIN privileges to work
    reliably. I.e. it's useful only in shell scripts running as a root
    user.
Run Code Online (Sandbox Code Playgroud)

我和朋友一起尝试了一些黑客解决方法sudo,但它们不会起作用systemd- 通常会失败

No status data could be sent: $NOTIFY_SOCKET was not set
Run Code Online (Sandbox Code Playgroud)

这是指systemd-notify尝试将数据发送到的套接字 - 它在服务环境中定义,但我无法将其可靠地暴露给 sudo 环境

您还可以尝试使用此处描述的 Python 解决方法

python -c "import systemd.daemon, time; systemd.daemon.notify('READY=1'); time.sleep(5)"
Run Code Online (Sandbox Code Playgroud)

它基本上只是一个不可靠的睡眠,使用的全部目的notify是可靠的服务。

就我而言 - 我只是重构为root作为用户使用 - 将实际服务作为主服务下的子项与所需的用户

  • @djsavvy 很可能 systemd 246 永远不会登陆 20.04 - 鉴于 systemd 是 init 系统,它基本上在操作系统的生命周期中被锁定。如果这是您想要的,我会考虑更新的操作系统 (2认同)