通过脚本的系统看门狗运行程序

时间:2018-10-10 06:57:31

标签: python bash ros systemd watchdog

我有这个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的节点

1 个答案:

答案 0 :(得分:3)

使用exec,用python进程替换bash进程:

exec /usr/bin/python ...

或将NotifyAccess设置为all,以允许派生的子python进程发送sd消息,请参见this thread