阅读我想创建一个运行的每个第一个接收管道线路上的其它脚本的脚本。 像这样:从无休止的管庆典
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 –
...但是,要确定地说话而不是“可能”和“不太可能”,我们需要一个完整的重现器。 –