systemctl服务systemd-notify无法与非root用户一起使用

时间:2019-07-16 14:55:17

标签: bash systemd rhel7 systemctl

我有一个使用Type=notify的Red Hat Enterprise Linux 7上的服务单元和bash脚本的简单示例,我试图开始工作。

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

[Unit]
Description=My Test
[Service]
Type=notify
User=testuser
ExecStart=/home/iatf/test.sh
[Install]
WantedBy=multi-user.target

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

当以root用户身份运行时,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.

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

2 个答案:

答案 0 :(得分:0)

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

pull requestsystemd手册页

    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.

我已经尝试过与sudo和朋友进行一些变通的解决方法,但它们无法像systemd一样工作-通常会失败

No status data could be sent: $NOTIFY_SOCKET was not set

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

您还可以尝试使用here

所述的Python解决方法
python -c "import systemd.daemon, time; systemd.daemon.notify('READY=1'); time.sleep(5)"

基本上,这只是不可靠的睡眠,而使用notify的重点就是可靠的服务。

在我的情况下-我只是重构为使用root作为用户-实际的服务是主服务下所需的用户的子服务

答案 1 :(得分:0)

sudo -u USERACCOUNT_LOGGED 通知发送“你好”