(这个问题有后续这里)
我正在尝试为 Linux 编写一个基于 Python 的 Init 系统,但在向我的 Python init 脚本获取信号时遇到问题。来自“男人2杀”页面:
The only signals that can be sent to process ID 1, the init process, are those for which init has explicitly installed signal handlers.
在基于 Python 的 Init 中,我有一个测试函数和一个信号处理程序设置来调用该函数:
def SigTest(SIG, FRM):
print "Caught SIGHUP!"
signal.signal(signal.SIGHUP, SigTest)
从另一个 TTY(初始化脚本在另一个 tty 上执行 sh)如果我发送信号,它会被完全忽略,并且文本永远不会被打印。
kill -HUP 1
我发现这个问题是因为我为我的 Python init 编写了一个收割函数,以便在子进程死亡时收割它们,但它们都僵死了,花了一段时间才发现 Python 从未收到 SIGCHLD 信号。为了确保我的环境正常,我编写了一个 C 程序来 fork 并让子进程发送 PID 1 信号,并且它确实注册了。
如何安装信号处理程序,如果
signal.signal(SIG, FUNC)
不起作用,系统会确认?
我将尝试使用 ctypes 用 C 代码注册我的处理程序,看看是否有效,但如果可能的话,我宁愿使用纯 Python 答案。
想法?
(我不是程序员,我真的很困惑:p)
下面的测试代码...
import os
import sys
import time
import signal
def SigTest(SIG, FRM):
print "SIGINT Caught"
print "forking for ash"
cpid = os.fork()
if cpid == 0:
os.closerange(0, 4)
sys.stdin = open('/dev/tty2', 'r')
sys.stdout = open('/dev/tty2', 'w')
sys.stderr = open('/dev/tty2', 'w')
os.execv('/bin/ash', ('ash',))
print "ash started on tty2"
signal.signal(signal.SIGHUP, SigTest)
while True:
time.sleep(5.0)
信号处理程序主要在 Python 中工作。但也存在一些问题。一是您的处理程序在解释器重新进入其字节码解释器之前不会运行。如果您的程序被 C 函数阻塞,则信号处理程序在返回之前不会被调用。您在等待的地方不会显示代码。你在使用 signal.pause() 吗?
另一个问题是,如果您处于系统调用中,您将在信号处理程序返回后收到异常。您需要使用重试处理程序包装所有系统调用(至少在 Linux 上)。
有趣的是,你正在编写一个 init 替代品......这就像一个进程管理器。您可能会对 proctools 代码感兴趣,因为它确实处理 SIGCHLD。
顺便说一句,这段代码:
import signal
def SigTest(SIG, FRM):
print "SIGINT Caught"
signal.signal(signal.SIGHUP, SigTest)
while True:
signal.pause()
适用于我的系统。
导入信号
从信号导入 api_client
sig = api_client('YOUR_API_KEY')
sig.send_message(recipient='TOKEN', message='Hello world!')