2017-09-05 1 views
1

GNOMEターミナルサブプロセスを殺すためにどのよう:私は3つの*の.pyスクリプトが命名した

  • terminal_starter、
  • subprocess_in_terminal、それぞれ次のコードで
  • ctrlc_sender

l 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は 'SIGTERM'ではなく' SIGINT'を送信することに注意してください。 – melpomene

答えて

0

gnome-terminalは、それ自体を現在の親シェルから切り離し、親のinitプロセスとして「採用」しているようです。したがって、プロセス間の親の祖先の接続は壊れてしまい、サブプロセスの親と子を見つけることは重要ではありません。

しかしgnome-terminalのは、私は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我々は再帰的にすべての子を殺すことができます。その後、私たちは最終的に親プロセスを殺すことができました。

関連する問題