Linuxで定期的に処理を実行したい場合、代表的な方法としてcron、at、systemd.timerの3つがあります。それぞれ用途や特徴が異なるため、目的に応じて適切なタイマーを選択することが重要です。
ツール | 特徴 | 用途 | 設定ファイルまたはコマンド |
---|---|---|---|
cron | 時刻ベースで繰り返し実行 | 定期的なジョブ実行(毎日・毎週など) | /etc/crontab , crontab -e |
at | 一度きりの実行予約 | 単発ジョブ実行 | at , atq , atrm |
systemd.timer | journalctlによるログ管理が容易。依存関係や条件実行が可能 | モダンなタスクスケジューリング全般 | .timer と .service ファイル |
一度だけタスクを予約したい場合に使います。
at [オプション] 時刻
echo "/home/user/backup.sh" | at 02:00
→ 次の午前2時にバックアップスクリプトを実行。
atq
:ジョブ一覧を表示atrm <ジョブID>
:予約ジョブを削除now + 10 minutes
midnight
next monday
最も古くから使われてきたスケジューラで、システム全体やユーザ単位で設定できます。
分 時 日 月 曜日 コマンド
crontab -e
/etc/crontab
0 3 * * * /home/user/backup.sh
→ 毎日3時にバックアップを実行。
定数 | 意味 | タイミング |
---|---|---|
@reboot | 起動時に実行 | OS起動直後 |
@daily | 毎日0時に実行 | 定期日次ジョブ |
@weekly | 毎週日曜0時 | 週次ジョブ |
@hourly | 毎時0分 | 時間ごとジョブ |
systemd.timerは、systemdに統合されたモダンなスケジューラであり、cronの代替として利用されています。
RHEL9やAmazon Linux 2023などの最新ディストリビューションでは、デフォルトでsystemd.timerが導入されています。cronが別プロセスで動作するのに対し、systemd.timerはsystemd内部の仕組みとして機能します。
<name>.service
: 実行する処理の定義<name>.timer
: 実行タイミングや間隔を定義[Unit]
Description=Backup Script
[Service]
Type=oneshot
ExecStart=/home/user/backup.sh
[Unit]
Description=Run backup every hour
[Timer]
OnCalendar=hourly
Persistent=true
[Install]
WantedBy=timers.target
sudo systemctl daemon-reload
sudo systemctl enable --now backup.timer
systemctl list-timers --all
オプション名 | 説明 | 使用例 |
---|---|---|
OnCalendar | カレンダー形式でのスケジュール | OnCalendar=daily |
OnBootSec | 起動後に実行 | OnBootSec=30s |
OnActiveSec | タイマー起動からの経過時間後に実行 | OnActiveSec=5min |
OnUnitActiveSec | 前回実行後の経過で再実行 | OnUnitActiveSec=1h |
RandomizedDelaySec | 実行をランダムに遅らせる | RandomizedDelaySec=10min |
Persistent | シャットダウン中に実行漏れしたジョブを補完 | Persistent=true |
コマンド | 動作内容 |
---|---|
systemctl start name.timer | タイマーを起動 |
systemctl stop name.timer | 停止 |
systemctl enable name.timer | 起動時に自動有効化 |
systemctl list-timers | 登録されたタイマー一覧を表示 |
systemd-analyze verify ファイル名 | 設定ファイルの検証 |
項目 | cron | systemd.timer |
---|---|---|
主な構成 | 1ファイル(crontab) | .service と .timer |
実行精度 | 分単位 | 秒単位まで設定可 |
ログ出力 | メール/syslog依存 | journalctlで一元管理 |
実行補償 | なし | Persistentで再実行 |
依存関係 | なし | Unitチェーンで管理可能 |
権限管理 | ユーザごと | Unitごとに細かく設定可能 |
再起動後の再実行 | 不可 | 可能 |
エラーハンドリング | シンプル | 自動リトライ・制御可能 |
systemd.timerは、cronの限界を克服したモダンなタスクスケジューラーであり、システム連携・再起動対応・依存管理などの機能を備えています。Linuxの自動化を進める場合には、今後の標準としてsystemd.timerを積極的に採用するのがおすすめです。