2017-09-05 4 views
1

ich drei * Py-Skripte mit dem Namen wie:Wie subprocess in gnome-Terminal töten

  • terminal_starter,
  • subprocess_in_terminal,
  • ctrlc_sender

mit dem folgenden Code jeweils:

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) 

Ich möchte subprocess_in_terminal.py töten, aber ich bin nicht in der Lage.

Ich verwende diese Skripte auf Ubuntu 16.04 LTS und Python 2.7.

Jede Hilfe wäre willkommen.

+0

Beachten Sie, dass Ctrl-C 'SIGINT', nicht' SIGTERM' sendet. – melpomene

Antwort

0

Es scheint, dass gnome-terminal sich von der aktuellen Eltern-Shell löst und als Eltern-Init-Prozess "adoptiert". Somit sind die Eltern-Vorfahren-Verbindungen zwischen Prozessen unterbrochen und das Finden der Eltern und Kinder unseres Teilprozesses wird zu einer nicht trivialen Aufgabe.

Wenn jedoch gnome-terminal mit einer "allgemeinen" Schale ersetzt werden könnte, dann hoffe ich, dass einige minimalen Änderungen in terminal_starter.py und ctrlc_sender.py hilfreich sein könnten:

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 unser Verfahren als Gruppenleiter von Prozessen zeigen

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() 

Trough psutil.Process wir konnten alle Kinder rekursiv töten. Und danach konnten wir den Elternprozess endlich beenden.