閱讀我想創建一個運行的每個第一個接收管道線路上的其它腳本的腳本。 像這樣:從無休止的管慶典
journalctl -f | myScript1.sh
這myScript1.sh
將運行一個又一個這樣的:
./myScript2.sh $line_in_pipe
的問題,我發現每天我測試的代碼只是運行良好,在有限的管道(直到EOF
)。 但是,當我管道tail -f
或其他程序,它只是不會執行。我認爲它只是等待EOF
執行循環。
編輯: 無盡的管道是這樣的:
tail -f /var/log/apache2/access.log | grep -Eo '[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}' | script_ip_check.sh
等script_ip_check.sh的想法是做這樣的事情:
#!/bin/bash
for line in $(cat); do
echo "process:$line"
nmap -sV -p1234 --open -T4 $line | grep 'open' -B3 | grep -Eo '[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}' >> list_of_ip_mapped &
done
的每一行,這種情況下IP,我會產生一個nmap的線程來掃描該主機上的特殊內容。 我將使用它來掃描試圖連接服務器上某個「隱藏」端口的IP。 所以我的腳本必須一直運行,直到我取消它或它收到一個EOF。
EDIT2: 我剛剛發現grep
刷新其緩衝區所以這就是爲什麼它不工作。 我使用--line-buffered
強制grep
輸出每一行,因爲它正在處理。
不可能,它根本不運行。更有可能在做任何事之前等待一個完整的緩衝區。 –
另請參閱BashFAQ#9:http://mywiki.wooledge.org/BashFAQ/009 –
...但是,要確定地說話而不是「可能」和「不太可能」,我們需要一個完整的重現器。 –