Solved

Clear contents of a file

Posted on 2007-03-28
7
1,658 Views
Last Modified: 2013-12-27
Let's say that I have a Java program running, with its standard output directed to a log file:

java MyJavaProgram > stdout.log

This program will keep on running. To ensure that the log file does not grow very big, I am trying to write a script to remove the contents of the file. I tried two ways:

echo "" > stdout.log

cp /dev/null stdout.log

But in both cases, they are writting a lot of null characters into the log file. The file does not shrink at all. The contents are merely replaced with null characters.

How can I achive what I want? Thanks.
0
Comment
Question by:integrosys
7 Comments
 
LVL 5

Expert Comment

by:mdrichards
ID: 18814032
You could remove the file then "touch" it

rm -f stdout.log
touch stdout.log

This is probably not the most ideal scenario as you "may" need to reset user / group permissions.
0
 
LVL 48

Expert Comment

by:Tintin
ID: 18814153
You can only reliably truncate a file when it's not being written to.

Do you have any control over the java program, ie: can you restart it?

Easiest way to truncate a file is

>stdout.log
0
 

Author Comment

by:integrosys
ID: 18814216
Thanks guys. Actually I found that these two lines:

echo "" > stdout.log
cp /dev/null stdout.log

will work if the Java program is started this way instead:

java MyJavaProgram >> stdout.log
0
Is Your AD Toolbox Looking More Like a Toybox?

Managing Active Directory can get complicated.  Often, the native tools for managing AD are just not up to the task.  The largest Active Directory installations in the world have relied on one tool to manage their day-to-day administration tasks: Hyena. Start your trial today.

 
LVL 22

Accepted Solution

by:
blu earned 50 total points
ID: 18844166
The problem you were seeing in the first instance is that the java program's file pointer continues to point to the same block that it is writing to even after you have truncated the file. Thus when it writes again, it writes to the same block it would have written to before you truncated. This actually does not fill in the file with nulls, it only appears to. It actually transforms the file into a sparse file. It will not actually allocate storage blocks for the intervening null blocks. If space is your only concern, then this may be enough.

You can see why converting to >> work though. The >> says to append to the file, which means that all blocks are written to the end of the file. This means that once the file is truncated, the end of the file becomes the beginning as it were.
0
 
LVL 9

Expert Comment

by:yongsing
ID: 18844354
Hi blu, what is a sparse file? You said that it does not allocate storage blocks. But when I use the ls command, I notice that the file size never decreases.
0
 
LVL 48

Expert Comment

by:Tintin
ID: 18847201
If you use

du -sh file

You'll see the real size of the file.
0
 
LVL 22

Expert Comment

by:blu
ID: 18852087
Or use "ls -ls"
0

Featured Post

Enterprise Mobility and BYOD For Dummies

Like “For Dummies” books, you can read this in whatever order you choose and learn about mobility and BYOD; and how to put a competitive mobile infrastructure in place. Developed for SMBs and large enterprises alike, you will find helpful use cases, planning, and implementation.

Question has a verified solution.

If you are experiencing a similar issue, please ask a related question

Suggested Solutions

I have been running these systems for a few years now and I am just very happy with them.   I just wanted to share the manual that I have created for upgrades and other things.  Oooh yes! FreeBSD makes me happy (as a server), no maintenance and I al…
Java performance on Solaris - Managing CPUs There are various resource controls in operating system which directly/indirectly influence the performance of application. one of the most important resource controls is "CPU".   In a multithreaded…
Learn how to find files with the shell using the find and locate commands. Use locate to find a needle in a haystack.: With locate, check if the file still exists.: Use find to get the actual location of the file.:
This video shows how to set up a shell script to accept a positional parameter when called, pass that to a SQL script, accept the output from the statement back and then manipulate it in the Shell.

803 members asked questions and received personalized solutions in the past 7 days.

Join the community of 500,000 technology professionals and ask your questions.

Join & Ask a Question