Python子进程查杀

Alp*_*eph 5 python user-interface tk-toolkit button kill-process

我有杀死子进程的问题.以下代码用于创建子流程 -

  while(not myQueue.empty()): 
        p=Popen(myQueue.get(),shell=True,stdin=PIPE,stderr=PIPE)
Run Code Online (Sandbox Code Playgroud)

我通过迭代创建进程,直到队列(其中包含命令)为空.变量p是全局变量,是Popen类型的对象.即使命令完成了它应该做的事情,我也遇到了停止按钮的问题,这并没有像我预期的那样停止进程.

停止按钮代码如下 -

  stop=Button(textBoxFrame,text="Stop",width=5,command=stopAll)
  stop.grid(row=1,column=4)
Run Code Online (Sandbox Code Playgroud)

stopAll方法由上面的停止按钮调用,该按钮将终止当前子进程p.

  def stopAll():
        p.kill()
Run Code Online (Sandbox Code Playgroud)

注意 - 没有错误,例外或任何编译问题.

更新: 问题是p.kill()没有杀死我需要杀死的进程.我使用unix检查了这个>> ps aux.我也让我的程序输出启动和终止PID,以便我可以检查它们ps aux.我发现我需要杀死的进程是6个PID p.pid,我试图杀死os.kill((p.pid)+6,signal.SIGKILL)正在运行的进程并停止正确的进程.但我不想以这种方式做,因为有可能导致不同的子进程被杀死.我正在提供有关我的问题的更多细节 -

我在这里使用的队列包含我之前说过的命令.命令是这样的 -

    echo "Hello"|festival --tts
Run Code Online (Sandbox Code Playgroud)

Festival是unix中的语音合成器,festival --tts可以从文件中获取用户输入.我正在"Hello"为节日做准备,它正确地说出了这些话.但是p执行上述命令的过程是杀戮echo而不是festival.所以请帮我杀死特定的(节日)过程.

Alp*_*eph 0

由于节日程序是在 UNIX 中,我们可以使用 preexec_fn。Festival 正在创建自己的子进程,这使得杀死变得更加困难,因此在这种情况下,使用标识所有 Festival 进程的组 ID 可以解决这个问题。我们可以使用下面的代码创建一组进程 -

   while(not myQueue.empty()): 
    p=Popen(myQueue.get(),shell=True, stdin=PIPE,preexec_fn=os.setsid)
Run Code Online (Sandbox Code Playgroud)

stopAll 现在具有以下代码,用于终止全局变量 p 指向的子进程组 -

    os.killpg(os.getpgid(p.pid), signal.SIGKILL)
Run Code Online (Sandbox Code Playgroud)

将杀死生成的子进程组。来源:使用子流程