cronの使い方徹底解説【2026年最新】

Linux/Unixシステムで定期的なタスクを自動実行するための必須ツール「cron」の正しい使い方を、具体的な設定手順からトラブルシューティングまで網羅的に解説します。初心者でも実務で即活用できる実践的な内容です。

本記事では、crontabコマンドの基本構文から、環境変数の扱い方、セキュリティ設定、さらには2026年の最新動向までをカバーします。特に、システム管理者やDevOpsエンジニアにとって重要な「ジョブの重複実行防止」や「ログ管理」についても詳細に解説します。cronを使いこなせば、サーバー管理の効率が飛躍的に向上します。


目次


cronとは何か?基本概念を理解する

cronは、Unix系オペレーティングシステム(Linux、macOS、BSDなど)に標準搭載されている「ジョブスケジューラ」です。システム管理者や開発者が、特定の時間や間隔でコマンドやスクリプトを自動実行できるように設計されています。

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

  • 定期実行:1分単位から年単位まで、柔軟なスケジューリングが可能
  • バックグラウンド実行:ユーザーがログインしていなくてもジョブを実行
  • 複数ユーザー対応:システム全体のジョブ(/etc/crontab)と個人用ジョブ(crontab -e)を分離
  • 柔軟な構文:5つの時間フィールド(分・時・日・月・曜日)で詳細なスケジュール設定が可能

cronの仕組みを理解する上で重要な概念が「cronデーモン(crond)」です。これはシステム起動時に自動的に起動されるバックグラウンドプロセスで、crontabファイルに登録されたジョブを実行します。

cronの歴史を振り返ると、1975年にAT&TのUnix System Vで初めて導入されました。その後、POSIX規格に取り込まれ、現代のLinuxシステムでも広く利用されています。2026年現在でも、多くの企業で基幹システムのジョブ管理にcronが採用されています。

cronの利用シーンとして代表的なものは以下の通りです:

  • システムログのローテーション
  • データベースのバックアップ
  • 定期的なレポート生成
  • ウェブサイトのコンテンツ更新
  • ネットワーク監視スクリプトの実行

cronを使うことで、手動で実行していた定期的な作業を自動化し、人的ミスを防ぐことができます。特に、24時間365日稼働するサーバー環境では、cronによる自動化は欠かせない存在となっています。


crontabの基本構文と設定方法

crontabファイルの構造

cronジョブは「crontabファイル」に記述します。このファイルは、各ユーザーごとに存在し、以下の形式でジョブを定義します:

* * * * * command_to_execute

各フィールドの意味は以下の通りです:

フィールド範囲特殊文字説明
分(Minute)0-59* , – /実行する分を指定
時(Hour)0-23* , – /実行する時を指定
日(Day of Month)1-31* , – / L W実行する日を指定
月(Month)1-12* , – /実行する月を指定
曜日(Day of Week)0-7(0と7は日曜日)* , – / L #実行する曜日を指定

crontabコマンドの基…

crontabファイルを編集・管理するための主なコマンドは以下の通りです:

コマンド説明
crontab -e現在のユーザーのcrontabファイルを編集
crontab -l現在のユーザーのcrontabファイルを表示
crontab -r現在のユーザーのcrontabファイルを削除
crontab file指定したファイルをcrontabとして設定

例えば、現在のユーザーのcrontabファイルを編集するには以下のように実行します:

$ crontab -e

これにより、デフォルトのエディタ(通常はvi)が起動し、crontabファイルを編集できます。編集が完了すると、cronデーモンが自動的に新しい設定を読み込みます。

具体的なcronジョブの記述例

cronジョブの記述方法を具体例で解説します:

  • 毎時0分に実行0 * * * * /path/to/command
  • 毎日午前3時に実行0 3 * * * /path/to/command
  • 毎週月曜日の午前2時に実行0 2 * * 1 /path/to/command
  • 毎月1日の午前0時に実行0 0 1 * * /path/to/command
  • 毎分実行* * * * * /path/to/command

特殊文字を使った柔軟なスケジューリングも可能です:

  • 毎時15分と45分に実行15,45 * * * * /path/to/command
  • 平日の午前9時から午後5時まで1時間おきに実行0 9-17 * * 1-5 /path/to/command
  • 月の初日と15日に実行0 0 1,15 * * /path/to/command
  • 毎月第3金曜日に実行0 0 * * 5#3 /path/to/command

cronジョブを記述する際の注意点:

  • コマンドは絶対パスで指定する(例:/usr/bin/python3 /path/to/script.py
  • 出力はファイルにリダイレクトするか、メールで受信するように設定する
  • ジョブが失敗した場合の通知方法を検討する
  • システムのタイムゾーンを考慮する

システム全体のcronta…

システム管理者は、システム全体のジョブを/etc/crontabファイルに記述できます。このファイルは、以下の形式でジョブを定義します:

SHELL=/bin/bash
PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin
17 *    root    cd / && run-parts --report /etc/cron.hourly
25 6    * * *   root    test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.daily )
47 6    * * 7   root    test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.weekly )
52 6    1 * *   root    test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.monthly )

システム全体のcrontabでは、ユーザー名を6番目のフィールドに指定する必要があります。これは、個人用crontabとの大きな違いです。

また、/etc/cron.d/ディレクトリには、追加のcronジョブファイルを配置できます。このディレクトリに配置されたファイルは、システム全体のcrontabと同様に扱われます。


実務で使えるcronの具体例10選

cronを実務で活用する具体的なシナリオを10個紹介します。これらの例は、実際の運用現場でよく見られるユースケースです。

1. システムログのローテ…

ログファイルが肥大化しないように、定期的にローテーション(古いログの圧縮・削除)を行います。

0 3 * * * /usr/sbin/logrotate -f /etc/logrotate.conf

このジョブは毎日午前3時に実行され、/etc/logrotate.confに定義されたルールに従ってログファイルをローテーションします。

2. データベースのバック…

MySQLやPostgreSQLなどのデータベースを定期的にバックアップします。

0 2 * * * /usr/bin/mysqldump -u backup_user -p'secure_password' database_name > /backup/mysql_backup_$(date +\%Y\%m\%d).sql

このジョブは毎日午前2時に実行され、データベースをバックアップファイルとして保存します。バックアップファイル名は「mysql_backup_YYYYMMDD.sql」の形式になります。

3. ウェブサイトのコンテ…

ウェブサイトのコンテンツを定期的に更新するスクリプトを実行します。

0 4 * * * /usr/bin/python3 /opt/scripts/update_website_content.py >> /var/log/website_update.log 2>&1

このジョブは毎日午前4時に実行され、ウェブサイトのコンテンツを更新します。実行結果は/var/log/website_update.logに記録されます。

4. ディスク使用量の監視

ディスク使用量が一定の閾値を超えた場合に管理者に通知します。

0 * * * * /usr/bin/df -h | /bin/awk '$5 > 90 {print $0}' | /bin/mail -s "Disk Space Alert" admin@example.com

このジョブは1時間おきに実行され、ディスク使用率が90%以上の場合に管理者にメールで通知します。

5. ウェブサイトの死活監視

ウェブサイトが正常に稼働しているかを定期的にチェックします。

*/5 * * * * /usr/bin/curl -s -o /dev/null -w "%{http_code}" https://example.com | /bin/grep -q "200" || /bin/echo "Website is down!" | /bin/mail -s "Website Down Alert" admin@example.com

このジョブは5分おきに実行され、ウェブサイトが正常に応答しない場合に管理者にメールで通知します。

6. 古いファイルの削除

一定期間以上経過した古いファイルを自動的に削除します。

0 1 * * 0 /usr/bin/find /tmp -type f -mtime +30 -delete

このジョブは毎週日曜日の午前1時に実行され、/tmpディレクトリ内の30日以上前のファイルを削除します。

7. システムアップデート…

定期的にシステムアップデートを実行します。

0 5 * * 0 root /usr/bin/apt-get update && /usr/bin/apt-get upgrade -y

このジョブは毎週日曜日の午前5時に実行され、システムのアップデートを実行します。Ubuntu/Debian系のシステムで使用できます。

8. ログファイルの圧縮

古いログファイルを圧縮してストレージを節約します。

0 4 * * 1 /usr/bin/find /var/log -type f -size +10M -exec gzip {} \;

このジョブは毎週月曜日の午前4時に実行され、10MB以上のログファイルをgzipで圧縮します。

9. データベースの最適化

MySQLデータベースのテーブルを定期的に最適化します。

0 3 * * 0 /usr/bin/mysqlcheck --optimize --all-databases -u root -p'secure_password'

このジョブは毎週日曜日の午前3時に実行され、全てのデータベーステーブルを最適化します。

10. レポートの自動生成

ビジネスレポートやシステムレポートを自動的に生成します。

0 9 1 * * /usr/bin/python3 /opt/scripts/generate_monthly_report.py >> /var/log/report_generation.log 2>&1

このジョブは毎月1日の午前9時に実行され、月次レポートを生成します。生成されたレポートは、指定された場所に保存されます。

これらの具体例は、cronの柔軟性と実用性を示す良い例です。実際の運用では、これらのジョブを組み合わせて使用することで、システム管理の自動化を実現できます。


cronにおける環境変数の扱い方

cronジョブを実行する際、環境変数が正しく設定されていないと、ジョブが失敗することがあります。これは、cronが起動するシェル環境が、通常のログインシェルとは異なるためです。

cronの環境変数問題

cronジョブが失敗する主な原因の1つが、環境変数の不足です。例えば、以下のような問題が発生します:

  • PATH環境変数が不足しており、コマンドが見つからない
  • HOME環境変数が設定されておらず、ユーザー固有の設定ファイルが読み込まれない
  • LANG環境変数が不足しており、日本語環境で文字化けが発生する

これらの問題を解決するためには、cronジョブ内で明示的に環境変数を設定するか、crontabファイルの先頭で環境変数を定義する必要があります。

crontabファイルでの…

crontabファイルの先頭で環境変数を設定する方法です:

# cron environment variables
SHELL=/bin/bash
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
HOME=/home/username
LANG=ja_JP.UTF-8
MAILTO=admin@example.com

cron jobs

0 3 * * * /usr/bin/python3 /opt/scripts/backup.py

この設定により、cronジョブ実行時に必要な環境変数が正しく設定されます。

ジョブ内での環境変数設定

ジョブ内で環境変数を設定する方法です:

0 3 * * * . /home/username/.bashrc; /usr/bin/python3 /opt/scripts/backup.py

この方法では、ユーザーの.bashrcファイルを読み込んで環境変数を設定しています。

特定の環境変数のみを設定する

特定の環境変数のみを設定する方法です:

0 3 * * * PATH=/usr/local/bin:/usr/bin:/bin; /usr/local/bin/command

この方法では、PATH環境変数のみを設定しています。

環境変数の確認方法

cronジョブ実行時の環境変数を確認するには、以下のジョブを実行します:

0 * * * * env > /tmp/cron_env.txt

このジョブは1時間おきに実行され、実行時の環境変数を/tmp/cron_env.txtに書き込みます。このファイルを確認することで、cronジョブ実行時の環境変数を把握できます。

一般的な環境変数設定のベス…

cronジョブで環境変数を設定する際のベストプラクティスを以下に示します:

  • PATHの設定:必要なコマンドが含まれるディレクトリをPATHに追加
  • HOMEの設定:ユーザー固有の設定ファイルが読み込まれるように設定
  • LANGの設定:文字化けを防ぐために言語設定を明示的に指定
  • MAILTOの設定:ジョブの実行結果をメールで受信する宛先を設定
  • TZの設定:タイムゾーンを明示的に設定(特にサーバーが複数のタイムゾーンをまたぐ場合)

これらの設定を適切に行うことで、cronジョブの実行環境を整備し、ジョブの安定性と信頼性を向上させることができます。


cronのセキュリティベストプラクティス

cronは強力なツールですが、適切なセキュリティ対策を講じなければ、システムの脆弱性につながる可能性があります。以下に、cronのセキュリティを確保するためのベストプラクティスを紹介します。

1. cronジョブの実行…

cronジョブは、必要最小限の権限で実行することを原則とします。以下のガイドラインに従ってください:

  • root権限の必要性を検討する:システム全体のジョブでなければ、root権限で実行する必要はありません
  • 専用ユーザーの作成を検討する:特定のジョブ専用のユーザーを作成し、そのユーザーでジョブを実行します
  • sudoを使用する:root権限が必要な場合は、sudoを使用して特定のコマンドのみを実行します

例えば、データベースバックアップ専用のユーザーを作成する場合:

# ユーザーの作成
sudo useradd -r -s /bin/false backupuser

パスワードを設定しない(-rオプションでシステムユーザーとして作成)

sudo passwd -l backupuser

/etc/sudoersに追加(必要なコマンドのみ許可)

echo "backupuser ALL=(root) NOPASSWD: /usr/bin/mysqldump" | sudo tee -a /etc/sudoers

これにより、backupuserはroot権限を持たずに、mysqldumpコマンドのみを実行できます。

2. cronジョブの入力検証

cronジョブに外部からの入力を与える場合は、必ず入力検証を行います。例えば、以下のようなリスクがあります:

  • コマンドインジェクション攻撃
  • パス名攻撃
  • 引数の改ざん

入力検証の例:

#!/bin/bash

cron_job.sh

入力値を検証

if [[ ! "$1" =~ ^[a-zA-Z0-9_]+$ ]]; then echo "Invalid input" >&2 exit 1 fi

安全な実行

/path/to/safe_command "$1"

このスクリプトでは、引数が英数字とアンダースコアのみで構成されていることを確認しています。

3. cronジョブの出力管理

cronジョブの出力は、以下の方法で適切に管理します:

  • 出力のファイルへのリダイレクト:ジョブの出力をファイルに保存します
  • メール通知の制限:不要なメール通知を防ぐため、出力をファイルにリダイレクトします
  • ログローテーション:出力ファイルが肥大化しないように、ログローテーションを設定します

出力管理の例:

0 3 * * * /usr/bin/command > /var/log/command_output.log 2>&1

このジョブでは、コマンドの標準出力とエラー出力を/var/log/command_output.logに保存します。

4. cronジョブのアク…

cronジョブへの不正なアクセスを防ぐため、以下の対策を講じます:

  • crontabファイルのパーミッションを制限/var/spool/cron/ディレクトリのパーミッションを適切に設定します
  • cron.allowとcron.denyの活用:特定のユーザーのみがcronを使用できるように制限します
  • ジョブの実行ログを監視:cronジョブの実行ログを監視し、不審な活動を検知します

/etc/cron.allow/etc/cron.denyを使用したアクセス制御の例:

# /etc/cron.allowの作成
echo "admin" | sudo tee /etc/cron.allow
echo "backupuser" | sudo tee -a /etc/cron.allow

/etc/cron.denyの作成(全てのユーザーを拒否する)

echo "ALL" | sudo tee /etc/cron.deny

この設定により、adminとbackupuserのみがcronを使用できます。

5. cronジョブの暗号化

cronジョブで機密情報(パスワード、APIキーなど)を扱う場合は、暗号化された形式で保存します。例えば、以下の方法があります:

  • 環境変数ファイルの暗号化:機密情報を暗号化されたファイルに保存し、ジョブ実行時に復号します
  • 鍵管理サービスの活用:AWS KMS、HashiCorp Vaultなどの鍵管理サービスを使用します
  • スクリプト内の暗号化:機密情報を暗号化された形式でスクリプト内に埋め込みます

暗号化された環境変数ファイルを使用する例:

# 暗号化された環境変数ファイル(.env.enc)を復号
0 3 * * * /usr/bin/openssl enc -d -aes-256-cbc -in /opt/scripts/.env.enc -out /tmp/decrypted_env -k "encryption_key" && source /tmp/decrypted_env && /usr/bin/command

このジョブでは、暗号化された環境変数ファイルを復号してから、コマンドを実行します。

6. cronジョブの監視…

cronジョブの実行状況を監視し、異常を検知する仕組みを導入します。以下の方法があります:

  • syslogへの出力:cronジョブの実行ログをsyslogに出力します
  • 監視ツールの活用:Nagios、Zabbix、Prometheusなどの監視ツールを使用します
  • メール通知の設定:ジョブの実行に失敗した場合に管理者に通知します

syslogへの出力設定の例:

# /etc/rsyslog.confに追加
cron.*    /var/log/cron.log

cronジョブの出力をsyslogにリダイレクト

0 * * * * /usr/bin/command 2>&1 | logger -t cronjob

この設定により、cronジョブの実行ログが/var/log/cron.logに記録されます。

7. cronジョブの定期…

cronジョブは定期的に見直し、不要なジョブや古いジョブを削除します。以下のガイドラインに従ってください:

  • ジョブの必要性を再確認:ジョブが本当に必要かどうかを定期的に見直します
  • ジョブの実行頻度を最適化:実行頻度が過剰でないかを確認します
  • ジョブの実行結果を確認:ジョブの実行結果を定期的に確認し、異常がないかをチェックします

ジョブの見直しを自動化するスクリプトの例:

#!/bin/bash

review_cron_jobs.sh

古いジョブの検出(6ヶ月以上実行されていないジョブ)

OLD_JOBS=$(grep -v "^#" /var/spool/cron/crontabs/* | awk '{print $0}' | while read line; do LAST_RUN=$(grep "$line" /var/log/cron.log | tail -1 | awk '{print $1" "$2}') if [ -z "$LAST_RUN" ]; then echo "$line" else LAST_DATE=$(date -d "$LAST_RUN" +%s) CURRENT_DATE=$(date +%s) DIFF_DAYS=$(( (CURRENT_DATE - LAST_DATE) / 86400 )) if [ $DIFF_DAYS -gt 180 ]; then echo "$line" fi fi done)

結果を管理者に通知

if [ -n "$OLD_JOBS" ]; then echo "Old cron jobs detected:" | mail -s "Cron Job Review Alert" admin@example.com echo "$OLD_JOBS" | mail -s "Cron Job Review Alert" admin@example.com fi

このスクリプトは、6ヶ月以上実行されていないジョブを検出し、管理者に通知します。

これらのセキュリティベストプラクティスを実践することで、cronを安全に活用し、システムのセキュリティを向上させることができます。


cronのトラブルシューティング完全ガイド

cronを使用していると、さまざまな問題に遭遇することがあります。以下に、cronに関する一般的な問題とその解決策を網羅的に解説します。

1. cronジョブが実行…

cronジョブが実行されない場合の主な原因と解決策を以下に示します:

<
【編集・制作ポリシー】
本記事はRoute Bloom編集部が各ベンダー公式ドキュメント・エンジニア監修をもとに作成しています。インフラ・クラウド構築は環境により異なります。本番環境への適用前に必ずテストを実施してください。情報の正確性には万全を期していますが、最新情報は各公式ドキュメントをご確認ください。
ABOUT ME
たから
サラリーマンをしながら開業して経営やってます。 今年、本業で独立・別事業を起業予定です。 ◆経験:IT講師/インフラエンジニア/PM/マネジメント/採用/運用・保守・構築・設計 ◆取得資格:CCNA/CCNP/LPIC-1/AZ-900/FE/サーティファイC言語 ◆サイドビジネス:アパレル事業/複数のWEBメディアを運営
原因確認方法解決策