FreeBSDの定期実行コマンドで一時ファイルを削除する

2018年6月1日

最近のFreeBSDでは/tmpディレクトリの中身を定期的に掃除してくれない設定がデフォルトのようです。設定を変更して古いファイルを削除するようにしましょう。

periodic.confファイルで指定

/etc/periodic.confファイルに次の一文を加えればOK。もしファイルが存在しなければ新規作成しましょう。

daily_clean_tmps_enable="YES"

これで/tmpディレクトリ下にある3日以上前の一時ファイルが毎朝削除されるようになります。もしも違うディレクトリで実行したければ以下も合わせて追記します。複数指定したい場合は半角スペースで区切って羅列します。

daily_clean_tmps_dirs="/tmp"

また残したい日数を変更したい場合は以下を追記して日付を書き換えます。

daily_clean_tmps_days="3"

これで明日以降、古い一時ファイルがどんどん削除されるようになります!

デフォルト設定は/etc/defaultsにある

実際の動作を少し細かく説明すると、先ほど指定した内容はデフォルトの設定値が書き込まれている/etc/defaults/periodic.confの値を上書きしています。

一時ファイル削除に関するデフォルト値はこのようになっています。

# 110.clean-tmps
daily_clean_tmps_enable="NO"                            # Delete stuff daily
daily_clean_tmps_dirs="/tmp"                            # Delete under here
daily_clean_tmps_days="3"                               # If not accessed for
daily_clean_tmps_ignore=".X*-lock .X11-unix .ICE-unix .font-unix .XIM-unix"
daily_clean_tmps_ignore="$daily_clean_tmps_ignore quota.user quota.group .snap"
daily_clean_tmps_ignore="$daily_clean_tmps_ignore .sujournal"
                                                        # Don't delete these
daily_clean_tmps_verbose="YES"                          # Mention files deleted

2行目のdaily_clean_tmps_enableの値を”YES”にすると、一時ファイルが削除されるようになります。デフォルトに設定されているディレクトリや日数を上書きすれば細かくふるまいを変えることができます。

なお、設定ファイル先頭にコメントされているように直接/etc/defaults/periodic.confファイルを書き換えてはいけません。periodicコマンドは/etc/periodic.confで指定された値優先で動くので、デフォルト設定ファイルを編集する必要はありません。

また、この設定ファイルを読めば日毎だけでなく週毎、月毎にどんなことが設定できるかがわかります。

periodicコマンドのふるまい

periodicコマンド自身はcronに呼び出されて日毎/週毎/月毎にシェルスクリプトを定期実行します。

# Perform daily/weekly/monthly maintenance.
1 3 * * * root  periodic daily
15  4 * * 6 root  periodic weekly
30  5 1 * * root  periodic monthly

うちの/etc/crontabの設定では日毎が毎朝3時1分、週毎が毎土曜日の朝4時15分、月毎が毎月1日の朝5時30分に実行されるようになっていました。

periodicに渡される引数はスクリプトの入ったディレクトリですが、crontabにあるように絶対パス指定になっていない場合は/etc/periodic下にあるものとして解釈され、指定ディレクトリ内にある実行属性の付いたスクリプトを片っ端から実行してゆきます。

実際に/etc/periodic/dailyの中を覗いてみると、拡張子こそ.shではないものの実行属性のついたファイルがたくさんあります。

$ ll
total 128
drwxr-xr-x  2 root  wheel  1024 Jul 21  2017 .
drwxr-xr-x  6 root  wheel   512 Jul 21  2017 ..
-rwxr-xr-x  1 root  wheel  1285 Jul 21  2017 100.clean-disks
-rwxr-xr-x  1 root  wheel  1577 Jul 21  2017 110.clean-tmps
-rwxr-xr-x  1 root  wheel  1097 Jul 21  2017 120.clean-preserve
                       ~(中略)~
-rwxr-xr-x  1 root  wheel   728 Jul 21  2017 500.queuerun
-rwxr-xr-x  1 root  wheel   836 Jul 21  2017 510.status-world-kernel
-rwxr-xr-x  1 root  wheel  2808 Jul 21  2017 800.scrub-zfs
-rwxr-xr-x  1 root  wheel   802 Jul 21  2017 999.local

これらのシェルスクリプトが実行されると/etc/defaults/periodic.confや/etc/periodic.confの設定内容に沿ってコードが実行されるという仕組みです。

こんな感じで定期実行コマンドで一時ファイルが削除されるのです。