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 minutes
midnight
next 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.sh
backup.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 --all
systemd.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を積極的に採用するのがおすすめです。
コメント