Linux環境における時間軸ベースのタスク自動化は、インフラ保守の基盤となる機能である。本稿では、ユーザー単位のジョブ管理、システム全体のスケジュール制御、および非24時間稼働環境向けの補完機制について技術的に解説する。
実行権限の制御ファイル
Cronデーモンは、ジョブ定義を許可する主体を制限する設定ファイルを参照する。
/etc/cron.allow:このファイルに列挙されたユーザーのみがcrontabコマンドの利用を許可される。/etc/cron.deny:列挙されたユーザーは利用を禁止される。
両ファイルが共存する場合は、許可リスト(allow)の設定が優先適用される。実際の運用では、最小権限の原則に従い片方のファイルのみを有効化するのが標準的なアプローチである。
ユーザーレベルのジョブ定義
個別ユーザーが自らの定期タスクを管理するには、crontab -eコマンドを実行し、デフォルトエディタでジョブを定義する。各1行が1つのタスクに対応し、以下のフィールド順で構成される。
分 時 日 月 曜日 コマンド
各フィールドの許容値範囲は以下の通りである。
- 分:0~59
- 時:0~23
- 日:1~31
- 月:1~12
- 曜日:0~7(0および7は日曜日)
ワイルドカードおよび演算子を活用することで、柔軟な実行タイミングを指定可能である。アスタリスク(*)は該当フィールドのすべての値を意味し、スラッシュ(/n)はn単位ごとの間隔を指定する。
例えば、5月の全月の午前2時30分にログ集計スクリプトを実行し、標準出力をファイルに記録する場合は以下のように記述する。
30 2 * 5 * /opt/scripts/aggregate_logs.sh >> /var/log/aggregation.log 2>&1
実行間隔を一定に保つ必要がある場合、以下のように設定する。
*/15 * * * * /usr/local/bin/health_check.sh
※ コマンドパスは絶対パスで指定することを強く推奨する。相対パスではCronのデフォルト環境変数によってファイルが見つからないエラー(No such file or directory)が発生する可能性がある。
定義済みジョブの確認と削除は以下のコマンドで行う。
crontab -l # 現在の設定を出力
crontab -r # 全ジョブ定義を削除
システム全体向けのジョブ定義
管理者権限を必要とする、またはシステム全体のサービスとして実行すべきタスクは、/etc/crontabファイルを直接編集して定義する。ユーザー単位の設定と異なる点として、コマンド実行前にユーザー名を指定するフィールドが追加される。
分 時 日 月 曜日 ユーザー名 コマンド
システム用設定ファイルの冒頭には、実行環境のデフォルト値が定義されている。
SHELL=/bin/bash
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
MAILTO=sysadmin@example.com
# .---------------- 分 (0-59)
# | .------------- 時 (0-23)
# | | .---------- 日 (1-31)
# | | | .------- 月 (1-12)
# | | | | .---- 曜日 (0-7)
# | | | | |
# * * * * * username command to be executed
特定の時間帯に複数のタスクを分散させたい場合、カンマ区切りで複数の値を指定できる。例えば、毎時の5分、15分、25分にキャッシュクリアを実行する場合は次の通り。
5,15,25 * * * * sysadmin /usr/bin/clear_temp_cache.sh
注意すべき点として、「月と日(日付)」および「曜日」を同時に指定すると、Cronは論理和(OR)として解釈するため、意図しないタイミングで重複実行される可能性がある。日周期で厳密に制御する場合は、日付フィールドのみを使用するか、スクリプト内で条件分岐を実装する方が安全である。
起動時未実行ジョブの補完(Anacron)
Cronはシステムが24時間常時稼働することを前提としているため、スケジュール通り起動していないPCや開発用サーバーではタスクがスキップされる。この課題を解決するのがanacronである。システム起動時に以前の実行からどの周期が経過しているかを検証し、未実行のタスクを補完実行する仕組みである。
設定ファイル/etc/anacrontabの書式は以下の通りである。
周期(日) 遅延時間(分) ジョブID コマンド
標準的な設定例を以下に示す。
SHELL=/bin/bash
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
MAILTO=root
# ジョブ実行時の最大ランダム遅延時間(分)
RANDOM_DELAY=30
# ジョブ実行を許可する時間帯(時)
START_HOURS_RANGE=4-23
# 周期(日) 遅延(分) 識別子 コマンド
1 10 cron.daily nice run-parts /etc/cron.daily
7 20 cron.weekly nice run-parts /etc/cron.weekly
@monthly 30 cron.monthly nice run-parts /etc/cron.monthly
第一フィールドの「1」や「7」はジョブの目標実行間隔を示し、第二フィールドはシステム起動後にジョブを実行するまでの待機時間を指定する。第三フィールドはジョブの実行履歴を追跡するための識別子であり、第四フィールドで実際に実行するコマンド群を定義する。常時稼働するサーバーではCronのみで十分だが、頻繁に電源が切れる環境ではAnacronの設定を確認しておくと運用の安定性が高まる。