ports/package周りの定期作業をperiodicで。

FreeBSDを長く運用していると、/usr/ports/distfiles配下に、portsで使うソースファイルがだんだんと溜まっていき、ディスク容量を圧迫する。
なので俺はportupgradeをインストールするとついてくるportscleanを、一週間に一度実行している。

具体的には、portscleanにC, D, Pオプションを与えて実行する。これらのオプションで、それぞれ下記3つの掃除をする。

  • Cオプション:portsのインストールの際に、make cleanし忘れてたとかとかで残ってしまったworkディレクト
  • Dオプション:バージョンアップで不要となったportsのソースファイル
  • Pオプション:バージョンアップで不要となったpackage


で、これを定期的に実行させるわけだが、FreeBSDでは特定のディレクトリにスクリプトを置いておけば、決められた間隔ごとに実行してくれる仕組みがある。

それがperiodicで、マニュアルはここにあるが、簡単に言うと、periodicはシステムcronから呼び出されて、あるディレクトリ内にあるスクリプトを実行するシェルスクリプトである。

マニュアルにも書いてあるが、/etc/crontabにはこのような記載がある。

# do daily/weekly/monthly maintenance
0      2       *       *       *       root    periodic daily
0      3       *       *       6       root    periodic weekly
0      5       1       *       *       root    periodic monthly

/etc/periodic、/usr/local/etc/periodicの配下には、daily, weekly, monthlyというディレクトリがあり、periodicは日ごと、週ごと、月ごとにcronから呼び出され、それぞれdaily、weekly、monthly配下のスクリプトを実行する、という仕組み。


というわけで、/usr/local/etc/weekly/998.portscleanなどとして、下記のようなファイルを置いてみた。chmod 755しておくのを忘れずに。

#!/bin/sh

if [ -x /usr/local/sbin/portsclean ]; then
      /usr/local/sbin/portsclean -CDP && rc=0 || rc=1
else
      rc=1
fi

exit $rc

正常終了時に0を、それ以外は1を返すようにしているのは、マニュアルを見ればわかるが、各スクリプトの返り値によって動作が変わるから。

なお、通常であれば実行結果はrootへmailされるが、/etc/periodic.confとして下記の内容を記載しておけば、/var/log配下にログを書き出してくれる。
これもマニュアルに記載あり。

daily_output=/var/log/daily.log
weekly_output=/var/log/weekly.log
monthly_output=/var/log/monthly.log

俺はこっちにしておいた。


さておき、これで一週間に一度portscleanが実行されるようになる。
注意すべきは、portsのmakeと上記の定期実行がかぶると、portsのmakeをやり直さなければならない点。
先述のcrontabをみればわかるが、毎週土曜日の午前3時に実行されるので、ここをまたいでportsのmakeをするときは、スクリプトの実行属性を落としておくなどの処置が必要。
というか、そもそもスクリプトでそのあたりを判断すればいいのだが、俺にはそんなスクリプトは書けないので。