Linuxシステムで定期的なタスクを自動化するなら、cronを使うのが最も効率的です。システム管理者や開発者にとって、cronはバックアップ、ログローテーション、データベースメンテナンスなどの定期実行に欠かせないツールです。この記事では、cronの基本設定から応用テクニックまで、実務で使える具体的な手順を解説します。

cronを正しく設定すれば、手動実行の手間を省き、システムの安定性と効率を大幅に向上させられます。本記事を最後まで読めば、 cronの仕組み、設定方法、トラブルシューティングまで一通り理解できるでしょう。

目次

cronとは

cronは、Unix系OS(Linux、macOS、BSDなど)で標準的に利用されるスケジューリングデーモンです。システム管理者やユーザーが定期的に実行したいコマンドやスクリプトを自動化するためのツールです。

cronの最大の特徴は、システムが常時稼働している限り、設定したスケジュールに従って自動的にジョブを実行する点です。例えば、毎日深夜にバックアップを取得したり、毎週月曜日の朝9時にログを集計したりするようなタスクを、 cronに登録しておけば、手動で実行する必要がなくなります。

cronは、以下のような場面で広く活用されています。

  • システムログのローテーション(古いログの削除や圧縮)
  • データベースのバックアップ
  • ウェブサイトのコンテンツ更新(クローリングやキャッシュクリア)
  • システムメンテナンス(ディスク使用量の監視、不要ファイルの削除)
  • 定期的なレポートの生成とメール送信

cronを使うことで、手動実行の手間を省き、ヒューマンエラーを防ぐだけでなく、システムの安定性と効率を向上させることができます。

cronの仕組みと動作原理

cronの構成要素

cronは、主に以下の3つの要素で構成されています。

要素説明
cronデーモン(crond)システム上で常時稼働しているプロセス。設定されたジョブを監視し、指定された時刻に実行する。
crontabファイルジョブのスケジュールを記述するファイル。各ユーザーごとにcrontabファイルが存在する。
cronコマンドcrontabファイルを編集・管理するためのコマンド(例:crontab -e、crontab -l)。

cronの動作原理

cronは、以下の流れでジョブを実行します。

  1. cronデーモンの起動:システム起動時にcronデーモン(crond)が自動的に起動します。
  2. crontabファイルの読み込み:cronデーモンは、システム全体のcrontab(/etc/crontab)と各ユーザーのcrontab(/var/spool/cron/)を定期的に読み込みます。
  3. ジョブのスケジュール管理:cronデーモンは、読み込んだcrontabファイルに基づいて、次に実行すべきジョブを管理します。
  4. ジョブの実行:指定された時刻になると、cronデーモンは対応するジョブを実行します。ジョブは、指定されたユーザーの権限で実行されます。

cronの実行環境

cronで実行されるジョブは、通常のシェル環境とは異なる環境で実行されます。具体的には、以下の点に注意が必要です。

  • 環境変数の違い:cronで実行されるジョブは、ログインシェルと同じ環境変数を継承しません。そのため、PATH環境変数が不足していたり、特定のコマンドが見つからない場合があります。
  • カレントディレクトリ:cronジョブのカレントディレクトリは、通常 / です。そのため、相対パスを使用する場合は注意が必要です。
  • 標準入出力:cronジョブの標準出力(stdout)と標準エラー出力(stderr)は、通常 /dev/null に送られます。そのため、ジョブの実行結果を確認するには、明示的に出力先を指定する必要があります。

これらの違いを理解し、適切に対応することで、cronジョブのトラブルを未然に防ぐことができます。

cronの基本設定方法

crontabファイルの編集方法

cronのジョブを設定するには、crontabファイルを編集します。crontabファイルは、各ユーザーごとに存在し、以下のコマンドで編集できます。

crontab -e

このコマンドを実行すると、デフォルトのエディタ(通常はvi)が起動し、crontabファイルの編集が可能になります。

crontabファイルの形式は、以下の通りです。

分 時 日 月 曜日 コマンド

各フィールドの詳細は、以下の通りです。

フィールド説明有効な値
実行する分を指定します。0~59
実行する時を指定します。0~23
実行する日を指定します。1~31
実行する月を指定します。1~12
曜日実行する曜日を指定します。0~7(0と7は日曜、1は月曜、…6は土曜)
コマンド実行するコマンドを指定します。フルパスで指定することを推奨

cronの基本的な設定例

以下に、cronの基本的な設定例をいくつか紹介します。

  • 毎日午前3時にバックアップを実行する
0 3 * * * /usr/local/bin/backup.sh
  • 毎週月曜日の午前9時にログを集計する
0 9 * * 1 /usr/local/bin/log_analyze.sh
  • 毎月1日の午前0時にシステムメンテナンスを実行する
0 0 1 * * /usr/local/bin/system_maintenance.sh
  • 毎日午前6時と午後6時にシステムステータスを確認する
0 6,18 * * * /usr/local/bin/check_system.sh
  • 毎時0分に特定のコマンドを実行する
0 * * * * /usr/local/bin/hourly_task.sh

crontabファイルの確認と削除

crontabファイルに設定したジョブを確認するには、以下のコマンドを実行します。

crontab -l

crontabファイルを削除するには、以下のコマンドを実行します。

crontab -r

注意:crontab -rを実行すると、crontabファイルが完全に削除されます。実行する前に、必ずcrontab -lで内容を確認してください。

システム全体のcrontab(/etc/crontab)

cronには、システム全体でジョブを設定できる/etc/crontabというファイルも存在します。このファイルは、rootユーザーのみが編集できます。

/etc/crontabの形式は、以下の通りです。

分 時 日 月 曜日 ユーザー名 コマンド

ユーザー名フィールドが追加されている点が、ユーザーごとのcrontabと異なります。このフィールドで、ジョブを実行するユーザーを指定します。

例えば、以下の設定は、毎日午前3時にrootユーザーでバックアップを実行します。

0 3 * * * root /usr/local/bin/backup.sh

cronジョブの実行環境を整える

cronジョブを実行する際には、環境変数やカレントディレクトリに注意が必要です。以下に、cronジョブの実行環境を整えるためのテクニックを紹介します。

  • フルパスでコマンドを指定する:cronジョブでは、PATH環境変数が不足している場合があります。そのため、コマンドは必ずフルパスで指定してください。
  • 環境変数を明示的に設定する:必要な環境変数は、cronジョブ内で明示的に設定してください。例えば、以下のようにします。
0 * * * * . /home/user/.profile; /usr/local/bin/hourly_task.sh
  • カレントディレクトリを指定する:ジョブを実行するディレクトリを明示的に指定するには、cdコマンドを使用します。例えば、以下のようにします。
0 * * * * cd /home/user/work && /usr/local/bin/hourly_task.sh
  • 出力をファイルにリダイレクトする:cronジョブの実行結果を確認するには、出力をファイルにリダイレクトします。例えば、以下のようにします。
0 * * * * /usr/local/bin/hourly_task.sh >> /var/log/hourly_task.log 2>&1

この設定では、ジョブの標準出力と標準エラー出力を /var/log/hourly_task.log にリダイレクトしています。

cronの応用テクニック

複数のジョブを同時に実行する

cronでは、1行で1つのジョブしか設定できません。しかし、複数のジョブを同時に実行したい場合は、以下のようにジョブを連結します。

0 * * * * /usr/local/bin/job1.sh && /usr/local/bin/job2.sh

この設定では、job1.shが正常に終了した後に、job2.shが実行されます。

また、複数のジョブを並列で実行したい場合は、以下のようにジョブをセミコロンで区切ります。

0 * * * * /usr/local/bin/job1.sh; /usr/local/bin/job2.sh

この設定では、job1.shとjob2.shが並列で実行されます。

ジョブの実行結果をメールで通知する

cronジョブの実行結果をメールで通知するには、MAILTO環境変数を設定します。例えば、以下のようにします。

MAILTO="user@example.com"
0 * * * * /usr/local/bin/hourly_task.sh

この設定では、ジョブの実行結果が user@example.com にメールで送信されます。

また、ジョブの出力をファイルにリダイレクトし、そのファイルをメールに添付することもできます。

0 * * * * /usr/local/bin/hourly_task.sh >> /var/log/hourly_task.log 2>&1
0 9 * * * echo "ジョブの実行結果" | mail -s "ジョブ実行報告" -A /var/log/hourly_task.log user@example.com

ジョブの実行間隔を柔軟に設定する

cronでは、ジョブの実行間隔を柔軟に設定できます。以下に、代表的な設定例を紹介します。

  • 毎時0分、15分、30分、45分に実行する
0,15,30,45 * * * * /usr/local/bin/quarter_hourly_task.sh
  • 毎週月曜日から金曜日の午前9時から午後5時まで1時間ごとに実行する
0 9-17 * * 1-5 /usr/local/bin/hourly_task.sh
  • 毎月1日、15日、月末に実行する
0 0 1,15,L * * /usr/local/bin/semi_monthly_task.sh

Lは「ラスト(last)」を意味し、月末を指定します。

ジョブの実行を一時的に停止する

cronジョブを一時的に停止するには、ジョブの先頭に # を付けてコメントアウトします。例えば、以下のようにします。

#0 * * * * /usr/local/bin/hourly_task.sh

また、crontabファイルを一時的に無効にするには、以下のコマンドを実行します。

crontab -r

ただし、このコマンドを実行すると、crontabファイルが完全に削除されるため、注意が必要です。

ジョブの実行ログを管理する

cronジョブの実行ログを管理するには、ジョブの出力をログファイルにリダイレクトします。例えば、以下のようにします。

0 * * * * /usr/local/bin/hourly_task.sh >> /var/log/hourly_task.log 2>&1

この設定では、ジョブの標準出力と標準エラー出力が /var/log/hourly_task.log に追記されます。

ログファイルのサイズが肥大化しないように、ログローテーションを設定することを推奨します。ログローテーションは、logrotateコマンドを使用して設定できます。

cronのトラブルシューティング

cronジョブが実行されない場合の対処法

cronジョブが実行されない場合は、以下の点を確認してください。

  • crontabファイルが正しく編集されているか:crontab -lコマンドで、crontabファイルの内容を確認してください。
  • cronデーモンが稼働しているか:以下のコマンドで、cronデーモンの稼働状況を確認してください。
systemctl status crond

または

service crond status
  • ジョブの実行環境が整っているか:ジョブの実行環境(PATH環境変数、カレントディレクトリ、環境変数)が整っているか確認してください。
  • ジョブのコマンドが正しいか:ジョブのコマンドが正しいか、手動で実行して確認してください。
  • ジョブの実行権限があるか:ジョブを実行するユーザーに、コマンドを実行する権限があるか確認してください。
  • システムのリソースが不足していないか:システムのリソース(CPU、メモリ、ディスク)が不足していないか確認してください。

cronジョブの実行結果を確認する

cronジョブの実行結果を確認するには、以下の方法があります。

  • ジョブの出力をファイルにリダイレクトする:ジョブの出力をファイルにリダイレクトし、そのファイルを確認します。
  • MAILTO環境変数を設定する:MAILTO環境変数を設定し、ジョブの実行結果をメールで受信します。
  • syslogに出力する:ジョブの出力をsyslogに出力し、/var/log/syslogや/var/log/messagesから確認します。

例えば、以下のようにジョブの出力をsyslogに出力します。

0 * * * * /usr/local/bin/hourly_task.sh | logger -t hourly_task

この設定では、ジョブの出力が syslog に “hourly_task” というタグ付きで出力されます。syslogの内容は、以下のコマンドで確認できます。

grep hourly_task /var/log/syslog

cronジョブの実行時間を最適化する

cronジョブの実行時間が長くなると、システムのパフォーマンスに影響を与える可能性があります。そのため、ジョブの実行時間を最適化することが重要です。

以下に、ジョブの実行時間を最適化するためのテクニックを紹介します。

  • ジョブを小さく分割する:長時間実行されるジョブは、複数の小さなジョブに分割します。
  • ジョブの実行間隔を調整する:ジョブの実行間隔を長くすることで、システムへの負荷を軽減します。
  • ジョブの実行優先度を下げる:niceコマンドやioniceコマンドを使用して、ジョブの実行優先度を下げます。
  • ジョブの実行環境を最適化する:ジョブの実行環境(CPU、メモリ、ディスクI/O)を最適化します。

cronジョブのセキュリティを確保する

cronジョブを実行する際には、セキュリティに注意が必要です。以下に、cronジョブのセキュリティを確保するためのテクニックを紹介します。

  • ジョブの実行権限を最小限にする:ジョブを実行するユーザーに、必要最小限の権限のみ与えます。
  • ジョブのコマンドを暗号化する:機密情報を含むジョブのコマンドは、暗号化して保存します。
  • ジョブの実行ログを監視する:ジョブの実行ログを監視し、不審なアクティビティを検出します。
  • ジョブの実行環境を隔離する:ジョブの実行環境をコンテナや仮想マシンで隔離します。

cronの代替ツールと比較

cronはLinuxシステムで広く利用されていますが、代替ツールも存在します。以下に、代表的な代替ツールとcronとの比較を紹介します。

ツール説明特徴主な用途
systemd timerssystemdに組み込まれたスケジューリング機能cronと同様の機能を提供し、systemdとの統合が強いシステムサービスの定期実行
Anacroncronの拡張版で、システムがオフラインの場合でもジョブを実行システムがオフラインの場合、次回起動時にジョブを実行ラップトップやデスクトップPCでのジョブ実行
at1回限りのジョブを実行するためのコマンド指定した時刻に1回だけジョブを実行1回限りのタスク実行
fcroncronの機能を拡張したツール柔軟なスケジューリング、ジョブの依存関係管理、リソース制限など高度なジョブスケジューリング
Airflowワークフロー管理プラットフォーム複雑なワークフローをグラフィカルに管理大規模なデータパイプラインの管理

systemd timers vs cron

systemd timersは、systemdに組み込まれたスケジューリング機能で、cronの代替として利用できます。systemd timersの特徴は以下の通りです。

  • systemdとの統合:systemd timersは、systemdと密接に統合されており、サービスの起動や停止と連携できます。
  • 柔軟なスケジューリング:cronと同様のスケジューリング機能に加え、依存関係や条件付き実行などの高度な機能を提供します。
  • リソース管理:cgroupを使用して、ジョブのリソース使用量を制限できます。
  • ログ管理:systemdのログ機能(journalctl)と連携し、ジョブの実行ログを一元管理できます。

systemd timersを使用するには、以下の手順で設定します。

  1. サービスファイルを作成する:ジョブを実行するサービスを定義する.serviceファイルを作成します。
  2. タイマーファイルを作成する:ジョブのスケジュールを定義する.timerファイルを作成します。
  3. サービスとタイマーを有効化する:systemctlコマンドを使用して、サービスとタイマーを有効化します。

例えば、以下のように設定します。

サービスファイル(/etc/systemd/system/backup.service)

[Unit]
Description=Backup Service

[Service]
ExecStart=/usr/local/bin/backup.sh

タイマーファイル(/etc/systemd/system/backup.timer)

[Unit]
Description=Backup Timer

[Timer]
OnCalendar=*-*-* 03:00:00
Persistent=true

[Install]
WantedBy=timers.target

サービスとタイマーを有効化する

sudo systemctl enable backup.service
sudo systemctl enable backup.timer
sudo systemctl start backup.timer

Anacron vs cron

Anacronは、cronの拡張版で、システムがオフラインの場合でもジョブを実行します。Anacronの特徴は以下の通りです。

  • オフライン時のジョブ実行:システムがオフラインの場合、次回起動時にジョブを実行します。
  • 柔軟なスケジューリング:cronと同様のスケジューリング機能に加え、ジョブの実行間隔を柔軟に設定できます。
  • シンプルな設定:cronと同様の設定ファイル(/etc/anacrontab)を使用します。

Anacronを使用するには、以下の手順で設定します。

  1. Anacronをインストールする:多くのLinuxディストリビューションでは、Anacronはデフォルトでインストールされています。
  2. /etc/anacrontabファイルを編集する:ジョブのスケジュールを定義する /etc/anacrontab ファイルを編集します。
  3. Anacronを起動する:Anacronを起動します。

例えば、以下のように設定します。

/etc/anacrontabファイル

# period   delay   job-identifier   command
7         10      backup           /usr/local/bin/backup.sh

この設定では、7日ごとに /usr/local/bin/backup.sh を実行します。システムがオフラインの場合は、次回起動時にジョブを実行します。

まとめ

Linuxのcronを活用すれば、システム管理や開発業務における定期的なタスクを自動化し、作業効率を大幅に向上させることができます。本記事では、cronの基本的な仕組みから、実務で使える応用テクニック、トラブルシューティングまで、幅広く解説しました。

cronを正しく設定することで、バックアップ、ログローテーション、データベースメンテナンスなどの定期実行を自動化し、手動実行の手間を省くことができます。また、ジョブの実行結果をメールで通知したり、ログファイルにリダイレクトしたりすることで、実行状況を把握しやすくなります。

cronの代替ツールとして、systemd timersやAnacronなども紹介しました。これらのツールを使うことで、cronでは実現できない高度な機能を利用できます。例えば、systemd timersを使えば、サービスの起動や停止と連携したジョブ実行が可能になります。Anacronを使えば、システムがオフラインの場合でもジョブを実行できます。

cronを使いこなすためには、ジョブの実行環境やセキュリティに注意することが重要です。ジョブの実行環境(PATH環境変数、カレントディレクトリ、環境変数)を整え、ジョブの実行権限を最小限にすることで、トラブルを未然に防ぐことができます。

最後に、cronを使う際には、以下のポイントを押さえておきましょう。

  • ジョブの実行環境を整える:フルパスでコマンドを指定し、必要な環境変数を明示的に設定します。
  • ジョブの実行結果を確認する:ジョブの出力をファイルにリダイレクトしたり、MAILTO環境変数を設定したりして、実行結果を把握します。
  • ジョブの実行ログを管理する:ジョブの実行ログをsyslogに出力したり、ログローテーションを設定したりして、ログを適切に管理します。
  • ジョブのセキュリティを確保する:ジョブの実行権限を最小限にし、機密情報を含むジョブのコマンドは暗号化して保存します。
  • 代替ツールも検討する:cronの代替ツール(systemd timers、Anacronなど)も検討し、目的に応じて使い分けます。

これらのポイントを押さえて、cronを効果的に活用しましょう。定期的なタスクの自動化により、システム管理や開発業務の効率を大幅に向上させることができます。

よくある質問

### Q. cronとは何ですか?どのような用途で使用されますか?

A. cronはLinux/Unixシステムで定期的なジョブを自動実行するためのデーモンです。システム管理者やユーザーが設定したスケジュールに基づいて、指定したコマンドやスクリプトを自動的に実行します。主な用途としては、ログのローテーション、バックアップ、データベースのメンテナンス、システム監視などがあります。crontabコマンドを使用して設定ファイル(crontab)を編集し、実行タイミングやコマンドを指定します。

### Q. cronの設定方法を教えてください。基本的な書式を知りたいです。

A. cronの設定は`crontab -e`コマンドで編集する`crontab`ファイルに記述します。各行は以下の書式で記載します:
`分 時 日 月 曜日 コマンド`
例えば、`0 3 * * * /usr/bin/backup.sh`は毎日3時に`/usr/bin/backup.sh`を実行します。`*`は全ての値を意味し、`/5`のように間隔を指定することもできます。設定後は保存して終了すると、cronが自動的に反映されます。

### Q. cronジョブの実行結果やエラーを確認する方法はありますか?

A. cronジョブの実行結果やエラーは、デフォルトではメールで送信されるか、またはジョブ内でリダイレクトしてログに出力する必要があります。例えば、`0 3 * * * /usr/bin/backup.sh >> /var/log/backup.log 2>&1`のように、ジョブの最後に`>>`でログファイルに出力を追記し、`2>&1`でエラー出力もまとめます。また、`mail`コマンドでシステムメールを確認することもできます。


### Q. cronジョブが実行されない場合のトラブルシューティング方法を教えてください。

A. cronジョブが実行されない場合は、まず`crontab -l`で設定が正しく反映されているか確認します。次に、`/var/log/cron`や`/var/log/syslog`などのシステムログを確認し、ジョブの実行履歴やエラーを調べます。また、ジョブのパスが絶対パスで指定されているか、環境変数が必要な場合は`crontab`内で明示的に設定する必要があります。実行権限やファイルの所有者も確認しましょう。

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