本文へスキップ
BecomeCoder

シェルスクリプトコース · 第8章 cron で定期実行 · レッスン39

cron と systemd タイマー ― どちらを使うか

ブラウザで完結

導入

最近のLinuxには、cron とは別に systemd タイマー という定期実行の仕組みもあります。現場で両方見かけるので、違いと使い分けを知っておきましょう。

説明

どちらも「決まった時刻にコマンドを動かす」道具ですが、成り立ちが違います。

cronsystemd タイマー
設定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

実際に動かしてみよう

本文のサンプルや演習のコードは、コードブロック右上の「コピー」ボタンでコピーして、下のエディタに貼り付ければそのまま実行できます。

シェルスクリプト(シミュレート)

スクリプトを書くエディタと、それを動かす仮想シェルを読み込みます(本物のbashではなく、動きを再現した学習用の環境です)。
スクロールして表示された時点でも自動で読み込まれます。