【发布时间】:2012-09-23 11:52:15
【问题描述】:
好吧,我在脚本中有一个 usr1 信号处理程序。通过从外部向我的脚本发送一个 SIGUSR1,我的处理程序完成了它的工作,但信号也传播给了我通过 Popen 创建的子进程。我该怎么做?
【问题讨论】:
-
信号默认不会“传播”;你自己转发。
-
@phihag 不,我只是在脚本 X 中创建了一个 subprocess.Popen。然后我从外部发送一个 SIGUSR1 并在我的脚本中捕获它。当时我的内心剧本因为给他发送了我从未给他发过的 SIGUSR1 而哭泣。
-
@Method Here is a demo 在我的系统上输出
parent: SIGUSR1 caught(+ PID)。你能重现这种行为吗?如果没有,您使用的是什么 Python 解释器,以及在什么操作系统上?如果是这样,您的脚本与演示脚本有何不同? -
@phihag 我的情况与您的示例完全不同,谢谢。在我的脚本中,我使用了 subprocess.Popen(),但没有使用 subprocess.call(),无论如何它不应该改变 fork 的行为。在我的脚本中,我打开了 rsync 程序。发送我的信号后,我的处理程序说“知道了”,但 rsync 退出并显示错误代码 20,这意味着它已捕获 sigusr1 信号。
-
@Method
subprocess.call只是subprocess.Popen的一个接口。无意冒犯,但extremely unlikely 是您的操作系统内核存在某种基本故障,会导致信号“传播”。你能把问题减少到a reproducible example吗?
标签: python signals subprocess signal-handling