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

时间:2017-08-03 19:06:35

标签: python linux shell subprocess popen

我有一个脚本应该(除其他外)打开一个新的终端窗口并在该终端中运行TCPDUMP。然后,脚本等待用户在原始窗口中发出信号,告知他们已完成(提示等待' y')。在用户输入' y'时,我需要终止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也试过没有运气。

1 个答案:

答案 0 :(得分:0)

更容易使用OS命令来解决这个问题。由于新终端的标题设置为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)