2009-06-18 [長年日記]

[未解決] cp /dev/null access.log でログを削減できない。なぜ?

プロセスが吐き出しているログをクリアするには 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。

[]

«前の日記(2009-06-15) 最新 次の日記(2009-07-02)»