【问题标题】:Subprocess reacts differently on SIGINT signals子进程对 SIGINT 信号的反应不同
【发布时间】:2015-05-15 15:26:06
【问题描述】:

b.py

import subprocess
f = subprocess.Popen(['python', 'a.py'])
time.sleep(3000)

a.py

import time
time.sleep(1000)

运行python b.py,按CTRL+C,两个进程都会终止。

但是向父进程b.py发送信号SIGINT,kill -2 xxxx,但是子进程a.py仍然存在。

【问题讨论】:

  • 是什么让你认为 CTRL-C 被当作 SIGINT 处理?
  • 错字。信号情报。反正我说的是信号 2
  • 同样的问题,是什么让你认为 CTRL-C 是一个简单的 SIGINT?你在什么操作系统上运行它?
  • Linux。我在 Internet 上找到的每条信息都告诉我 CTRL+C 等于 SIGINT。
  • Ctrl+C 与此处的os.killpg(xxxx, signal.SIGTERM) 类似。

标签: python linux process subprocess


【解决方案1】:

您终端上的Ctrl-C 通常将SIGINT 发送到前台进程组中的所有进程。您的父进程和子进程都在此进程组中。

如需更详细的说明,请参阅 The TTY demystified 或 Kirk McKusick 的更多技术版本 Process Groups and Sessions

如果您只是杀死父进程,则子进程 没有父进程,因此将重新设置为 PID 1 (init)。你也可以在ps 的输出中看到这一点。由于您的子进程从未收到信号,因此它只是继续运行。

【讨论】:

  • 是的,这正是我所需要的。我不关心孤儿进程,我最初的目的是即使父进程死了也要让它继续运行。然后 ctrl+c 问题来困扰我。看来我必须在前台进程中捕获这些信号。
  • 我认为你想要的是守护孩子。实际上有一个 PEP:python.org/dev/peps/pep-3143
  • 这个文件太复杂了,我看不懂。我可以只使用 subprocess.Popen 来运行一个新进程吗?当然,将 preexec_fn 参数设置为 os.setsid(),以使子进程与父进程组解除关联。
  • 我建议为这些目的使用包python-daemon
猜你喜欢
  • 2012-10-08
  • 1970-01-01
  • 2018-11-25
  • 2018-05-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多