Ubuntu 为什么不呢;“尾巴”;是否要截断日志文件?

Ubuntu 为什么不呢;“尾巴”;是否要截断日志文件?,ubuntu,Ubuntu,我正在尝试使用cron脚本管理日志文件大小。我基本上每晚都想删除日志文件的最后2000行。我正在尝试运行此命令,但它似乎在清空整个文件,而不是执行我想要的操作: tail-2000 logfile.txt>logfile.txt 有人知道为什么这不起作用和/或如何实现我想要的吗?谢谢 在tail开始读取文件之前,您正在覆盖该文件。shell通过首先清除文件来处理重定向操作符。然后它运行tail,它没有可读取的数据 您可以使用临时文件解决此问题: tail -2000 logfile.txt &g

我正在尝试使用cron脚本管理日志文件大小。我基本上每晚都想删除日志文件的最后2000行。我正在尝试运行此命令,但它似乎在清空整个文件,而不是执行我想要的操作:

tail-2000 logfile.txt>logfile.txt


有人知道为什么这不起作用和/或如何实现我想要的吗?谢谢

tail
开始读取文件之前,您正在覆盖该文件。shell通过首先清除文件来处理
重定向操作符。然后它运行
tail
,它没有可读取的数据

您可以使用临时文件解决此问题:

tail -2000 logfile.txt >logfile.tmp
mv logfile.tmp logfile.txt

Greg Hewgill是对的,logfile.txt在tail处理之前就被截断了

尝试:


您可能希望使用
logrotate
来寻找更健壮的解决方案,而不是使用您自己的cron文件。您可以旋转日志,控制日志的保存时间,通过电子邮件发送日志,压缩旧日志,然后运行脚本(如果需要)

请参阅手册页 或者从命令行键入
man logrotate

在/etc/logrotate.d/目录中创建一个新的logrotate文件。下面是一个例子:

/var/logs/myapp/logfile.txt {
  # keep the 5 latest rotations of the log 
  rotate 5
  # rotate once the file is bigger than 2k
  size 2k
  # don't error if the file isn't there
  missingok
  # compress rotated (old) log files
  compress
  # set ownership and permissions on the new log file
  create 0640 myuser myuser
}

如果进程保持日志文件打开,则接受的解决方案存在问题;您基本上需要重用i节点。罗宾斯的回答很好,logrotate应该做正确的事情

要使用tail,您可以做一些事情(类似于Pantonza和Greg的想法),但通过在适当位置截断原始文件来保留原始文件:

tail -2000 logfile.txt >logfile.tmp
cat logfile.tmp > logfile.txt
rm logfile.tmp
为了避免临时文件,您可以读入一个变量,然后重新填充:

bash -c 'X=$(tail -2000 logfile.txt);echo "$X">logfile.txt'

在所有情况下,截断和附加到文件的进程之间都可能存在竞争条件。不确定logrotate是否能处理该问题,此处的尾部解决方案都不能处理。

这里是另一个解决方案,不处理tmp文件:

echo "`tail -2000 logfile.txt`" > logfile.txt

如果您是vim用户,那么另一个选项是使用
vi
而不是
tail
,直接对文件进行操作:

vi "+execute \"normal! G2000kO\<esc>dgg\"" "+w" "+q" logfile.txt
vi“+执行\”正常!G2000kO\dgg\“”“+w”“+q”logfile.txt
字符串
G2000kO\dgg
就是您使用vi执行此操作时使用的键盘输入(必须转义转义按钮)。它的使用非常直观,涵盖了大量的用例


vi还处理大型(10+GB)文本文件,甚至不会减慢速度,因此这种方法非常健壮

>logfile.txt
-表示创建新文件是,但如果文件名与输入相同,则会覆盖该文件。仅当写入日志文件的进程关闭其文件描述符时,此操作才有效。典型,但不总是正确的。在这种情况下,
rm
是不必要的,因为
mv
将在重命名期间取消与目标文件的链接。右。。。我只是多余的:p只有当写入日志文件的进程关闭其文件描述符时,这才有效。很典型,但并不总是正确的。这是不正确的,NVRAM。即使进程未关闭其FD,它也会工作。它确实会无误地截断文件。但是日志记录过程可能没有意识到文件替换,日志记录可能会停止工作,直到[新]文件重新打开。我遇到的问题是,我试图用打开的文件描述符截断一个文件。所以tmp文件不是一个选项。谢谢
vi "+execute \"normal! G2000kO\<esc>dgg\"" "+w" "+q" logfile.txt