【发布时间】:2014-11-18 00:42:07
【问题描述】:
我正在将一个正在创建的 LOGFILE 复制到远程服务器。
tail -f LOGILE | gzip -c >> /faraway/log.gz
然而,当原来的 LOGFILE 被关闭,并移动到一个存储目录时,我的 tail -f 似乎得到了一些奇怪的数据。
如何确保 tail -f 完全停止并且压缩文件 /faraway/log.gz 是 LOGFILE 的真实副本?
编辑 1
我做了更多的挖掘。
/faraway/log.gz 严重终止 - 在 FIX 消息中途终止。这一定是因为我 ctrlCed 上面的整个管道命令。
如果忽略最后一行,那么原始 LOGFILE 和 log.gz 完全匹配!这是跨大西洋传输的 40G 文件。
我对此印象深刻,因为它完全符合我的要求。有没有读者认为我在这种情况下只是“幸运”——这可能不会在未来起作用吗?
现在,我只需要彻底关闭 gzip。也许按照下面的建议向尾部 PID 发送 kill -9 可能确实允许 GZIP 正确完成其压缩。
【问题讨论】:
-
你能为这种情况定义“奇怪的数据”吗?另外 LOGFILE 是如何“关闭”的?
tail -f将继续从文件中读取,即使您mv它也是如此。您需要给tail一些停止关注该文件的理由。 -
如果您想要一个完整且完整的文件副本,
tail -f是适合这项工作的错误工具,一劳永逸。除非您保证在开始该过程时它是空的,否则您甚至都可能赶上开始 - 除非您的gunzip实现是在期望压缩流重新启动的情况下构建的,你也会在那里得到惊喜。 -
@EtanReisner 似乎缺少一两行。一旦 LOGFILE 被移动,我就用 ctrl-c 终止该进程。我需要发送 tail -f 一个信号来说明 LOGFILE 已完成 - 让 gzip 特写。
-
@ManInMoon,它似乎只能正常工作,因为您也没有测试过其他极端情况。存在用于远程日志记录的专用工具。使用它们。
-
如果您可以控制所有修改/访问/删除文件的程序,我相信
tail可以达到您的目的。您的描述更清楚,但需要更多说明。也许您可以将您的目标与此类似:程序 A @机器 A 写入日志文件 X,程序 B @机器 A 读取日志文件 X,等等。他们将以什么顺序写入/读取/删除/移动,@ 987654328@ 命令适合,在序列中,以及在哪个程序中......(如tail在程序 B @ 主机 B 中)......等等。而不是说“我正在复制......”,我更喜欢“程序 A 正在复制...”
标签: bash unix cygwin gzip tail