gpt4 book ai didi

daemontools下的Python脚本没有收到信号15

转载 作者:行者123 更新时间:2023-11-30 23:28:43 24 4
gpt4 key购买 nike

我有一个 python 脚本,我想在 daemontools 下作为守护进程运行。通常,在 deamontools 下运行的服务在前台运行,如果它出现故障,daemontools 会重新启动它。该服务还应该按照 here 的描述处理信号。 。

我的程序捕获 SIGINTSIGALRM当收到信号时程序退出。

当程序从命令行运行时 kill -1 <pid>kill -15 <pid>收到信号后,运行信号处理程序,导致程序退出,并打印相应的日志。

但是当程序在daemontools下运行时,并且svc -d /service/myrogram执行后,程序既不退出,也不打印日志。

我正在使用以下run在daemontools下运行程序的脚本

#!/bin/sh
exec 2>&1
/usr/bin/python /home/test/sigtest.py

我想知道为什么kill -15 <pid>工作时 svc -d /service/myrogram似乎没有将信号传递给 python 程序。

我正在使用的Python脚本是:

from pyudev import Context, Monitor, MonitorObserver
import signal, sys, time

def print_device_event(device):
print ('New event - {0.action}: {0.device_path}'.format(device))

if __name__ == '__main__':
context = Context()
monitor = Monitor.from_netlink(context)
observer = MonitorObserver(monitor, callback=print_device_event, name='monitor-observer')
print ("Processing started")
observer.start()
def handler(signum, frame):
print("Received Signal: %d"%signum)
observer.send_stop()
print("Exiting.")
signal.signal(signal.SIGTERM, handler)
signal.signal(signal.SIGHUP, handler)

try:
while observer.is_alive():
observer.join(timeout=1.0)
except (KeyboardInterrupt, SystemExit):
print("Caught KeyboardInterrupt, exiting")
observer.send_stop()

最佳答案

I am using following run script to run the program under daemontools

#!/bin/shexec 2>&1/usr/bin/python /home/test/sigtest.py

这就是你的错误。您正在 fork 一个子进程来运行 python 程序。停止您的守护进程 fork 。守护进程不需要也不应该 fork 以在子进程中运行,无论它们在 daemontools 下运行, daemontools-encore , runit , s6 , perp ,甚至systemd .

请记住,shell 的标准操作是在子进程中 fork 并运行命令。

为了获得最佳结果,您应该习惯于使用 shell 以外的其他方式编写运行脚本,链式加载守护程序。这是使用 Laurent Bercot's execlinerun 脚本而不是 /bin/sh 作为脚本解释器:

#!/command/execlineb -PW
fdmove -c 2 1
/usr/bin/python /home/test/sigtest.py

execline 没有任何非交互式 shell 所做的所有事情的开销,包括解析启动“rc”文件。它附带了一套有用的链加载实用程序,用于执行许多人们可能想要在 run 脚本中执行的操作。

但即使是 execline 也会执行 run 脚本中不需要的操作。因此,-P 选项可以关闭参数推送,该选项对于运行 脚本没有任何效用。这是使用更简单的脚本解释器的 run 脚本, my nosh program :

#!/usr/local/bin/nosh
fdmove -c 2 1
/usr/bin/python /home/test/sigtest.py

最后,这是 /bin/shrun 脚本,已更正:

#!/bin/shexec 2>&1exec /usr/bin/python /home/test/sigtest.py

进一步阅读

关于daemontools下的Python脚本没有收到信号15,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21499259/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com