Linux 使管道的左侧在右侧终止时终止

Linux 使管道的左侧在右侧终止时终止,linux,shell,pipe,Linux,Shell,Pipe,cmd1 | cmd2 当管道的接收命令终止时,如何使管道的发送命令终止 cmd1处理文件中的数据,其输出通过管道传输到cmd2 cmd2接收cmd1的输出,并自行进行一些处理,这些处理将输出到文件中。它有一个选项,可以在写入指定数量的字节后终止 我遇到的问题是,即使cmd2已终止,cmd1仍会继续执行,直到它处理了正在处理的文件中的所有数据 这可能需要很长时间,并且会减慢shell脚本的速度 具体说明我正在做的事情: “超级代理”网络探测设备正在捕获流量并将其存储在6小时环形缓冲区中的文件中

cmd1 | cmd2

当管道的接收命令终止时,如何使管道的发送命令终止

cmd1处理文件中的数据,其输出通过管道传输到cmd2

cmd2接收cmd1的输出,并自行进行一些处理,这些处理将输出到文件中。它有一个选项,可以在写入指定数量的字节后终止

我遇到的问题是,即使cmd2已终止,cmd1仍会继续执行,直到它处理了正在处理的文件中的所有数据

这可能需要很长时间,并且会减慢shell脚本的速度


具体说明我正在做的事情:

“超级代理”网络探测设备正在捕获流量并将其存储在6小时环形缓冲区中的文件中。这些是某种格式的原始捕获文件。专有命令可用于基于时间范围构建pcap文件。这是上面的cmd1,称为“buildpcap”

6小时的流量可以生成非常大(200GB+)的文件

我想将pcap总量限制在10GB,并将其拆分为1GB文件部分

我不能限制文件大小的输出,也不能使用buildpcap将其拆分为多个部分文件,但我可以将其输出到stdout而不是file,并将其传输到一个可以执行以下操作的命令:;在本例中,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是谁/什么,以及它的实现有多干净。例如,如果我

find / -type f | less
从第二个窗口“无pkill”我的发现终止

编辑:

将对该答案的评论与答案结合起来:


在这种情况下,我想您需要一个“看门狗脚本”,用于监视cmd2的进程状态,并在cmd2终止时终止cmd1。差不多

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

应该这样做。它将每秒钟检查一次cmd2,如果cmd2消失,则会杀死cmd1

如果
cmd1
cmd2
退出后尝试写入管道,它将收到
SIGPIPE
信号。默认响应是退出(尽管可能写入
cmd1
以不同方式处理信号)

但是,如果
cmd1
正忙于做其他事情,并且没有尝试写入管道,则不会通知它已退出
cmd2
。这里有一个解决方法:

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

您能否简短地解释一下cmd1和CMD2的功能?如果在cmd2(awk)结束时尝试
yes | awk'NR==100{exit}'
,则
yes
命令也会结束。buildpcap(网络探测器上的专有命令为cmd1)和dumpcap(来自wireshark的命令为cmd2)。我认为buildcap写得不好。有些选项效果很差,所以我猜它没有得到很好的实现。当cmd1实施不佳时,有哪些选项-在这种情况下,我想您需要一个“看门狗脚本”,用于监视cmd2的进程状态,并在cmd2终止时终止cmd1。类似于watch-n5'pgrep cmd2 | | pkill cmd1'的功能应该可以。它将每隔秒钟检查一次cmd2,如果cmd1不见了,它将杀死它。@tink为什么不把它变成一个答案呢?Thx-我将尝试一下,尽管它看起来确实有点混乱:-)
{ cmd2 < cmd1-to-cmd2; kill $cmd1PID; } &