【问题标题】:Kill Terminal/tcpdump spawned by subprocess.Popen (Python)杀死由 subprocess.Popen (Python) 生成的终端/tcpdump
【发布时间】:2018-01-11 13:18:49
【问题描述】:

我有一个脚本应该(除其他外)打开一个新的终端窗口并在该终端中运行 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,也没有运气。

【问题讨论】:

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

标签: python linux shell subprocess popen


【解决方案1】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-08-28
    • 2017-07-27
    • 2016-03-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多