【发布时间】:2016-01-19 06:46:05
【问题描述】:
我有两个脚本:
第一个('Reader')正在从命名管道读取数据,第二个('Writer')正在将数据写入命名管道。我从守护进程运行'Writer'(守护进程是用双叉机制创建的)。如果“Writer”崩溃,我想在“Reader”中打印一条关于它的消息。请参阅以下 Python 代码('Reader'):
pipe = open(pipe_path, 'r')
while True:
data = pipe.readline()
if not data:
print('Alarm')
break
但是当 'Writer' 崩溃时,'Reader' 卡在下面一行:
data = pipe.readline()
但是,如果我从终端运行“Writer”,一切正常(当管道中没有数据时,正在打印警报消息)。如果我打开管道,一切正常:
os.open(pipe_path, os.O_RDONLY | os.O_NONBLOCK)
但是这种方法不适合我,因为当'Writer'开始将数据写入管道时我需要等待一段时间
为了不创建僵尸,我接下来在守护进程中执行:
def childHandler(signum, frame):
os.wait3(os.WNOHANG)
signal.signal(signal.SIGCHLD, zombieKiller)
如何防止'Reader'卡住并正确处理来自子进程的信号?
【问题讨论】:
-
当作家崩溃时它真的死了吗?是否有线程或子进程保持管道打开?
-
确保你的守护进程不会保持管道打开(并且子进程应该使用
close_fds=True以避免继承无关的fds)。 -
无关:由于信号合并,您的守护进程可能会产生僵尸。你可以使用
subprocess模块来启动子进程(它有cleanup()方法)。或者使用不那么便携但更简单的signal(SIGCHLD, SIG_IGN)。 -
感谢所有人。命名管道由守护进程保存。问题已解决。
标签: python unix subprocess daemon