长时间运行的脚本停止将输出发送到文件

长时间运行的脚本停止将输出发送到文件

我有一个脚本,用于以 10 秒的间隔捕获服务器的某些状态。

脚本如下:

for (( ; ; ))
do
    /usr/local/apache/bin/apachectl fullstatus
    sleep 10
done

我正在使用以下命令运行脚本:

nohup /path/to/scriptname.sh | gzip > logfile.log.gz &

如果我与 ssh 断开连接,它将在后台运行并继续运行。但是,大约 3-4 小时后,输出停止传输到日志文件。该脚本仍在运行,并且如果我运行 ps -elf | 就会显示出来grep scriptname,但日志文件不更新。为什么输出停止发送?这可能是缓冲区的问题吗?

答案1

gzip文件格式有一个 8 字节的页脚,其中包含 CRC-32 校验和和未压缩的数据长度。这压缩文件格式是面向块的。管道中的程序gzip几乎肯定会缓冲输入以在下一个输出块中使用。直到长时间运行的 shell 脚本退出gzip并且 的 stdin 关闭之后才会写入 8 字节页脚。我想你必须等待很长一段时间才能看到 DEFLATE 块是否没有定期写入日志文件。

相关内容