【发布时间】:2013-05-30 23:24:06
【问题描述】:
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 x 1G 文件然后终止。它会这样做,但 buildpcap 会持续运行很长时间
我使用的实际命令如下:
buildpcap --feed 3 --start-datetimed $start --end-datetime $end --stdout | dumpcap -i - -w ./tmp.pcap -a 文件:10 -b 文件大小:10000000
我希望这是有道理的。
【问题讨论】:
-
你能简单解释一下你的 cmd1 和 2 是做什么的吗?如果你在 cmd2 (awk) 结束时尝试
yes |awk 'NR==100{exit}',yes命令也会结束。