Linuxサーバー管理

cronとsystemd timerで定期実行を設定する【使い分け完全ガイド】

Linuxサーバー管理
記事内に広告が含まれています。

Phase 1ではcronの基本を学びました。この記事ではcronとsystemd timerの違いを理解し、用途に応じて使い分けられるようになることを目指します。

cron と systemd timer の比較

比較項目cronsystemd 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の全要点を確認できます。

コメント

タイトルとURLをコピーしました