[英]Kill Terminal/tcpdump spawned by subprocess.Popen (Python)
我有一个脚本,该脚本应该(除其他事项外)打开一个新的终端窗口并在该终端中运行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
没有运气。
最终更容易使用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)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.