Python Systemd看门狗通过脚本运行程序

Python Systemd看门狗通过脚本运行程序,python,bash,ros,systemd,watchdog,Python,Bash,Ros,Systemd,Watchdog,我有这个python代码,我需要使用systemd运行它,并监视它是否被挂起。问题是,当我直接从systemd运行python脚本时,它工作得很好。但是,当python脚本从另一个shell脚本(从我的systemd服务运行)运行时,它会说 sdping_py.service: Got notification message from PID 6828, but reception only permitted for main PID 6768 问题似乎是python脚本作为shell脚本

我有这个python代码,我需要使用
systemd
运行它,并监视它是否被挂起。问题是,当我直接从systemd运行python脚本时,它工作得很好。但是,当python脚本从另一个shell脚本(从我的systemd服务运行)运行时,它会说

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
这是shell文件

#!/bin/bash

/usr/bin/python /home/teshanl/sdping/src/sdping_pub.py

编辑:


感谢@georgexsh,将
exec
添加到shell命令部分解决了我的问题。我的新问题是如何使用
roslaunch
命令执行相同的操作?ROS节点应向
systemd
服务发送心跳通知
roslaunch
使用单独的PID启动节点

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

exec /usr/bin/python ...

或者设置为
all
,以允许分叉子python进程发送sd消息,请参阅。

如果您的shell脚本如此简单,您可以使用
exec
。很抱歉,我没有得到它。你能解释一下吗?这是我在这里展示的一个示例程序。实际的shell脚本可能包含几行代码,比如
exec/usr/bin/python…
,它们都可以工作!谢谢这将部分解决我的问题,关于
roslaunch
roslaunch
有一个可能对你有帮助的方法。使用它,可以从Python脚本启动和监视节点。文档不是很完整,但是。。。