l1z*_*ard 27
我认为这项任务可以通过 sed
sed -i '1,10d' myfile
Run Code Online (Sandbox Code Playgroud)
将消除从1行第一至10个线形式的文件。
我认为每个人至少应该看看这个 sed 1 liners。
请注意,这不适用于应用程序主动附加的日志文件(如问题中所述)。
sed -i将创建一个新文件并“删除”正在写入的文件。大多数应用程序将继续将日志记录写入已删除的日志文件,并将继续填充磁盘空间。新的、被截断的日志文件不会被附加到。这只会在应用程序重新启动或以其他方式关闭并重新打开其日志文件时停止。如果在使用 sed 和应用程序重新启动之间存在任何可记录的活动,那么新日志文件中将出现一个间隙(丢失日志记录)。
一种安全的方法是停止应用程序,使用 sed 截断日志,然后重新启动应用程序。对于某些服务(例如具有高吞吐量和高服务连续性要求的 Web 服务器),这种方法可能是不可接受的
Red*_*ick 13
不,像 Linux 这样的操作系统及其文件系统不会从文件的开头删除数据。换句话说,文件的存储起点是固定的。
从文件开头删除行通常是通过将剩余数据写入新文件并删除旧文件来完成的。如果程序打开旧文件进行写入,则该文件的删除将推迟到应用程序关闭该文件。
正如评论者所指出的,由于我在前一句话中给出的原因,您通常需要与编写日志的程序协调日志文件修剪。具体如何执行取决于程序。当您向它们发送信号(例如 HUP)时,某些程序将关闭并重新打开它们的日志文件,这可用于防止将日志记录写入“已删除”的日志文件,而不会中断服务。
有许多实用程序可用于管理日志文件的大小,例如logrotate
有些程序有自己的实用程序。例如,Apache 网络服务器包含一个rotatelogs实用程序。
这是一个答案,而不是解决方案。这个问题没有答案。询问者明确指出: “来自应用程序主动附加的日志”。 您可以继续阅读以了解更多信息,并跳到最后查看我根据我的推测为什么此代码不遵循日志记录最佳实践而提出的建议。
需要明确的是:这里的其他“答案”提供了虚假的承诺。再多的重命名也不会诱使应用程序使用新文件。最有用的信息隐藏在对这些错误答案的评论中。
活动文件不是您简单地将数据放入其中的某种容器。文件名指向一个 inode(文件的开头),每个 inode 都有一个指向另一个 inode 的指针(如果有更多数据)。这意味着不断写入的文件会不断添加索引节点流,而您所认为的“文件”实际上是索引节点的日志序列。
想象一下,您正在 Google 地图上跟踪某人,而该人可以随时传送到世界任何地方,而您正试图将这些点连接起来。
Linux 工具“截断”可以丢弃文件末尾的数据,只需遍历 inode 树(在您指定的位置/大小),它将丢弃堆栈中的所有后续指针。相反,在文件开头丢弃数据将是一个实时重写 inode 树的非常复杂和危险的过程,没有人会为公众编写这样的工具,因为它们经常会失败并导致数据丢失。Inodes wiki很短,但解释了其中一些概念。
回到你的问题:这可能是一个内部应用程序(否则有人已经贡献了一个补丁来修复)。标记此行为以进行代码审查,因为这不遵循日志记录最佳实践。探索可能的影响..您是否正在拼命阻止因磁盘已满而导致的中断?这应该是在审查中记录的场景,作为风险。
不可以。解决日志文件增长这一一般问题的方法是日志轮换。这涉及定期(通常每晚或每周)将现有日志文件移动到其他文件名,并从空日志文件重新开始。一段时间后,旧的日志文件会被丢弃。
见:http : //www-uxsup.csx.cam.ac.uk/~jw35/courses/apache/html/x1670.htm
| 归档时间: |
|
| 查看次数: |
60224 次 |
| 最近记录: |