【问题标题】:Use Systemd Watchdog with python. Muliprocessing将 Systemd 看门狗与 python 结合使用。多重处理
【发布时间】:2023-02-02 23:42:12
【问题描述】:

如何使用 Python 重置 Systemd 看门狗?我正在为具有许多依赖项的多线程图片检测软件实现看门狗。之前服务启动的是shell脚本,现在是直接启动Python文件。但是,看门狗实施未正常运行。有没有更有效的选择?目标是在程序陷入循环 30 秒或更长时间时重新启动“图片检测主应用程序”服务。

按照systemd文件夹中的服务

[Unit]
Description=Picturedetection Main application
Wants=network-online.target
After=network-online.target

[Service]
Type=simple
User=user
WorkingDirectory=/home/user/detection/
ExecStart=/usr/bin/python3 /home/user/detection/picturedetection.py
Environment=TF_CUDNN_USE_AUTOTUNE=0
WatchdogSec=30
Restart=always
WatchdogTimestamp=30

[Install]
WantedBy=multi-user.target

按照我目前使用的 python main

import sys
import syslog
from multiprocessing import Queue
from DetectionDefines import Detection_Version as OV
import time

print("OPTICONTROL START")
syslog.syslog(syslog.LOG_NOTICE, "PICTUREDETECTION START --- Version " + OV.major + "." + OV.minor)

from config.Config import Config as conf
from prediction.ImageFeed import ImageFeed

from prediction.ResultHandler import ResultHandler
from dataflow.CommServer import CommServer
from dataflow.FTLComm import FTLComm
from dataflow.MiniHTTPServer import MiniHTTPServer
from dataflow.GraphDownloader import GraphDownloader
from tools.Logger import Logger
from dataflow.FTPHandler import FTPHandler
from tools.FileJanitor import FileJanitor
from prediction.PredictionPipeline import PredictionPipeline

#Watchdog test
import os
import time
import systemd

# Communication
CommServer().start()
FTLComm()

#Experimental not working right now. Probably even delete
test = Logger("<WATCHDOGWATCHDOG> ")
def WatchdogReset():
    test.notice("WATCHDOG has been reseted")
    with open("/dev/watchdog", "w") as f:
        f.write("1")
#End of Experimental

# Other subprocesses
MiniHTTPServer().start()
FileJanitor().start()
FTPHandler().start()
GraphDownloader().start()


# Detection subprocesses
img_queue = Queue(maxsize = 1)
rst_queue = Queue(maxsize = conf.result_buffer)
ImageFeed(img_queue).start()
ResultHandler(rst_queue).start()

while True:
    # CUDA / TensorFlow need to be in the main process
    PredictionPipeline(img_queue, rst_queue).predict()
    systemd.daemon.notify("WATCHDOG=1")

此外,我想确保程序在陷入无限循环时重新启动。然而,这是一个多线程程序。当其他进程正在运行时,它是否仍然能够重新启动?

我尝试使用该方法激活看门狗,但似乎没有效果。该脚本每 30 秒重新启动一次。我考虑过在我的实现中出现错误的可能性,但使用“os”查询并没有解决问题。 此外,我尝试使用自定义的“FileWatchdog”来发送错误消息并通过执行 shell 脚本重新启动服务。但是,这需要超级用户权限,我不想分发带有硬编码密码的软件。此外,我相信这个解决方案从长远来看会带来挑战。

【问题讨论】:

    标签: python systemd watchdog systemctl python-watchdog


    【解决方案1】:

    我找到了解决方案

    相反,我使用了 sdnotify 库,您可以通过 pip 下载它。然后我检查了当前进程是否还活着。

    像这样:

    import sdnotify
    from tools.Logger import Logger
    from tools import Watchdog
    test = Logger("<WATCHDOGWATCHDOG> ")
    n = sdnotify.SystemdNotifier()
    n.notify("READY=1")
    
    imdfg = ImageFeed(img_queue)
    rslt = ResultHandler(rst_queue)
    imdfg.start()
    rslt.start()
    if(Watchdog.check(imdfg)): 
       n.notify("WATCHDOG=1")
       test.notice("OPTICONTROL_WATCHDOG Reset")
       time.sleep(2)
    
    #Watchdog file
    from multiprocessing import process
    
    def check(prc):
        return prc.is_alive()
    

    【讨论】:

      猜你喜欢
      • 2021-01-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多