У меня есть этот код python, который мне нужно запускать с помощью systemd
и контролировать, если он также висел. Проблема в том, что когда я запускаю скрипт python непосредственно из systemd, он отлично работает. Однако, когда скрипт python запускается из другого сценария оболочки, который запускается из моей службы systemd, он говорит:
sdping_py.service: Got notification message from PID 6828, but reception only permitted for main PID 6768
Проблема заключается в том, что скрипт python работает как дочерний процесс сценария оболочки и службы systemd, ожидая уведомления из сценария оболочки, который является основным процессом для службы. Как я могу обойти это? Мое приложение строго необходимо запускать из сценария оболочки.
Здесь код 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
в команду оболочки частично разрешило мою проблему. Мой новый вопрос: как мне сделать то же самое с командой roslaunch
? Узел ROS должен отправлять уведомление heartbeat службе systemd
. roslaunch
запускает узлы с отдельными PID, очевидно
используйте exec
, чтобы заменить процесс bash процессом python:
exec /usr/bin/python ...
или установите NotifyAccess
для all
, чтобы разрешить переданный sd-сообщением обработанный дочерний процесс python, см. эту ветку.
exec
.