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




コメント