2017-08-03 43 views
0

我有一個腳本,應該(除其他外)打開一個新的終端窗口並在該終端中運行TCPDUMP。然後該腳本等待用戶在原始窗口中發出他們已完成的提示(提示等待'y')。在用戶輸入'y'的時候,我需要終止TCPDUMP終端窗口。這裏是設置:殺死由subprocess.Popen(Python)產生的終端/ 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,但沒有運氣。

+0

在運行Python腳本和衍生終端的終端中運行'xprop _NET_WM_PID'返回相同的PID。看起來'xcfe4-terminal'足夠聰明,可以在同一個進程下運行新的實例。所以我想我必須弄清楚如何確定TCPDUMP命令的PID。 –

回答

0

結束了更容易使用操作系統命令來解決這個問題。由於新終端的標題設置爲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)