2013-05-30 33 views
1

cmd1 | CMD2當右側終止時,使管道的左側終止

我怎樣才能得到一個管道的發送命令時,管道的接收命令終止終止?

cmd1處理來自文件的數據並將其輸出傳送到cmd2。

CMD2臨危CMD1的輸出,並做一些自己的處理並輸出到一個文件中。它有一個選項,可以在指定的字節數被寫入後終止。

我遇到的問題是,CMD1繼續執行,直到處理完所有的文件中的數據是處理,即使CMD2已經終止。

這可能需要很長時間並減慢我的shell腳本。


的我在做什麼具體的解釋:

「超級代理」網絡探測設備獲取流量,並將其在文件存儲在6個小時的環形緩衝區。這些是一些格式或其他格式的原始捕獲文件。專有命令可用於根據時間範圍構建pcap文件。這是從上述CMD1和被稱爲「buildpcap」

6小時流量可以產生一個非常大的(200GB +)文件。

我要限制總PCAP到10GB,並分裂成1GB的文件部分。

我水溼使用buildpcap限制文件大小也不拆分成多個部分的文件的輸出,但我可以輸出到stdout而不是文件,並將其管到一個命令,該命令可以;在這種情況下,wireshark的dumpcap,從上面是cmd2。

我想dumpcap生成10個1G文件,然後終止。它這樣做,但buildpcap保持運行的時間signficant量

是我使用的實際命令如下:

buildpcap --feed 3 --start-datetimed $開始--end,日期時間$結束--stdout | dumpcap -i -w ./tmp.pcap -a files:10 -b文件大小:10000000

我希望這是有道理的。

+0

你能否簡要解釋你的cmd1和2做了什麼?如果在cmd2(awk)結束時嘗試'yes | awk'NR == 100 {exit}'',則'yes'命令也會結束。 – Kent

回答

2

這很大程度上取決於誰/ cmd1是什麼,以及它是如何幹淨地實施的。例如,如果我這樣做

find/-type f | less 

,並從第二窗口「pkill的少」我發現終止。

編輯:

以議論這個答案,並與答案相集成:

在這種情況下,我想你需要一個「看門狗腳本」,監視CMD2並殺死的進程狀態cmd2終止時的cmd1。類似於

watch -n 5 'pgrep cmd2 || pkill cmd1' 

應該做的。它會每秒檢查一次cmd2,如果2沒有了,就會殺死cmd1。

+0

buildpcap(網絡探針上的專有命令是cmd1)和dumpcap(來自wireshark的是cmd2)。我認爲buildcap寫得不好。有些選項工作不好,所以我的猜測是它沒有乾淨地實施。 cmd1執行不力時有什麼選擇? -Thx –

+1

在這種情況下,我想你需要一個「監視腳本」來監視cmd2的進程狀態,並在cmd2終止時殺死cmd1。就像** watch -n 5'pgrep cmd2 || pkill cmd1'**應該這樣做。它會每秒檢查一次cmd2,如果2沒有了,就會殺死cmd1。 – tink

+0

@tink爲什麼不把它變成答案? – Lorkenpeist

1

如果cmd1cmd2退出後試圖寫入管道,它將收到SIGPIPE信號。默認響應是退出(儘管可能寫入cmd1來處理信號的方式不同)。

但是,如果cmd1忙於做其他事情並且不嘗試寫入管道,則不會通知cmd2已退出。這裏有一個解決方法:

mkfifo cmd1-to-cmd2 
cmd1 > cmd1-to-cmd2 & cmd1PID=$! 
cmd2 < cmd1-to-cmd2; kill $cmd1PID 

首先,創建一個FIFO(先入先出)文件(也稱爲命名管道)。接下來,在後臺運行cmd1,將其輸出重定向到fifo。記住它的進程ID。運行cmd2,重定向來自fifo的輸入。而不是直接cmd1cmd2,你通過命名文件(因此,fifo的替代名稱)間接完成。一旦cmd2退出,kill命令將被執行以停止cmd1

如果需要,您也可以在後臺運行cmd2和以下kill

{ cmd2 < cmd1-to-cmd2; kill $cmd1PID; } &