Tes*_*a J 5 python bash watchdog ros systemd
我有这个 python 代码,我需要运行systemd它并监视它是否也被挂起。问题是,当我直接从 systemd 运行 python 脚本时,它工作正常。但是,当 python 脚本从另一个从我的 systemd 服务运行的 shell 脚本运行时,它说
sdping_py.service: Got notification message from PID 6828, but reception only permitted for main PID 6768
Run Code Online (Sandbox Code Playgroud)
问题似乎是作为 shell 脚本和 systemd 服务的子进程运行的 python 脚本期望来自 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
Run Code Online (Sandbox Code Playgroud)
这是我的服务文件
[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
Run Code Online (Sandbox Code Playgroud)
这是shell文件
#!/bin/bash
/usr/bin/python /home/teshanl/sdping/src/sdping_pub.py
Run Code Online (Sandbox Code Playgroud)
编辑:
感谢 @georgexsh,添加exec到 shell 命令部分解决了我的问题。我的新问题是如何使用roslaunch命令执行相同操作?ROS 节点应该向systemd服务发送心跳通知。roslaunch明显地启动具有单独 PID 的节点
使用exec, 将 bash 进程替换为 python 进程:
exec /usr/bin/python ...
Run Code Online (Sandbox Code Playgroud)
或设置NotifyAccess为all,以允许分叉子 python 进程发送 sd 消息,请参阅此线程。
| 归档时间: |
|
| 查看次数: |
1514 次 |
| 最近记录: |