Question

I need to clear the content of an logfile. Then I tryed to use "cat /dev/null > logfile". In fact, it works! But there is a strange behavior who I can't understand. Immediatelly after clear the file is the size been displayed as 0 bytes, but after a single modification, the size came back to the previous value. With a "du" i can see that this value is wrong. Am I doing it right? How can I correct it?

my cat command:

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

after a few seconds:

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

a second try:

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

again, few seconds later:

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
Was it helpful?

Solution

It is due the to process that is writing text into this log file.

If the process is writing into logs like this:

command > log.txt

And you truncate the logs externally then as soon as next line is added by command into log it will write it after previous file pointer position and fill the file with null bytes \0 from start to that file pointer position. Therefore size of log file will become same as it was before you truncated the log file.

Solution:

However if log is being written as:

command >> log.txt

That log will be written in "append mode". In this mode before writing next line it will always move the file pointer to the end of file and that will avoid this situation. You can truncate the log file anytime.

Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top