【问题标题】:Kill a created subprocess and all processes created by it杀死一个创建的子进程和它创建的所有进程
【发布时间】:2016-08-23 20:36:00
【问题描述】:

我想要什么?创建启动和终止通信协议的脚本

我有什么? 我有一个打开 shell 脚本的 python 脚本,这个 shell 脚本初始化协议。当我杀死父进程时,一切正常(但在最终项目中,父进程必须保持活动状态),但是当我杀死子进程时,它变成了僵尸函数,我的协议继续运行。

我认为可能的问题是:我正在“杀死”shell 脚本(不是协议,这就是我想要的)

我启动shell脚本的那一行:

`protocolProcess = subprocess.Popen(["sh", arquivo], cwd = localDoArquivo) #inicia o protocolo`

protocolProcessPID = protocolProcess.pid #armazena o pid do protocolProcess

我杀死shell脚本的那一行:os.kill(protocolPID, signal.SIGTERM)

嗯,就是这样!如果有人可以帮助我,我将不胜感激

【问题讨论】:

标签: python subprocess zombie-process


【解决方案1】:

僵尸进程是尚未被父进程收割的进程。

父进程将保留这些进程处理程序直到时间结束,或者直到它读取进程退出状态,或者它自己被杀死。

听起来父进程需要更好地处理它如何产生和收获它的子进程。仅仅杀死一个子进程并不足以释放一个僵尸进程。

【讨论】:

  • 是否有正确且推荐的方式来开始和结束它??
  • @FernandoSantos:除非僵尸很多,否则不要担心。见What is <defunct> for a process and why it doesn't get killed?
  • 你应该使用 terminate() 函数来杀死孩子。并使用 poll 直到进程结束。一旦进程死亡并且你已经阅读了返回码,它应该会消耗僵尸进程。
  • 函数 terminate() 会杀死我的孩子和它创建的所有进程??因为如果我杀死我的子进程,我的协议(使用 Python 脚本启动)将失效,反之亦然
  • 我想我知道你在说什么。您需要forkdaemonize 您的流程。分叉允许进程将其父进程更改为 0(系统)并继续运行。
猜你喜欢
  • 1970-01-01
  • 2019-02-25
  • 2013-08-01
  • 2012-09-02
  • 1970-01-01
  • 2013-12-18
  • 1970-01-01
  • 1970-01-01
  • 2019-06-20
相关资源
最近更新 更多