プロセスが吐き出しているログをクリアするには cp /dev/null access.log
という手がよく使われる。吐き出しているプロセスを再起動せずに中身をクリアできるので便利である。こんな感じ:
$ (while true; do sleep 1; date; done) > a.log ^Z [1] + Stopped (while true; do sleep 1; date; done) $ cat a.log Thu Jun 18 20:00:40 JST 2009 Thu Jun 18 20:00:41 JST 2009 Thu Jun 18 20:00:42 JST 2009 Thu Jun 18 20:00:43 JST 2009 $ ls -li a.log 265104 -rw-r--r-- 1 matobaa matobaa 116 Jun 18 20:00 a.log $ cp /dev/null a.log $ ls -li a.log 265104 -rw-r--r-- 1 matobaa matobaa 0 Jun 18 20:01 a.log $ fg (while true; do sleep 1; date; done) ^Z [1] + Stopped (while true; do sleep 1; date; done) $ cat a.log Thu Jun 18 20:01:06 JST 2009 Thu Jun 18 20:01:07 JST 2009 Thu Jun 18 20:01:08 JST 2009 Thu Jun 18 20:01:09 JST 2009 $ ls -li a.log 265104 -rw-r--r-- 1 matobaa matobaa 232 Jun 18 20:01 a.log
しかしよく見ると、ファイルの中身はいったんクリアされているように見えて、ファイルサイズは以前の続きになっているように見える。確認してみると:
$ dd if=a.log bs=1 count=120 | od -x 120+0 records in 120+0 records out 120 bytes (120 B) copied, 0.000127283 s, 943 kB/s 0000000 0000 0000 0000 0000 0000 0000 0000 0000 * 0000160 0000 0000 6854 2075 0000170
ファイルの先頭がゼロ埋めされた状態になっているみたい。
最初と同じことをちょっと違うやり方でやってみる:
$ (while true; do sleep 1; date; done) >> a.log
^Z
[1] + Stopped (while true; do sleep 1; date; done)
$ cat a.log
Thu Jun 18 20:05:51 JST 2009
Thu Jun 18 20:05:52 JST 2009
Thu Jun 18 20:05:53 JST 2009
Thu Jun 18 20:05:54 JST 2009
$ ls -li a.log
266380 -rw-r--r-- 1 matobaa matobaa 116 Jun 18 20:05 a.log
$ cp /dev/null a.log
$ ls -li a.log
266380 -rw-r--r-- 1 matobaa matobaa 0 Jun 18 20:06 a.log
$ fg
(while true; do sleep 1; date; done)
^Z
[1] + Stopped (while true; do sleep 1; date; done)
$ cat a.log
Thu Jun 18 20:06:18 JST 2009
Thu Jun 18 20:06:19 JST 2009
Thu Jun 18 20:06:20 JST 2009
Thu Jun 18 20:06:21 JST 2009
$ ls -li a.log
266380 -rw-r--r-- 1 matobaa matobaa 116 Jun 18 20:06 a.log
何が違うかというと、一行目が >
か >>
なのか、だけが違う。それだけなのに、最終的なファイルサイズが違う。
オレは Ubuntu で確認してるけど、HP-UXでも同じらしい。
こんな結果になった:
$ (dd if=/dev/zero bs=1000000 count=500; while true; do sleep 1; date; done) > a.log 500+0 records in 500+0 records out 500000000 bytes (500 MB) copied, 11.8432 s, 42.2 MB/s ^Z [1] + Stopped (dd if=/dev/zero bs=1000000 count=500; while true; do sleep 1; date; done) $ ls -li a.log 265104 -rw-r--r-- 1 matobaa matobaa 500000116 Jun 18 20:31 a.log $ df . Filesystem 1K-blocks Used Available Use% Mounted on /dev/sda1 7913216 3753640 3760764 50% / $ cp /dev/null a.log $ ls -li a.log 265104 -rw-r--r-- 1 matobaa matobaa 0 Jun 18 20:31 a.log $ df . Filesystem 1K-blocks Used Available Use% Mounted on /dev/sda1 7913216 3264872 4249532 44% / $ fg (dd if=/dev/zero bs=1000000 count=500; while true; do sleep 1; date; done) ^Z [1] + Stopped (dd if=/dev/zero bs=1000000 count=500; while true; do sleep 1; date; done) $ ls -li a.log 265104 -rw-r--r-- 1 matobaa matobaa 500000232 Jun 18 20:32 a.log $ df . Filesystem 1K-blocks Used Available Use% Mounted on /dev/sda1 7913216 3264884 4249520 44% /
ls
の結果とdf
の結果が食い違っているようにも見える。なお、ファイルシステムはext3。