cronの使い方【2026年6月更新】

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が実行される仕組みは以下の通りです:
- システム起動時にcronデーモン(crond)が起動
- crontabファイル(設定ファイル)を読み込み、スケジュールをメモリに保持
- 設定された時刻になると、対応するコマンドを実行
- 実行結果はメールで送信されるか、指定された出力先に記録
cronのバージョンはシステムによって異なりますが、主要なLinuxディストリビューションでは以下のバージョンが使用されています(2024年現在):
| ディストリビューション | cronの種類 | バージョン | 特徴 |
|---|---|---|---|
| Ubuntu/Debian | Vixie cron | 3.0pl1-136 | 最も一般的な実装 |
| RHEL/CentOS | ISC cronie | 1.5.7 | Vixie cronのフォーク |
| Alpine Linux | BusyBox cron | 1.35.0 | 軽量版 |
| macOS | launchd + cron | システム統合 | macOS固有のスケジューリングシステムと連携 |
cronはシステム管理者にとって必須のツールであり、バックアップ、ログローテーション、データベースメンテナンス、Webサイトの定期更新など、幅広い用途で活用されています。
—
cron vs systemd timers vs anacron:最適な選択肢は?
cronは定期実行ツールのデファクトスタンダードですが、近年ではsystemd timersやanacronなどの代替手段も登場しています。それぞれの特徴を比較し、用途に応じた最適な選択肢を選びましょう。
| 機能 | cron | systemd timers | anacron |
|---|---|---|---|
| 対応OS | Linux/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ファイルの編集方法:
- ターミナルを開き、
crontab -eを実行 - デフォルトのエディタ(通常はvi)が起動
- 以下の書式でジョブを追加:
* * * * * /path/to/command arg1 arg2
- 保存してエディタを終了
- 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/healthcheck | 5分ごとにWebサイトのステータスコードをチェック |
| メールキューの処理 | */10 * * * * /usr/sbin/postqueue -f | 10分ごとに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.com | 15分ごとにシステムリソースを監視し、メールで報告 |
これらの設定を使用する際の注意点:
- パスワードなどの機密情報は直接cron設定に記載しない(後述の環境変数のセクションを参照)
- コマンドのフルパスを使用する(例:
/usr/bin/wgetではなくwgetと記載しない) - 実行結果のログを適切に管理する
- テスト環境で動作を確認してから本番環境に適用する
—
応用テクニック:cronをより効果的に活用する
基本的なcronの使い方を習得したら、次は応用テクニックを学びましょう。これらのテクニックを活用することで、cronをより柔軟で強力なツールに進化させることができます。
環境変数の扱い方:PATH設定の落とし穴
cronジョブを実行する際の環境変数は、通常のシェルとは異なることに注意が必要です。cronが実行される環境では、以下の特徴があります:
- PATH環境変数が最小限(通常は
/usr/bin:/binのみ) - ユーザーのシェル設定(.bashrc、.bash_profileなど)が読み込まれない
- ログインシェルではないため、一部の環境変数が設定されない
この問題を解決する方法:
- フルパスを使用する:
0 * * * * /usr/bin/python3 /home/user/scripts/backup.py
- 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 - スクリプト内で環境変数を設定する:
#!/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はデフォルトで実行結果をメールで送信しますが、これは必ずしも最適な方法ではありません。
実行結果の管理方法:
- メール送信(デフォルト):
0 * * * * /usr/bin/command > /dev/null 2>&1
注意:
/dev/nullに出力を廃棄すると、エラーが発生しても気づけません。必ずログを残すようにしましょう。 - 標準出力をファイルに保存:
0 * * * * /usr/bin/command >> /var/log/cron.log 2>&1
- 標準出力とエラー出力を別々に保存:
0 * * * * /usr/bin/command >> /var/log/cron.out.log 2>> /var/log/cron.err.log - ログローテーションの設定:
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.comssmtpの設定(/etc/ssmtp/ssmtp.conf):
root=postmaster@example.com mailhub=smtp.example.com:587 AuthUser=user@example.com AuthPass=password UseSTARTTLS=YES
同時実行防止:ロックファイルの活用
cronジョブが同時に複数実行されると、データの整合性が損なわれたり、リソース競合が発生したりする可能性があります。これを防ぐために、ロックファイルを使用した同時実行防止の仕組みを導入しましょう。
ロックファイルを使用した同時実行防止の実装方法:
- ロックファイルの作成とチェック:
#!/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" - cronジョブに組み込む:
0 * * * * /usr/bin/backup_wrapper.sh
- ロックファイルのタイムアウト処理:
#!/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
タイムゾーンの設定方法:
- 現在のタイムゾーンを確認:
timedatectl list-timezones | grep -i tokyo
- タイムゾーンを設定:
sudo timedatectl set-timezone Asia/Tokyo
- 設定を確認:
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 の編集チームが最新情報を元に執筆・監修しています。情報の正確性を保つために定期的な見直しを行っています。




