2017-08-03 14 views
0

私は、(特に)新しいターミナルウィンドウを開き、そのターミナルでTCPDUMPを実行するスクリプトを持っています。スクリプトは、ユーザが元のウィンドウ内で完了したことを知らせるのを待つ(「y」を待つ)ことを待ちます。ユーザーが 'y'を入力すると、TCPDUMP端末ウィンドウを強制終了する必要があります。ここにセットアップがあります:サブプロセスによって生成されたターミナル/ tcpdumpを破棄します.Popen(Python)

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) 

これはすべて上手く始まります。プログラムの終了時に私は実行します:

これは私が産んだ他のプロセスでも動作しますが、それらは直接プログラムであり、新しい端末ではありません。私がPIDをトレースすることによって収集できるものから、新しい端末はPythonスクリプトを実行した端末のPIDによって生成され、Pythonインスタンス自体のPIDでは生成されません。したがって、running_procsに書き込まれたPIDは、新しいターミナルウィンドウが開かれた後に消えてしまい、生成されたターミナルを強制終了しません。

スポーンされた端末/コマンドをどのように終了できますか?私は運もなくshell=Trueなしで試してみました。

+0

私がPythonスクリプトを実行する端末と生成された端末の両方で 'xprop _NET_WM_PID'を実行すると、同じPIDが返されます。 'xcfe4-terminal'は、同じプロセスの下で新しいインスタンスを実行するのに十分スマートです。ですから、私はTCPDUMPコマンドのPIDの後続を決める方法を理解しなければならないと思います。 –

答えて

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) 
関連する問題