首页 > 解决方案 > 杀死进程不要杀死子进程并且不要关闭终端窗口

问题描述

我正在研究 UBUNTU,我有main.py一个包含代码的文件:

#!/usr/bin/env python3
# coding=utf-8
import os
import time
from subprocess import Popen, PIPE, call, signal

base_path = os.path.abspath('')
path_to_file = base_path + '/test_subprocess.py'
p = Popen(['gnome-terminal', "--",  path_to_file])
time.sleep(2)

os.kill(p.pid, signal.SIGKILL)

我有这样test_subprocess.py的代码:

#!/usr/bin/env python3
# coding=utf-8

import time

def print_message():
    while True:
        print('I am working!')
        time.sleep(0.5)
    
print_message()

我试图杀死子进程,但之后

os.kill(p.pid, signal.SIGKILL)

子进程仍在工作并打印'I am working!'

如何完成子进程以及如何关闭 gnome 终端?如果我选择了完全错误的方式。你能告诉我工作的例子吗?

新版本的test_subprocess.py

#!/usr/bin/env python3
# coding=utf-8
import sys
from subprocess import signal
import time

def print_message():
    while True:
        print('I am working!')
        time.sleep(0.5)
        if signal.SIGKILL:  # it is braking a loop when parent process terminate!
            print('I am killing self!')
            break

print_message()

我应该像上面那样做吗?

标签: pythonsubprocesspopengnome-terminal

解决方案


您可以尝试以下方法:

p = Popen(['gnome-terminal', "--",  path_to_file])
PIDs = p.pid
os.system("kill {0}".format(PIDs))

Popen.pid 子进程的进程 ID。

请注意,如果您将 shell 参数设置为 True,则这是生成的 shell 的进程 ID。

http://docs.python.org/library/subprocess.html

这至少会杀死正确的进程。不确定它是否会关闭终端。

编辑:终止进程关闭终端:

p = Popen(['gnome-terminal', '--disable-factory', '-e', path_to_file], preexec_fn=os.setpgrp)

os.killpg(p.pid, signal.SIGINT)

归功于https://stackoverflow.com/a/34690644/15793575,我为您的命令进行了修改:

  • --disable-factory用于避免重复使用活动终端,以便我们可以通过子进程句柄杀死新创建的终端
  • os.setpgrp将 gnome-terminal 放在自己的进程组中,以便 os.killpg()可以用来向该组发送信号

推荐阅读