杀死由subprocess.Popen(Python)产生的终端/ tcpdump

问题描述:

我有一个脚本,应该(除其他外)打开一个新的终端窗口并在该终端中运行TCPDUMP。然后该脚本等待用户在原始窗口中发出他们已完成的提示(提示等待'y')。在用户输入'y'的时候,我需要终止TCPDUMP终端窗口。这里是设置:杀死由subprocess.Popen(Python)产生的终端/ tcpdump

tcp_dump_line = "\"/usr/sbin/tcpdump -nn -tttt -i " + nic 
tcp_dump_line += " 'not (host ::1 and tcp and port 5432) and not (host ::1" 
tcp_dump_line += " and udp and port 44954) and not (host ::1 and tcp and " 
tcp_dump_line += "port 4101) and not (host 127.0.0.1 and tcp and " 
tcp_dump_line += "port 4101)'\"" 
command = ['xfce4-terminal', '-e', tcp_dump_line, 
      '-T', 'TCPDUMP'] 
print "[*] tcpdump command: " + ' '.join(command) 

proc1 = subprocess.Popen(' '.join(command), shell=True) 
running_procs.append(proc1) 

这开始一切正常。在程序退出时我运行:

def kill_procs(running_procs): 
    '''Kill processes spawned by this scripts.''' 
    print "[*] Killing all startop spawned processes" 
    for p in running_procs: 
     print "[+] Killing PID: " + str(p.pid) 
     p.kill() 

这适用于我已经催生了其他流程,但这些都是直接的程序,而不是新的终端。从通过跟踪PID可以收集到的信息来看,新终端由运行Python脚本的终端的PID产生,而不是Python实例本身的PID。因此,写入running_procs的PID似乎在新的终端窗口打开后消失,因此无法杀死生成的终端。

任何想法如何我可以退出产生的终端/命令?我试过没有shell=True,但没有运气。

+0

在运行Python脚本和衍生终端的终端中运行'xprop _NET_WM_PID'返回相同的PID。看起来'xcfe4-terminal'足够聪明,可以在同一个进程下运行新的实例。所以我想我必须弄清楚如何确定TCPDUMP命令的PID。 –

结束了更容易使用操作系统命令来解决这个问题。由于新终端的标题设置为TCPDUMP,因此我可以使用pidof来获得该标题。

tcpdump_pids = subprocess.check_output(['pidof', 'tcpdump']).split() 
for pid in tcpdump_pids: 
    print "[+] Killing PID: " + pid 
    os.kill(int(pid), signal.SIGKILL)