CubicLouve

Spring_MTの技術ブログです。https://github.com/SpringMT (http://spring-mt.tumblr.com/ からの移転)

tmpwatchについて

よく忘れるので、整理しておく。

tmpwatchコマンド

コマンドは/usr/sbin/配下にあります。
使い方は下記の通り。

$ tmpwatch [option] [hours]  [dirs]

dirsの指定にはワイルドカード(*)が使えます。
基本的に空dir、ファイル、シンボリックリンクを削除するそうです。
root のファイルは消さない、シンボリックリンクをたどって削除することもないそうです。

When changing directories, tmpwatch is very sensitive to possible race conditions and will exit with an error if one is detected. It does not follow symbolic links in the directories it’s cleaning (even if a symbolic link is given as its argument), will not switch filesystems, skips lost+found directories owned by the root user, and only removes empty directories regular files, and symbolic links. 

オプション

man tmpwatch の内容

-u, --atime : 最終アクセス時刻  
-m, --mtime : 最終ファイル変更時刻  
-c, --ctime : 最終inode変更時刻(パーミッション、所有者、グループ、または他のメタデータが変更された時刻)  
-M, --dirmtime : 最終dir修正時刻  
-a, --all :全てのファイルタイプを削除する。  
-d, --nodirs : 空dirであってもdirを削除しない。  
-l, --nosymlinks :symbolic link は削除しない  
-f, --force : rootであっても削除する。  
-q, --quiet : エラー時のみ、ログを出す。  
-s, --fuser : ファイルを開いているか確認。  
-t, --test : test。実際には削除しない。  
-U, --exclude-user=user : ここで指定したuserが所有しているファイルは削除対象外。  
-v, --verbose : 詳細なログ表示。  
-x, --exclude=path : ここで指定したパスは削除対象外。  
-X, --exclude-pattern=pattern :ここで指定したパターンに一致すれば削除対象外。 

-umcとすると、上記3つの中の最大値(最新時刻)が削除判定のベースとなる。下記参照

If the --atime, --ctime or --mtime options are used in combination, the decision about deleting a file will be based on the maximum of these times. The --dirmtime option implies ignoring atime of directories, even if the --atime option is used. 

試してみる

/usr/sbin/tmpwatch -tumcv 72 /home/*/logs/
tオプションをつけてdry-runをしてみる

$ /usr/sbin/tmpwatch -tumcv 72 /home/*/logs/
grace period is 259200
cleaning up directory /home/hoge/logs
cleaning up directory /home/hoge/logs/httpd
removing file /home/hoge/logs/httpd/www29204u.sakura.ne.jp.error_log.20110506
removing file /home/hoge/logs/httpd/www29204u.sakura.ne.jp.access_log.20110506

tmpwatchをcronに登録

/etc/cron.daily/tmpwatchには↓のように既に登録されていいるものがあります。

$ less /etc/cron.daily/tmpwatch
flags=-umc
/usr/sbin/tmpwatch "$flags" -x /tmp/.X11-unix -x /tmp/.XIM-unix 
        -x /tmp/.font-unix -x /tmp/.ICE-unix -x /tmp/.Test-unix 
        -X '/tmp/hsperfdata_*' 240 /tmp
/usr/sbin/tmpwatch "$flags" 720 /var/tmp
for d in /var/{cache/man,catman}/{cat?,X11R6/cat?,local/cat?}; do
    if [ -d "$d" ]; then
        /usr/sbin/tmpwatch "$flags" -f 720 "$d"
    fi
done

ここに

/usr/sbin/tmpwatch "$flags" 240 /home/*/hoge

for d in `ls /home/`; do
    if [ -d "/home/$d/foo/bar" ]; then
    /usr/sbin/tmpwatch "$flags" 240 "/home/$d/foo/bar";
    fi
done

みたいに追記すればよいと思います。

参考にしたサイト

ameblo.jp

Stray Penguin - Linux Memo (logrotate)

nageyari.dig-it-all.jp