我有一个使用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列表中
答案 0 :(得分:0)
这似乎是notify
服务类型的已知限制
从pull request到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.
我已经尝试过与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 通知发送“你好”