2017-09-05 124 views
1

我有三个*的.py脚本命名为:如何杀死在GNOME终端子

  • terminal_starter,
  • subprocess_in_terminal,
  • ctrlc_sender

分别与下面的代码:

terminal_starter.py

import subprocess 
import os 

p = subprocess.Popen(['gnome-terminal -e "python subprocess_in_terminal.py"'], shell=True) 

gpid = os.getpgrp() 
ppid = os.getpid() 
p1 = subprocess.Popen(["python ctrlc_sender.py " + str(gpid) + " " + str(ppid)], shell=True) 

while 1: 
    pass 

subprocess_in_terminal.py

import time 

while 1: 
    print "Subprocess in terminal." 
    time.sleep(1) 

ctrlc_sender.py

import signal 
import os 
import sys 
import time 

gpid = sys.argv[1] 
ppid = sys.argv[2] 

for i in range(10): 
    print "Killer says: I will kill " + gpid + "and " + ppid 
    time.sleep(1) 

os.killpg(int(gpid), signal.SIGTERM) 
os.kill(int(ppid), signal.SIGTERM) 

我要杀死subprocess_in_terminal.py,但我不能。

我在Ubuntu 16.04 LTS和Python 2.7上运行这些脚本。

任何帮助,将不胜感激。

+0

请注意,Ctrl-C发送'SIGINT',而不是'SIGTERM'。 – melpomene

回答

0

似乎gnome-terminal从当前的父shell中“分离”出来,并且“采用”作为父init进程。因此,进程之间的父 - 祖连接被打破,找到我们子进程的父母和孩子成为一项不重要的任务。

但是,如果GNOME终端可以与“一般”的外壳进行更换,然后我希望在terminal_starter.py和ctrlc_sender.py一些最小的变化可能是有益的:

terminal_starter.py

1 import subprocess 
    2 import os 
    3 
    4 p = subprocess.Popen(['python subprocess_in_terminal.py'],preexec_fn=os.setsid, shell=True) 
    5 
    6 gpid = os.getpgrp() 
    7 ppid = os.getpid() 
    8 
    9 p1 = subprocess.Popen(["python ctrlc_sender.py " + str(gpid) + " " + str(ppid)], shell=True) 
    10 
    11 while 1: 
    12   
    13  pass 

preexec_fn = os.setsid指向我们的过程的流程

ctrlc_sende组长r.py

1 import signal 
    2 import os 
    3 import sys 
    4 import time 
    5  
    6 gpid = sys.argv[1] 
    7 ppid = sys.argv[2] 
    8  
    9 for i in range(10): 
10  print "Killer says: I will kill " + gpid + " and " + ppid 
11  time.sleep(1) 
12 
13 
14 import psutil 
15 
16 paren_proc = psutil.Process(int(ppid)) 
17 
18 for child_proc in parent_proc.children(recursive=True): 
19  child_proc.kill() 
20 parent_proc.kill() 

海槽psutil.Process我们可以递归地杀死所有的孩子。之后,我们终于可以杀死父母的过程。