我有启动脚本,它调用产生大量输出的命令。为了保留空间我压缩了它的输出:
#!/bin/bash
my_command 2>&1 | tee >(gzip --stdout > "1.log.gz")
可悲的是,当我按 Ctrl + C 时,gzip
突然停止,压缩日志被破坏。有没有办法优雅地完成命令以获得有效的gz?
答案 0 :(得分:2)
我无法重现您的问题,使用“是”替代您的程序 - 即
yes 2>&1 | tee >(gzip --stdout > "1.log.gz")
每次创建完全有效的gz文件,所以想知道是否还有其他事情发生。
但是,您可以使用命名管道来隔离命令的两个部分,如下所示;
# create a named pipe
mknod mypipe p
# start a background job that reads from the pipe
gzip --stdout > "1.log.gz" <mypipe &
# now do work -- ctrl-c only affect this process
my_command 2>&1 | tee mypipe
答案 1 :(得分:0)
在您的示例中,您无法安全地破坏它,因为 Ctrl + C 将终止STDOUT
并且压缩无法成功完成。
如果STDOUT
无关紧要,请尝试使用
my_command &>/dev/null | tee >(gzip > "1.log.gz")