導入
最近のLinuxには、cron とは別に systemd タイマー という定期実行の仕組みもあります。現場で両方見かけるので、違いと使い分けを知っておきましょう。
説明
どちらも「決まった時刻にコマンドを動かす」道具ですが、成り立ちが違います。
| cron | systemd タイマー | |
|---|---|---|
| 設定 | crontab の1行 | .timer と .service の2ファイル |
| 手軽さ | とても簡単 | 手間がかかる |
| ログ | 自分でリダイレクト | journalctl に自動で残る |
| 実行漏れの補完 | しない(電源断で流れる) | Persistent=true で後から実行 |
| 依存関係 | 書けない | 「ネットワーク起動後」などを指定できる |
| 実行状況の確認 | 分かりにくい | systemctl list-timers で一覧 |
systemd タイマーは、こんな2ファイルで書きます。
# /etc/systemd/system/backup.service
[Unit]
Description=日次バックアップ
[Service]
Type=oneshot
ExecStart=/home/user/scripts/backup.sh
# /etc/systemd/system/backup.timer
[Unit]
Description=毎日3時にバックアップ
[Timer]
OnCalendar=*-*-* 03:00:00
Persistent=true
[Install]
WantedBy=timers.target
systemctl enable --now backup.timer で有効化し、systemctl list-timers で次回の実行時刻が確認できます。
#!/bin/bash
# cron と systemd タイマー、それぞれの「予定」を見比べる
echo "=== cron の予定表 ==="
crontab -l
echo "=== systemd タイマー ==="
systemctl list-timers
flowchart TD
A["定期実行したい"] --> B{"どちらを選ぶ?"}
B -->|"個人の作業・単純な定期処理"| C["cron<br/>(1行で済む)"]
B -->|"サービスとして運用・ログや依存が要る"| D["systemd タイマー<br/>(管理しやすい)"]
使い分けの目安はこうです。
- cron: 自分のバックアップ、簡単な集計、学習や個人サーバー。1行で書けて、どのUNIX系OSでも動く。
- systemd タイマー: 会社のサーバーで長く運用するもの。ログが自動で残り、実行漏れの補完や依存関係も扱える。
なお、Dockerコンテナやクラウドでは、また別の選択肢(Kubernetes の CronJob、クラウドのスケジューラ)が使われます。どれを選んでも、動かす中身はあなたが書いたシェルスクリプトであることは変わりません。だから、この章までの内容がそのまま効いてきます。
やってみよう
下の端末で systemctl list-timers と打ってみましょう(このシミュレータでは簡略表示です)。journalctl -u nginx のように、サービス単位でログを見る操作も試してみてください。cron と違い、systemd では「実行の記録が最初から残る」ことが実感できます。
演習
crontab -l で cron の予定を確認したあと、cronsim 03:00 を実行して、定期実行の全体像を確かめてください。
ヒント1を見る
まず crontab -l、次に cronsim 03:00 です。
ヒント2を見る
cronsim 03:00