Phase 1ではcronの基本を学びました。この記事ではcronとsystemd timerの違いを理解し、用途に応じて使い分けられるようになることを目指します。
cron と systemd timer の比較
| 比較項目 | cron | systemd timer |
|---|---|---|
| 設定場所 | crontab / /etc/cron.d/ | .timerユニットファイル |
| ログ | /var/log/syslog(確認しにくい) | journalctl -u タイマー名(統合管理) |
| 依存関係 | なし | After=/Requires=で設定可能 |
| 精度 | 分単位 | 秒単位・マイクロ秒単位 |
| 起動タイミング | 固定時刻のみ | 起動後○秒後なども指定可能 |
| 実行ミスの処理 | スキップされる | Persistent=trueで起動時に実行 |
| 学習コスト | 低い | やや高い |
systemd timer の作り方
systemd timerはサービスユニットとタイマーユニットの2ファイルで構成されます。
# ① サービスユニットを作成(実際に実行する処理)
# /etc/systemd/system/backup.service
[Unit]
Description=Daily Backup Job
[Service]
Type=oneshot
User=backup
ExecStart=/opt/scripts/backup.sh
StandardOutput=journal
StandardError=journal
# ② タイマーユニットを作成
# /etc/systemd/system/backup.timer
[Unit]
Description=Daily Backup Timer
Requires=backup.service
[Timer]
# 毎日 02:00 に実行
OnCalendar=*-*-* 02:00:00
# 起動時に前回の実行が抜けていたら実行する(重要!)
Persistent=true
# 実行時刻にランダムな遅延を加える(負荷分散)
RandomizedDelaySec=300
[Install]
WantedBy=timers.target
# 有効化・起動(serviceではなくtimerを起動する)
$ sudo systemctl daemon-reload
$ sudo systemctl enable backup.timer
$ sudo systemctl start backup.timer
# タイマーの状態確認
$ systemctl status backup.timer
# 全タイマーの一覧と次回実行時刻
$ systemctl list-timers
# 実行ログを確認
$ journalctl -u backup.service
OnCalendar の書き方
# 書式: DOW YYYY-MM-DD HH:MM:SS
# * はワイルドカード、.. は範囲、, は複数指定
OnCalendar=daily # 毎日 00:00:00(@dailyと同じ)
OnCalendar=weekly # 毎週月曜 00:00:00
OnCalendar=monthly # 毎月1日 00:00:00
OnCalendar=hourly # 毎時 00:00
OnCalendar=*-*-* 02:30:00 # 毎日 02:30
OnCalendar=Mon *-*-* 03:00:00 # 毎週月曜 03:00
OnCalendar=*-*-1 00:00:00 # 毎月1日 00:00
OnCalendar=*:0/15 # 15分ごと
# 書式の確認コマンド(次回実行時刻を表示)
$ systemd-analyze calendar "Mon *-*-* 03:00:00"
起動時・起動後の遅延実行
# 起動してから5分後に実行
[Timer]
OnBootSec=5min
OnUnitActiveSec=1h # その後1時間ごと
# 起動してから30秒後に1回だけ実行
OnBootSec=30s
使い分けの指針
- cronを使う場合:シンプルな定期実行、既存スクリプトへの追加、設定が少ない場合
- systemd timerを使う場合:ログを統合管理したい、依存するサービスがある、起動後の遅延実行が必要、実行ミスを補完したい(
Persistent=true)
まとめ
- systemd timerはサービス+タイマーの2ファイル構成。cronより多機能
OnCalendar=で柔軟なスケジュール設定。systemd-analyze calendarで確認Persistent=trueで実行ミスを補完(cronにはない機能)systemctl list-timersで全タイマーの次回実行時刻を一覧確認- ログは
journalctl -u サービス名で統合管理できる
📋 Linuxサーバー運用・管理チェックリスト完全版でPhase 2の全要点を確認できます。



コメント