我有这个python代码,需要使用systemd
运行,并监视它是否也被挂起。问题是,当我直接从systemd运行python脚本时,它工作正常。但是,当从另一个从我的systemd服务运行的shell脚本运行python脚本时,它说
sdping_py.service: Got notification message from PID 6828, but reception only permitted for main PID 6768
问题似乎是python脚本作为shell脚本和systemd服务的子进程运行,期望从shell脚本(服务的主要过程)发出通知。我该如何解决?我的应用程序严格需要从shell脚本运行。
这是我尝试过的python代码,
import sdnotify, time
n = sdnotify.SystemdNotifier()
print("Gonna start")
time.sleep(2)
print("Started!")
n.notify("READY=1")
i=0
while True:
print(i)
time.sleep(1)
n.notify("WATCHDOG=1")
i+=1
这是我的服务文件
[Unit]
Description=Test watchdog Demo process
DefaultDependencies=false
Requires=basic.target
[Service]
Type=notify
WatchdogSec=2
ExecStart=/home/teshanl/sdping/scripts/sdping_py.sh
#ExecStart=/usr/bin/python /home/teshanl/sdping/src/sdping_pub.py
StartLimitInterval=5min
StartLimitBurst=5
#StartLimitAction=reboot
Restart=always
这是外壳文件
#!/bin/bash
/usr/bin/python /home/teshanl/sdping/src/sdping_pub.py
编辑:
感谢@georgexsh,将exec
添加到shell命令中部分解决了我的问题。我的新问题是如何使用roslaunch
命令执行相同操作? ROS节点应将心跳通知发送到systemd
服务。 roslaunch
显然会启动具有单独PID的节点
答案 0 :(得分:3)
使用exec
,用python进程替换bash进程:
exec /usr/bin/python ...
或将NotifyAccess
设置为all
,以允许派生的子python进程发送sd消息,请参见this thread。