「cron」は、Unix/Linuxシステムで長年使われている定期実行プログラムです。カーニハン(Brian Kernighan)が関わった、このプログラムがなぜ40年以上経った今も現役で活躍しているのか、その魅力を具体的なコード例とともに解説します。
1. cronの基本的な仕組み
cronは、コマンドを定期的に自動実行させるツールです。
crontabというテキストファイルに、「いつ、何を実行するか」をシンプルな形式の表で設定します。
# 分 時 日 月 曜日 実行するコマンド
30 4 * * * /usr/bin/backup.sh
Code language: PHP (php)
この例では「毎日午前4時30分に、バックアップスクリプトを実行する」という意味です。「*」はすべての値に一致するワイルドカードです。
システム管理では、バックアップやログの整理、空き容量のチェックなど、定期的な処理があります。そういった処理を直感的にテキストで設定して自動実行させられるのが特長です。
# ログのローテーション(古いログを整理)を毎週日曜に実行
0 0 * * 0 /usr/sbin/logrotate
# ディスク使用状況をチェックして、空き容量が少なければメール通知(平日の朝9時)
0 9 * * 1-5 /usr/local/bin/check_disk_space.sh
Code language: PHP (php)
1.1. ユーザーごとの分離
各ユーザーが独自のcrontabファイルを持ち、権限に応じた自動実行ができる点も優れています。これは「最小権限の原則」という安全設計に合致しています。
# 一般ユーザーとして自分のcrontabを編集
crontab -e
# システム全体のcrontabを編集(管理者のみ)
sudo nano /etc/crontab
Code language: PHP (php)
2. 長年愛され続ける理由
cronが40年以上も使われ続けている理由は、「シンプルで、柔軟で、信頼性が高い」という点です。複雑なGUIツールより、テキストファイル1つで設定できるシンプルさが、多くのシステム管理者に支持されています。
近年は「systemdタイマー」など新しい代替品も登場していますが、cronのシンプルさと使いやすさは今でも多くの場面で重宝されています。
3. crontabファイルのパース設計
cronの美しさは、その設計にもあります。特にcrontabファイルのパース(解析)と実行判定の部分が優れています。
実際のコード例(簡略化したもの):
// crontabの時間フィールドをパースする関数
void ParseField(char *username, bitstr_t *bits, int low, int high,
char *names, char *tokens) {
// フィールドをビットマップに変換するコード
// 例: "1,3,5" → [1,0,1,0,1,0,0,...]
}
// ジョブの実行判定(典型的な実装)
if (line->cl_Mins[ptm->tm_min] &&
line->cl_Hrs[ptm->tm_hour] &&
(line->cl_Days[ptm->tm_mday] || line->cl_Dow[ptm->tm_wday]) &&
line->cl_Mons[ptm->tm_mon]) {
// このジョブを実行する
}
Code language: PHP (php)
この実装のエレガントな点は、「分・時・日・月・曜日」の各フィールドをビットマップ配列に変換し、現在時刻と単純な配列参照で比較している点です。これにより、実行判定が非常に高速かつシンプルになっています。
カーニハンらが示した「シンプルで効率的な設計」という哲学は、現代のプログラミングでも大切な教訓として生きています。