cronの使い方【2026年6月更新】Linux/Unixで定期実行を自動化する完全ガイド

Linux/Unixシステムで定期的なタスクを自動実行するならcronを使うのが最適解です。システム管理者や開発者が毎日必ず使うツールだからこそ、正しい設定方法とトラブルシューティングを押さえておく必要があります。

本記事では、cronの基本的な使い方から応用テクニック、セキュリティ設定、トラブルシューティングまで、実務で即戦力となる知識を網羅的に解説します。初心者から上級者まで、レベルに応じた活用方法を身につけられる内容となっています。

目次

cronとは何か?その仕組みと役割
cron vs systemd timers vs anacron:最適な選択肢は?
cronの基本的な使い方:5分でマスターする設定方法
crontabコマンドの完全ガイド
cronの書式ルール:分・時・日・月・曜日を正確に指定
実務で使えるcron設定例10選
応用テクニック:cronをより効果的に活用する
環境変数の扱い方:PATH設定の落とし穴
実行結果のログ管理:メール送信とファイル出力
同時実行防止:ロックファイルの活用
タイムゾーン設定:システムとcronの整合性
セキュリティ設定:cronを安全に運用するために
権限管理:誰がcronを実行できるのか
制限付きシェルでのcron実行
監査ログ:cronの実行履歴を追跡
トラブルシューティング:cronが動かない時の原因と対策
デバッグ方法:ログファイルの活用
よくあるエラーとその解決策
ベストプラクティス:cronを本番環境で安全に運用する
cronに関するよくある質問(FAQ)
まとめ:cronを使いこなして業務効率を向上させよう

cronとは何か?その仕組みと役割

cronは、Unix系OSで定期的にコマンドやスクリプトを実行するためのジョブスケジューラです。システムのバックグラウンドで常駐し、設定されたスケジュールに基づいてタスクを自動実行します。

主な特徴は以下の通りです:

  • 精度の高いスケジューリング:分単位での実行指定が可能
  • 柔軟な設定:システム全体のcron(/etc/crontab)とユーザー個別のcron(crontab -e)の両方をサポート
  • 軽量な実装:システムリソースへの負荷が非常に小さい
  • 豊富な実績:40年以上にわたる歴史があり、安定性が実証済み

cronが実行される仕組みは以下の通りです:

  1. システム起動時にcronデーモン(crond)が起動
  2. crontabファイル(設定ファイル)を読み込み、スケジュールをメモリに保持
  3. 設定された時刻になると、対応するコマンドを実行
  4. 実行結果はメールで送信されるか、指定された出力先に記録

cronのバージョンはシステムによって異なりますが、主要なLinuxディストリビューションでは以下のバージョンが使用されています(2024年現在):

ディストリビューションcronの種類バージョン特徴
Ubuntu/DebianVixie cron3.0pl1-136最も一般的な実装
RHEL/CentOSISC cronie1.5.7Vixie cronのフォーク
Alpine LinuxBusyBox cron1.35.0軽量版
macOSlaunchd + cronシステム統合macOS固有のスケジューリングシステムと連携

cronはシステム管理者にとって必須のツールであり、バックアップ、ログローテーション、データベースメンテナンス、Webサイトの定期更新など、幅広い用途で活用されています。

cron vs systemd timers vs anacron:最適な選択肢は?

cronは定期実行ツールのデファクトスタンダードですが、近年ではsystemd timersやanacronなどの代替手段も登場しています。それぞれの特徴を比較し、用途に応じた最適な選択肢を選びましょう。

機能cronsystemd timersanacron
対応OSLinux/Unix全般Linux(systemd搭載)Linux/Unix
実行精度分単位秒単位まで可能日単位
同時実行防止要設定自動サポート要設定
依存関係管理なしsystemdユニットと連携なし
ログ管理メール/ファイル出力journalctlで統合管理メール/ファイル出力
電源管理非対応systemd-logindと連携対応(不定期実行時)
学習コスト中(systemd知識必要)
推奨用途サーバー管理、精密なスケジューリングデスクトップ環境、高度な依存関係管理ノートPC、不定期実行タスク

それぞれの使い分けガイドライン:

  • cronを選ぶべきケース
    • サーバー環境で精密なスケジューリングが必要な場合
    • 複数のLinuxディストリビューションで統一した設定を使用する場合
    • 既存のcron設定を継続して使用する場合
  • systemd timersを選ぶべきケース
    • デスクトップLinux環境で使用する場合
    • タスク間の依存関係を明確に管理したい場合
    • systemdの機能を活用したい場合
  • anacronを選ぶべきケース
    • ノートPCやタブレットなど、常時起動していない環境
    • 毎日実行する必要はないが、定期的な実行が必要なタスク
    • cronでは実行漏れが発生しやすい環境

実際の運用では、システムの特性に応じてこれらを組み合わせて使用することが一般的です。例えば、サーバーではcronをメインに使用し、デスクトップ環境ではsystemd timersを補助的に使用するといった使い分けが効果的です。

cronの基本的な使い方:5分でマスターする設定方法

cronの基本的な使い方を理解するには、まずcrontabコマンドとその書式ルールを習得する必要があります。ここでは、実際にcronを使い始めるためのステップバイステップガイドを提供します。

crontabコマンドの完全ガイド

crontabコマンドは、cronジョブの設定・管理を行うための主要なコマンドです。以下の操作が可能です:

コマンド説明使用例
crontab -e現在のユーザーのcronジョブを編集crontab -e
crontab -l現在のユーザーのcronジョブを表示crontab -l
crontab -r現在のユーザーのcronジョブを削除crontab -r
crontab -u [ユーザー名]指定ユーザーのcronジョブを編集(root権限必要)crontab -u backupuser -e
crontab [ファイル名]指定したファイルの内容でcronジョブを設定crontab mycronjobs.txt

crontabファイルの編集方法:

  1. ターミナルを開き、crontab -eを実行
  2. デフォルトのエディタ(通常はvi)が起動
  3. 以下の書式でジョブを追加:
    * * * * * /path/to/command arg1 arg2
  4. 保存してエディタを終了
  5. cronデーモンが自動的に設定を読み込み反映

注意点:

  • crontabファイルはユーザーごとに独立しており、システム全体のcron設定は/etc/crontabで管理
  • 編集中に構文エラーがあると保存できない
  • cronジョブの実行は、crontabファイルを保存したユーザーの権限で行われる

cronの書式ルール:分・時・日・月・曜日を正確に指定

cronのスケジュール指定は、以下の5つのフィールドで構成されます:

分 時 日 月 曜日 コマンド

各フィールドの詳細:

フィールド範囲特殊文字説明
0-59* , – /実行する分を指定*/15(15分ごと)
0-23* , – /実行する時を指定2(2時)
1-31* , – / L W実行する日を指定15(15日)
1-12* , – /実行する月を指定*/3(3ヶ月ごと)
曜日0-7(0と7は日曜日)* , – / #実行する曜日を指定1-5(月曜日〜金曜日)

特殊文字の詳細:

  • *:全ての値(例:* * * * *は毎分実行)
  • ,:複数の値を指定(例:1,15 * * * *は1分と15分に実行)
  • :範囲を指定(例:0 9-17 * * *は9時から17時まで毎時実行)
  • /:間隔を指定(例:*/10 * * * *は10分ごとに実行)
  • L:最終日を指定(例:L * * *は毎月の最終日に実行)
  • W:最も近い平日を指定(例:15W * * *は15日の最も近い平日に実行)
  • #:第n曜日を指定(例:1#2 * * *は第2月曜日に実行)

具体的な実行パターン例:

  • 毎日午前3時に実行0 3 * * * /path/to/command
  • 毎週月曜日の午後5時に実行0 17 * * 1 /path/to/command
  • 毎月1日と15日に実行0 0 1,15 * * /path/to/command
  • 平日の9時から17時まで毎時実行0 9-17 * * 1-5 /path/to/command
  • 30分ごとに実行*/30 * * * * /path/to/command

実務で使えるcron設定例10選

実際の業務でよく使用されるcron設定の具体例を紹介します。これらを参考に、自分の業務に合わせた設定を見つけてください。

用途cron設定説明
システムログのローテーション0 2 * * * /usr/sbin/logrotate /etc/logrotate.conf毎日午前2時にログローテーションを実行
データベースバックアップ0 3 * * * /usr/bin/mysqldump -u root -pPASSWORD db_name > /backup/db_backup_$(date +\%Y\%m\%d).sql毎日午前3時にMySQLデータベースをバックアップ
Webサイトの定期更新0 4 * * * /usr/bin/wget -q -O /dev/null https://example.com/update.php毎日午前4時にWebサイトの更新スクリプトを実行
ディスク使用量の監視0 5 * * * /usr/bin/df -h | /bin/mail -s "Disk Usage Report" admin@example.com毎日午前5時にディスク使用量を監視し、メールで報告
セキュリティパッチの適用0 6 * * 0 /usr/bin/apt-get update && /usr/bin/apt-get upgrade -y毎週日曜日の午前6時にセキュリティパッチを自動適用
Webサイトの死活監視*/5 * * * * /usr/bin/curl -s -o /dev/null -w "%{http_code}" https://example.com/healthcheck5分ごとにWebサイトのステータスコードをチェック
メールキューの処理*/10 * * * * /usr/sbin/postqueue -f10分ごとにPostfixのメールキューを処理
システム時刻の同期0 * * * * /usr/sbin/ntpdate -u ntp.example.com毎時、NTPサーバーと時刻を同期
ログファイルの圧縮0 1 * * * /usr/bin/find /var/log -name "*.log" -size +10M -exec gzip {} \;毎日午前1時に10MB以上のログファイルを圧縮
システムリソースの監視*/15 * * * * /usr/bin/top -b -n 1 | /bin/mail -s "System Resource Report" admin@example.com15分ごとにシステムリソースを監視し、メールで報告

これらの設定を使用する際の注意点:

  • パスワードなどの機密情報は直接cron設定に記載しない(後述の環境変数のセクションを参照)
  • コマンドのフルパスを使用する(例:/usr/bin/wgetではなくwgetと記載しない)
  • 実行結果のログを適切に管理する
  • テスト環境で動作を確認してから本番環境に適用する

応用テクニック:cronをより効果的に活用する

基本的なcronの使い方を習得したら、次は応用テクニックを学びましょう。これらのテクニックを活用することで、cronをより柔軟で強力なツールに進化させることができます。

環境変数の扱い方:PATH設定の落とし穴

cronジョブを実行する際の環境変数は、通常のシェルとは異なることに注意が必要です。cronが実行される環境では、以下の特徴があります:

  • PATH環境変数が最小限(通常は/usr/bin:/binのみ)
  • ユーザーのシェル設定(.bashrc、.bash_profileなど)が読み込まれない
  • ログインシェルではないため、一部の環境変数が設定されない

この問題を解決する方法:

  1. フルパスを使用する
    0 * * * * /usr/bin/python3 /home/user/scripts/backup.py
  2. crontabファイル内で環境変数を設定する
    SHELL=/bin/bash
    PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
    HOME=/home/user
    MAILTO=user@example.com
    
    0 * * * * /home/user/scripts/backup.py
        
  3. スクリプト内で環境変数を設定する
    #!/bin/bash
    export PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
    export HOME=/home/user
    
    

    実行するコマンド

    python3 /home/user/scripts/backup.py

環境変数に関する具体的なトラブルシューティング:

  • Pythonスクリプトが動かないpython3ではなく/usr/bin/python3を使用
  • メールが送信されないMAILTO変数をcrontabファイルに設定
  • ファイルが見つからない:フルパスでファイルを指定

実行結果のログ管理:メール送信とファイル出力

cronジョブの実行結果を適切に管理することは、システムの安定運用に不可欠です。cronはデフォルトで実行結果をメールで送信しますが、これは必ずしも最適な方法ではありません。

実行結果の管理方法:

  1. メール送信(デフォルト)
    0 * * * * /usr/bin/command > /dev/null 2>&1

    注意:/dev/nullに出力を廃棄すると、エラーが発生しても気づけません。必ずログを残すようにしましょう。

  2. 標準出力をファイルに保存
    0 * * * * /usr/bin/command >> /var/log/cron.log 2>&1
  3. 標準出力とエラー出力を別々に保存
    0 * * * * /usr/bin/command >> /var/log/cron.out.log 2>> /var/log/cron.err.log
        
  4. ログローテーションの設定
    0 0 * * * /usr/sbin/logrotate /etc/logrotate.d/cron
        

    ログローテーション設定ファイル(/etc/logrotate.d/cron)の例:

    /var/log/cron*.log {
        daily
        missingok
        rotate 30
        compress
        delaycompress
        notifempty
        create 0640 root adm
    }
        

メール送信をカスタマイズする方法:

  • MAILTOを設定
    MAILTO=admin@example.com
    0 * * * * /usr/bin/command
        
  • sendmailを使用してカスタムメールを送信
    0 * * * * /usr/bin/command 2>&1 | mail -s "Cron Job Report: $(hostname)" admin@example.com
        
  • SMTPサーバーを使用してメールを送信
    0 * * * * /usr/bin/command 2>&1 | /usr/bin/ssmtp admin@example.com
        

    ssmtpの設定(/etc/ssmtp/ssmtp.conf):

    root=postmaster@example.com
    mailhub=smtp.example.com:587
    AuthUser=user@example.com
    AuthPass=password
    UseSTARTTLS=YES
        

同時実行防止:ロックファイルの活用

cronジョブが同時に複数実行されると、データの整合性が損なわれたり、リソース競合が発生したりする可能性があります。これを防ぐために、ロックファイルを使用した同時実行防止の仕組みを導入しましょう。

ロックファイルを使用した同時実行防止の実装方法:

  1. ロックファイルの作成とチェック
    #!/bin/bash
    
    LOCKFILE="/tmp/backup.lock"
    
    

    ロックファイルが存在する場合は終了

    if [ -f "$LOCKFILE" ]; then echo "Another instance is running. Exiting." exit 1 fi

    ロックファイルを作成

    touch "$LOCKFILE"

    ジョブを実行

    /usr/bin/backup_script.sh

    ロックファイルを削除

    rm -f "$LOCKFILE"
  2. cronジョブに組み込む
    0 * * * * /usr/bin/backup_wrapper.sh
  3. ロックファイルのタイムアウト処理
    #!/bin/bash
    
    LOCKFILE="/tmp/backup.lock"
    TIMEOUT=3600  # 1時間
    
    if [ -f "$LOCKFILE" ]; then
        # ロックファイルの作成時刻をチェック
        if [ $(find "$LOCKFILE" -mmin +$TIMEOUT | wc -l) -gt 0 ]; then
            echo "Lockfile is too old. Removing and proceeding."
            rm -f "$LOCKFILE"
        else
            echo "Another instance is running. Exiting."
            exit 1
        fi
    fi
    
    touch "$LOCKFILE"
    /usr/bin/backup_script.sh
    rm -f "$LOCKFILE"
        

ロックファイルのベストプラクティス:

  • ロックファイルは/tmpディレクトリに配置(システム再起動で自動的にクリアされる)
  • ロックファイル名はジョブ名と一致させる(例:backup.lock
  • ロックファイルのタイムアウトを設定し、異常終了時の処理を考慮する
  • 複数のジョブで同じロックファイルを使用しない

タイムゾーン設定:システムとcronの整合性

cronジョブの実行時刻はシステムのタイムゾーンに基づいています。システムのタイムゾーン設定とcronの実行時刻にずれがあると、予期しないタイミングでジョブが実行される可能性があります。

タイムゾーン設定の確認方法:

timedatectl status

タイムゾーンの設定方法:

  1. 現在のタイムゾーンを確認
    timedatectl list-timezones | grep -i tokyo
  2. タイムゾーンを設定
    sudo timedatectl set-timezone Asia/Tokyo
  3. 設定を確認
    timedatectl status

cronジョブの実行時刻を明示的に指定する方法:

  • UTCで実行し、時刻を調整
    0 15 * * * TZ=Asia/Tokyo /usr/bin/command

    これは、UTCの15時に実行され、システムのタイムゾーンに合わせて時刻が調整されます。

  • タイムゾーンを環境変数として設定
    SHELL=/bin/bash
    PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
    HOME=/home/user
    TZ=Asia/Tokyo
    MAILTO=user@example.com
    
    0 * * * * /usr/bin/command
        

タイムゾーン設定に関する注意点:

  • システムのタイムゾーンを変更すると、cronジョブの実行時刻も変わる
  • Dockerコンテナ内では、コンテナのタイムゾーン設定が使用される
  • クラウドサービスでは、ホストのタイムゾーンではなく、サービス固有のタイムゾーン設定を使用する場合がある

セキュリティ設定:cronを安全に運用するために

cronはシステムの自動化に非常

この記事を読んでいる方へのおすすめ:

この記事で学んだスキルをさらに深めたい方へ

インフラエンジニアのスキルアップに役立つ技術書です。Amazonで探してみましょう。

Amazonアソシエイトプログラムを利用しています。

【編集・制作ポリシー】
本記事はRoute Bloom編集部が公式ドキュメント・技術仕様書の一次情報をもとに作成しています。ITインフラ・技術情報は急速に変化するため、実装前に最新の公式ドキュメントをご確認ください。情報の正確性には万全を期していますが、最新情報は各公式サイトをご確認ください。
【編集・制作ポリシー】
本記事はRoute Bloom編集部が各ベンダー公式ドキュメント・エンジニア監修をもとに作成しています。インフラ・クラウド構築は環境により異なります。本番環境への適用前に必ずテストを実施してください。情報の正確性には万全を期していますが、最新情報は各公式ドキュメントをご確認ください。
【編集・制作ポリシー】
本記事はRoute Bloom編集部が各ベンダー・技術標準の公式ドキュメントをもとに作成しています。 インフラ・クラウド技術に関する最終判断は実際の環境・バージョンで検証のうえ実施してください。 情報の正確性には万全を期していますが、最新情報は各公式ドキュメントをご確認ください。

編集ポリシー:この記事は、Route Bloom の編集チームが最新情報を元に執筆・監修しています。情報の正確性を保つために定期的な見直しを行っています。

ABOUT ME
たから
サラリーマンをしながら開業して経営やってます。 今年、本業で独立・別事業を起業予定です。 ◆経験:IT講師/インフラエンジニア/PM/マネジメント/採用/運用・保守・構築・設計 ◆取得資格:CCNA/CCNP/LPIC-1/AZ-900/FE/サーティファイC言語 ◆サイドビジネス:アパレル事業/複数のWEBメディアを運営