Linux 蓄積されていくログディレクトリなどを定期的に削除する例(findを利用)

findを利用して、30日以前のディレクトリを削除する方法を示します。

Delete old data.

1). aaa フォルダ配下の30日以上前のディレクトリを backup フォルダへ移動 find ./aaa -type d -mtime +30 | xargs mv --target-directory=./backup

2).30日以上前のディレクトリを強制削除 find . -type d -mtime +30 | xargs rm -fr

危険なので、2)が望ましいとは思います

ファイルを消しても消えないことがある!!

なんでこうなるのか? Linux/Unixでは、ls/find等で一覧表示されなくてもプロセスがつかんでいる状況では 実際にはファイルシステムから削除されておらず、見えなくなる。 OSを再起動するとファイルシステム使用量が減るのは、表面上は見えないくプロセスが つかんでいるファイルを再起動によるプロセスにより、開放してくれる。

このような現象はプログラムバグでファイルクローズのしわすれ等の場合に発生する ことがあります。

対応方法 †

このようなとき以下ように lsof コマンドでどのプロセスがつかんでいるか確認し、 そのプロセスを終了(kill)させることで対応できます。

$ df -k . Filesystem 1K-ブロック 使用 使用可 使用% マウント位置 /dev/sdb1 988212 115412 822600 13% /mnt/sdb1
find . -ls
2 4 drwxr-xr-x 3 root root 4096 1月 19 14:54 .
11 16 drwx------ 2 root root 16384 1月 19 13:55 ./lost+found
$ lsof | grep /mnt/sdb1
bash 1910 root cwd DIR 8,17 4096 2 /mnt/sdb1
fileopen. 1932 root 3r REG 8,17 100000000 12 /mnt/sdb1/testfile.dat (deleted)
lsof 1938 root cwd DIR 8,17 4096 2 /mnt/sdb1
grep 1939 root cwd DIR 8,17 4096 2 /mnt/sdb1
lsof 1940 root cwd DIR 8,17 4096 2 /mnt/sdb1
$ ps auxww | grep 1932 | grep -v grep
root 1932 0.0 0.2 6664 1520 pts/0 S+ 14:54 0:00 /usr/bin/perl /root/fileopen.pl
kill 1932
$ find . -ls
2 4 drwxr-xr-x 3 root root 4096 1月 19 14:54 .
11 16 drwx------ 2 root root 16384 1月 19 13:55 ./lost+found