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 列表中
这似乎是已知的限制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作为用户使用 - 将实际服务作为主服务下的子项与所需的用户