【问题标题】:dummy filesize after do "cat /dev/null > logfile.log"执行“cat /dev/null > log file.log”后的虚拟文件大小
【发布时间】:2013-11-28 11:28:07
【问题描述】:

我需要清除日志文件的内容。然后我尝试使用“cat /dev/null > logfile”。 事实上,它有效! 但是有一种我无法理解的奇怪行为。清除文件后立即显示为0字节的大小,但经过一次修改后,大小又恢复到以前的值。使用“du”我可以看到这个值是错误的。 我做对了吗?我该如何纠正?

我的猫命令:

jorplov@sg0080b:/applications/fsc/base/logs> ls -lah
-rw-r--r-- 1 jorplov svcusr  10G 2013-11-15 05:18 sg0080b_jorplov_startup.log


jorplov@sg0080b:/applications/fsc/base/logs> df -h .
Filesystem            Size  Used Avail Use% Mounted on
/dev/mapper/vg00-fsc  2.0G  1.8G   90M  96% /applications/fsc


jorplov@sg0080b:/applications/fsc/base/logs> cat /dev/null > sg0080b_jorplov_startup.log


jorplov@sg0080b:/applications/fsc/base/logs> df -h .
Filesystem            Size  Used Avail Use% Mounted on
/dev/mapper/vg00-fsc  2.0G  365M  1.6G  20% /applications/fsc


jorplov@sg0080b:/applications/fsc/base/logs> ls -lah
total 20K
-rw-r--r-- 1 jorplov svcusr    0 2013-11-15 05:25 sg0080b_jorplov_startup.log

几秒钟后:

jorplov@sg0080b:/applications/fsc/base/logs> ls -lah
-rw-r--r-- 1 jorplov svcusr  10G 2013-11-15 05:26 sg0080b_jorplov_startup.log


jorplov@sg0080b:/applications/fsc/base/logs> stat sg0080b_jorplov_startup.log
  File: `sg0080b_jorplov_startup.log'
  Size: 10718153084     Blocks: 32         IO Block: 4096   regular file
Device: fd03h/64771d    Inode: 82380       Links: 1
Access: (0644/-rw-r--r--)  Uid: (30013/ jorplov)   Gid: (21459/  svcusr)
Access: 2013-11-15 05:34:00.000000000 +0100
Modify: 2013-11-15 05:34:12.000000000 +0100
Change: 2013-11-15 05:34:12.000000000 +0100

第二次尝试:

jorplov@sg0080b:/applications/fsc/base/logs> > sg0080b_jorplov_startup.log


jorplov@sg0080b:/applications/fsc/base/logs> stat sg0080b_jorplov_startup.log
  File: `sg0080b_jorplov_startup.log'
  Size: 0               Blocks: 0          IO Block: 4096   regular empty file
Device: fd03h/64771d    Inode: 82380       Links: 1
Access: (0644/-rw-r--r--)  Uid: (30013/ jorplov)   Gid: (21459/  svcusr)
Access: 2013-11-15 05:34:00.000000000 +0100
Modify: 2013-11-15 05:46:55.000000000 +0100
Change: 2013-11-15 05:46:55.000000000 +0100


jorplov@sg0080b:/applications/fsc/base/logs> ls -lah
-rw-r--r-- 1 jorplov svcusr    0 2013-11-15 05:46 sg0080b_jorplov_startup.log

几秒钟后再次:

jorplov@sg0080b:/applications/fsc/base/logs> stat sg0080b_jorplov_startup.log
  File: `sg0080b_jorplov_startup.log'
  Size: 10718153546     Blocks: 32         IO Block: 4096   regular file
Device: fd03h/64771d    Inode: 82380       Links: 1
Access: (0644/-rw-r--r--)  Uid: (30013/ jorplov)   Gid: (21459/  svcusr)
Access: 2013-11-15 05:34:00.000000000 +0100
Modify: 2013-11-15 05:53:12.000000000 +0100
Change: 2013-11-15 05:53:12.000000000 +0100


jorplov@sg0080b:/applications/fsc/base/logs> ls -lah
-rw-r--r-- 1 jorplov svcusr  10G 2013-11-15 05:53 sagm061_jorplov_startup.log


jorplov@sg0080b:/applications/fsc/base/logs> du -h sagm061_jorplov_startup.log
16K     sagm061_jorplov_startup.log

【问题讨论】:

  • cat /dev/null 放到cat /dev/null > something 中,直接使用> something
  • 我也已经尝试过了,但我得到了相同的结果(请参阅上面代码中的“第二次尝试”)。似乎正在写文件的进程正在这样做。
  • 当然,我的评论并不是一个答案,而是一个改进脚本的一般提示。 @anubhava 的回答很到位,这只是一个旁注。

标签: linux bash shell unix suse


【解决方案1】:

这是由于将文本写入此日志文件的进程。

如果进程是这样​​写入日志的:

command > log.txt

并且您在外部截断日志,然后一旦command 将下一行添加到日志中,它将在前一个文件指针位置之后写入它并用空字节\0 从开始到该文件填充文件指针位置。因此,日志文件的大小将与您截断日志文件之前的大小相同。

解决方案:

但是如果日志被写成:

command >> log.txt

该日志将以“附加模式”写入。 在这种模式下,在写入下一行之前,它总是将文件指针移动到文件末尾,这样可以避免这种情况。您可以随时截断日志文件。

【讨论】:

  • 我刚刚发现我有一个 Java 进程正在编写这个文件:jorplov@sg0080b:/applications/fsc/base/logs> fuser sg0080b_jorplov_startup.log jorplov 19979 1 0 Sep20 ? 04:17:10 /usr/java/latest/bin/java jorplov@sg0080b:/applications/fsc/base/logs> lsof |grep sg0080b_jorplov_startup.log java 19979 jorplov 1w REG 253,3 10718154932 82380 /applications/fsc/base/logs/sg0080b_jorplov_startup.log
  • 如果您在 Java 命令行中将 > 更改为 >>,它将表现良好。
猜你喜欢
  • 2015-11-03
  • 1970-01-01
  • 2013-01-13
  • 1970-01-01
  • 2011-03-25
  • 2011-01-12
  • 1970-01-01
  • 2016-09-26
  • 2014-04-06
相关资源
最近更新 更多