
我有這個命令顯示在連接埠 1700 上接收和發送的資料包。
tcpdump -AUq 連接埠 1700
資料包中有字串rxpk
,但大多數資料包沒有它。當輸出包含此字串時,我希望運行一些腳本(閃爍 LED)。
tcpdump -AUq port 1700 | awk '/rxpk/ { print | "/path/to/blink_led 18" }'
但似乎它只在第一次rxpk
找到時匹配,後續發生的情況不會觸發{ ... }
- 部分
有人知道為什麼嗎?或甚至是在rxpk
收到腳本時運行腳本的其他方法?
答案1
LED 僅閃爍一次的原因是,當您列印到管道時,管道保持開啟狀態,因此只有一次 的呼叫blink_led
。如果blink_led
要讀取其標準輸入以獲取說明,那麼這不會是問題。如果它無法讀取 stdin 並退出,那麼awk
也會退出。
解決這個問題的傳統方法是使用close()
管道,以便下一次呼叫啟動一個新的:
tcpdump -Alq port 1700 | awk '
BEGIN { mypipe="/path/to/blink_led 18"; }
/rxpk/ { print | mypipe; close(mypipe); }'
system()
也很好,正如 @heemayl 所建議的(如果blink_led
根本沒有興趣閱讀 stdin,可能會更好)。
您會注意到我使用-l
而不是-U
,-l
刷新標準輸出,以避免在您想要的輸出在 stdio 緩衝區中等待時暫停(當您用於寫入檔案-U
時啟用整個資料包刷新)。-w