Системный сторожевой таймер запускает программу через скрипт

4

У меня есть этот код 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, очевидно

  • 2
    если ваш скрипт оболочки такой простой, вы можете использовать exec .
  • 0
    Извините, я не получил это. Не могли бы вы объяснить? И это пример программы, которую я показал здесь. Фактический сценарий оболочки может содержать несколько строк кода
Показать ещё 3 комментария
Теги:
systemd
ros
watchdog

1 ответ

3
Лучший ответ

используйте exec, чтобы заменить процесс bash процессом python:

exec /usr/bin/python ...

или установите NotifyAccess для all, чтобы разрешить переданный sd-сообщением обработанный дочерний процесс python, см. эту ветку.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню