私は、(特に)新しいターミナルウィンドウを開き、そのターミナルで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
なしで試してみました。
私がPythonスクリプトを実行する端末と生成された端末の両方で 'xprop _NET_WM_PID'を実行すると、同じPIDが返されます。 'xcfe4-terminal'は、同じプロセスの下で新しいインスタンスを実行するのに十分スマートです。ですから、私はTCPDUMPコマンドのPIDの後続を決める方法を理解しなければならないと思います。 –