Linux cronで定期実行|書き方と実例ガイド

Linux cronを活用すれば、システム管理者は定期的なタスク実行を自動化できます。サーバーのバックアップ、ログローテーション、データベースの最適化など、手動で行っていた作業を cron に任せることで、運用効率を大幅に向上させましょう。本記事では、cron の基本的な書き方から実践的な設定例、トラブルシューティングまで、具体的な手順を交えて解説します。
目次
cronとは
cron は、Unix系 OS(Linux、macOS など)で標準的に利用されるスケジューリングツールです。システム管理者や開発者は、 cron を使って定期的なタスク(ジョブ)を自動実行できます。例えば、毎日深夜にデータベースのバックアップを取得したり、毎週月曜日の朝にログファイルを圧縮したりすることが可能です。
cron は、システム全体で動作する cron デーモン(crond) と、ユーザーごとに設定できる crontab から構成されます。crond は常にバックグラウンドで実行されており、設定されたスケジュールに従ってジョブを実行します。
cronの主な特徴
- 柔軟なスケジューリング:分・時・日・月・曜日を指定して、細かい実行タイミングを設定できます。
- 複数ユーザー対応:root ユーザーや一般ユーザーごとに cron ジョブを設定できます。
- ログ出力:ジョブの実行結果は syslog に記録されるため、トラブルシューティングが容易です。
- 軽量:システムリソースの消費が少なく、長期間にわたって安定稼働します。
cronが適しているタスク
cron は以下のような定期的な作業に最適です。
- システムのバックアップ
- ログファイルのローテーション
- データベースの最適化(例:MySQL の OPTIMIZE TABLE)
- システムの監視(例:ディスク容量のチェック)
- ウェブサイトのコンテンツ更新(例:RSS フィードの取得)
cronの基本構文
cron の設定は、crontab と呼ばれるファイルに記述します。crontab の各行は、以下の形式で記述します。
* * * * * command_to_execute
各 * は、以下の順序で時間を表します。
| 位置 | 項目 | 範囲 | 説明 |
|---|---|---|---|
| 1 | 分 | 0–59 | 実行する分を指定します。 |
| 2 | 時 | 0–23 | 実行する時刻(24時間表記)を指定します。 |
| 3 | 日 | 1–31 | 実行する日を指定します。 |
| 4 | 月 | 1–12 | 実行する月を指定します。 |
| 5 | 曜日 | 0–7(0と7は日曜日) | 実行する曜日を指定します。 |
特殊文字の使い方
cron では、以下の特殊文字を使って柔軟なスケジューリングが可能です。
| 特殊文字 | 説明 | 使用例 |
|---|---|---|
| * | 全ての値を表します。 | * * * * * command(毎分実行) |
| , | 複数の値をカンマ区切りで指定します。 | 0,15,30,45 * * * * command(15分ごとに実行) |
| – | 範囲を指定します。 | 0 9-17 * * * command(9時から17時まで毎時実行) |
| / | 間隔を指定します。 | */5 * * * * command(5分ごとに実行) |
| @ | 一般的な間隔を表します。 | @daily command(毎日0時に実行) |
よく使われるcron書式の設定例
| 表記 | 実行タイミング |
|---|---|
0 * * * * | 毎時0分 |
0 0 * * * | 毎日0時 |
0 0 * * 0 | 毎週日曜日の0時 |
0 0 1 * * | 毎月1日の0時 |
*/10 * * * * | 10分ごと |
0 9-17 * * 1-5 | 月曜日から金曜日の9時から17時まで毎時 |
crontabの編集方法
crontab は、ユーザーごとに設定される cron の設定ファイルです。以下の手順で編集できます。
1. crontab の編集方法
crontab を編集するには、以下のコマンドを使用します。
- ユーザー固有の crontab 編集:
crontab -e - root ユーザーの crontab 編集:
sudo crontab -e - crontab の表示:
crontab -l - crontab の削除:
crontab -r
2. crontab の編集方法
- ターミナルを開き、以下のコマンドを実行します。
crontab -e - テキストエディタが開くので、以下の形式で cron ジョブを追加します。
* * * * * /path/to/command arg1 arg2 - ファイルを保存してエディタを終了します。
- crontab を再読み込みして、変更を反映します。
crontab -l
3. cron ジョブの実行結果
cron ジョブは、通常のシェル環境とは異なる環境で実行されます。そのため、以下の点に注意が必要です。
- PATH 環境変数:cron は、通常の PATH を引き継がないため、フルパスでコマンドを指定する必要があります。
- シェルの違い:cron は /bin/sh で実行されるため、bash 特有の機能(例:配列、関数)は使用できません。
- 環境変数:cron ジョブは、ユーザーの環境変数を引き継がないため、必要な環境変数は明示的に設定する必要があります。
これらの問題を回避するため、cron ジョブの先頭に以下のように環境変数を設定することを推奨します。
SHELL=/bin/bash
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
MAILTO=your-email@example.com
4. cron ジョブのログ確認方法
cron ジョブの実行結果は、通常 /var/log/syslog に記録されます。以下のコマンドで確認できます。
grep CRON /var/log/syslog
または、journalctl を使用している場合は以下のコマンドで確認します。
journalctl -u cron --no-pager
実例で学ぶcron設定
バックアップの自動化
サーバーの重要なデータを定期的にバックアップすることは、システム管理の基本です。以下に、MySQL データベースとシステムファイルのバックアップを自動化する cron ジョブの例を示します。
1. MySQL データベースのバックアップ
MySQL データベースのバックアップには、mysqldump コマンドを使用します。以下の cron ジョブは、毎日午前2時にデータベース mydb をバックアップします。
0 2 * * * /usr/bin/mysqldump -u root -pYourPassword mydb > /backup/mydb_$(date +\%Y\%m\%d).sql
注意事項:
-pYourPasswordのようにパスワードを直接記述するのはセキュリティ上好ましくありません。代わりに、.my.cnfファイルにパスワードを記述し、--defaults-fileオプションで指定することを推奨します。- バックアップファイルは、別のディスクやクラウドストレージに保存することを推奨します。
2. システムファイルのバックアップ
システムファイルのバックアップには、tar コマンドを使用します。以下の cron ジョブは、毎週日曜日の午前3時に /home ディレクトリを圧縮してバックアップします。
0 3 * * 0 /bin/tar -czvf /backup/home_$(date +\%Y\%m\%d).tar.gz /home
ログローテーション
ログファイルが肥大化すると、ディスク容量を圧迫したり、システムのパフォーマンスに影響を与えたりする可能性があります。cron を使って、ログローテーションを自動化しましょう。
1. 標準的なログローテーション
以下の cron ジョブは、毎日午前1時に /var/log/nginx/access.log をローテーションします。
0 1 * * * /usr/sbin/logrotate -f /etc/logrotate.d/nginx
注意事項:
/etc/logrotate.d/nginxは、ログローテーションの設定ファイルです。詳細は logrotate の公式マニュアル を参照してください。- ログローテーション後、古いログファイルは圧縮され、
.gzファイルとして保存されます。
2. カスタムログローテーション
以下のスクリプトは、カスタムログローテーションを実行します。例えば、過去7日分のログのみ保持する場合です。
#!/bin/bash
LOG_DIR="/var/log/myapp"
DAYS_TO_KEEP=7
find "$LOG_DIR" -name "*.log" -type f -mtime +$DAYS_TO_KEEP -delete
このスクリプトを /usr/local/bin/cleanup_logs.sh に保存し、以下の cron ジョブで毎日実行します。
0 2 * * * /usr/local/bin/cleanup_logs.sh
データベースの最適化
データベースのテーブルが肥大化すると、クエリのパフォーマンスが低下する可能性があります。定期的にテーブルを最適化することで、パフォーマンスを維持しましょう。
1. MySQL のテーブル最適化
以下の cron ジョブは、毎週土曜日の午前4時に MySQL の全テーブルを最適化します。
0 4 * * 6 /usr/bin/mysqlcheck --optimize --all-databases -u root -pYourPassword
注意事項:
- 最適化処理は、テーブルのロックを伴うため、負荷の高い時間帯を避けて実行することを推奨します。
- 大規模なデータベースの場合、最適化処理に時間がかかることがあります。
2. PostgreSQL のテーブル最適化
PostgreSQL の場合は、VACUUM コマンドを使用します。以下の cron ジョブは、毎週日曜日の午前5時に全テーブルを VACUUM します。
0 5 * * 0 /usr/bin/vacuumdb --all --full --analyze
cronのトラブルシューティング
cron ジョブが期待通りに実行されない場合は、以下の手順でトラブルシューティングを行います。
1. cron サービスの状態確認
cron サービスが正常に動作しているか確認します。
systemctl status cron
または、古いシステムの場合は以下のコマンドを使用します。
service cron status
2. cron ジョブの実行結果
cron ジョブの実行結果は、/var/log/syslog または journalctl で確認できます。
grep CRON /var/log/syslog
または、journalctl を使用している場合は以下のコマンドを実行します。
journalctl -u cron --no-pager
3. 一般的なエラーと対処法
| エラー | 原因 | 対処法 |
|---|---|---|
| ジョブが実行されない | cron サービスが停止している | sudo systemctl start cron を実行してサービスを起動します。 |
| ジョブが実行されない | crontab の構文エラー | crontab -e で構文を確認し、正しい形式で記述します。 |
| ジョブが実行されない | PATH 環境変数が不足している | cron ジョブの先頭に PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin を追加します。 |
| ジョブが実行されない | コマンドのパスが間違っている | フルパスでコマンドを指定します。 |
| ジョブが実行されない | 権限不足 | ジョブを実行するユーザーに適切な権限を付与します。 |
| ジョブが実行されるがエラーが発生 | コマンドの引数が間違っている | コマンドのマニュアルを参照し、正しい引数を指定します。 |
| ジョブが実行されるがエラーが発生 | 環境変数が不足している | 必要な環境変数を cron ジョブの先頭に追加します。 |
4. cron ジョブのテスト方法
cron ジョブをテストするには、以下の方法があります。
- 手動実行:cron ジョブと同じコマンドを手動で実行し、結果を確認します。
- 一時的な cron ジョブ:crontab に一時的なジョブを追加し、実行結果を確認します。
- メール通知:
MAILTO変数を使って、ジョブの実行結果をメールで受信します。
例えば、以下の cron ジョブは、ジョブの実行結果を admin@example.com に送信します。
MAILTO=admin@example.com
0 * * * * /path/to/command arg1 arg2
cronのセキュリティ設定
cron は便利なツールですが、セキュリティリスクも伴います。以下のセキュリティ設定を実施して、安全に cron を利用しましょう。
1. 不要な cron ジョブ
不要な cron ジョブは、システムのセキュリティリスクを高める可能性があります。定期的に crontab を確認し、不要なジョブを削除します。
crontab -l
2. cron ジョブの権限を最小限にする
cron ジョブは、実行するユーザーの権限で実行されます。不要に root 権限でジョブを実行しないようにします。
- root 権限が必要なジョブのみ、root の crontab に登録します。
- 一般ユーザーの crontab に登録できるジョブは、一般ユーザーの権限で実行します。
3. cron ジョブの出力
cron ジョブの出力は、メールで送信される場合があります。不要な出力を抑制するため、以下の方法を使用します。
- 出力の破棄:
command > /dev/null 2>&1を使って、出力を破棄します。 - ログファイルへの出力:
command >> /var/log/cron.log 2>&1を使って、ログファイルに出力します。
4. cron のアクセス制御
cron のアクセスを制御するには、/etc/cron.allow と /etc/cron.deny ファイルを使用します。
- cron.allow:cron を利用できるユーザーを指定します。
- cron.deny:cron を利用できないユーザーを指定します。
例えば、/etc/cron.deny に以下の内容を追加すると、ユーザー guest は cron を利用できなくなります。
guest
5. cron ジョブの暗号化
cron ジョブで機密情報を扱う場合は、暗号化されたファイルや環境変数を使用します。例えば、データベースのパスワードを暗号化されたファイルに保存し、--defaults-file オプションで指定します。
cronの代替ツール
cron は汎用的なスケジューリングツールですが、より高度な機能を求める場合は、以下の代替ツールを検討してください。
1. systemd タイマー
systemd タイマー は、systemd ベースの Linux ディストリビューションで利用できるスケジューリングツールです。cron と比較して、以下の利点があります。
- 依存関係の管理:他の systemd サービスとの依存関係を設定できます。
- 柔軟なスケジューリング:cron よりも柔軟なスケジューリングが可能です。
- 統合ログ:
journalctlで簡単にログを確認できます。
以下に、systemd タイマーの設定例を示します。
サービスファイル(/etc/systemd/system/backup.service):
[Unit]
Description=Backup Service
[Service]
Type=oneshot
ExecStart=/usr/bin/tar -czvf /backup/home_$(date +\%Y\%m\%d).tar.gz /home
タイマーファイル(/etc/systemd/system/backup.timer):
[Unit]
Description=Backup Timer
[Timer]
OnCalendar=*-*-* 02:00:00
Persistent=true
[Install]
WantedBy=timers.target
設定後、以下のコマンドでタイマーを有効化します。
sudo systemctl enable --now backup.timer
2. Ansible
Ansible は、構成管理ツールですが、定期的なタスク実行にも利用できます。Ansible を使えば、複数のサーバーに対して一貫したタスク実行が可能です。
以下に、Ansible を使ったバックアップタスクの例を示します。
---
- name: Backup home directory
hosts: all
tasks:
- name: Create backup
archive:
path: /home
dest: /backup/home_{{ ansible_date_time.date }}.tar.gz
format: gz
Ansible を cron で定期実行することで、複数のサーバーに対して一貫したタスク実行が可能です。
3. Kubernetes CronJob
Kubernetes CronJob は、Kubernetes クラスタ内で定期的なタスクを実行するためのリソースです。コンテナ化されたアプリケーションのバックアップやデータ処理などに利用されます。
以下に、Kubernetes CronJob の設定例を示します。
apiVersion: batch/v1
kind: CronJob
metadata:
name: backup
spec:
schedule: "0 2 * * *"
jobTemplate:
spec:
template:
spec:
containers:
- name: backup
image: alpine
command: ["/bin/sh", "-c", "tar -czvf /backup/home_$(date +%Y%m%d).tar.gz /home"]
restartPolicy: OnFailure
まとめ
Linux cron を活用すれば、システム管理者は定期的なタスクを自動化し、運用効率を大幅に向上させることができます。本記事では、cron の基本的な書き方から実践的な設定例、トラブルシューティング、セキュリティ設定まで、幅広く解説しました。
cron を使う際のポイントを以下にまとめます。
- 基本構文を理解する:cron の構文は、分・時・日・月・曜日を指定する形式です。特殊文字(*, -, /, ,)を活用して、柔軟なスケジューリングを実現しましょう。
- crontab の編集方法を習得する:
crontab -eコマンドで crontab を編集し、ジョブを追加・削除します。環境変数や PATH の設定にも注意が必要です。 - 実践的な設定例を参考にする:バックアップ、ログローテーション、データベースの最適化など、具体的な設定例を参考に cron ジョブを作成しましょう。
- トラブルシューティングを習得する:cron ジョブが実行されない場合は、ログを確認し、一般的なエラーと対処法を理解しておきましょう。
- セキュリティ設定を実施する:不要な cron ジョブを削除し、権限制限やアクセス制御を実施して、安全に cron を利用しましょう。
- 代替ツールを検討する:cron よりも高度な機能が必要な場合は、systemd タイマー、Ansible、Kubernetes CronJob などの代替ツールを検討しましょう。
cron は、Linux システムの運用において欠かせないツールです。本記事を参考に、効率的なタスク管理を実現してください。
よくある質問(FAQ)
Q1. cron ジョブが実行されないのはなぜですか?
回答:
cron ジョブが実行されない場合は、以下の手順でトラブルシューティングを行います。
- cron サービスの状態確認:
systemctl status cronまたはservice cron statusを実行して、cron サービスが正常に動作しているか確認します。 - crontab の構文確認:
crontab -eで crontab を開き、構文に間違いがないか確認します。 - PATH 環境変数の確認:cron ジョブは、通常の PATH を引き継がないため、フルパスでコマンドを指定する必要があります。
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/binを cron ジョブの先頭に追加します。 - ログの確認:
grep CRON /var/log/syslogまたはjournalctl -u cron --no-pagerを実行して、cron ジョブの実行ログを確認します。 - 権限の確認:ジョブを実行するユーザーに適切な権限が付与されているか確認します。
Q2. cronジョブが実行されない場合、まず何を確認すべきですか?
Q. cronジョブが突然停止する原因として考えられるものは?
A. cronジョブが停止する主な原因には、システムリソースの不足(メモリ・CPU)、cronサービス自体の障害、ジョブの競合、またはジョブ実行時のエラー(ファイル権限不足・コマンドパス不正)が挙げられます。また、ジョブが長時間実行され続けると、システムによって強制終了される場合もあります。定期的なジョブの監視やログ確認に加え、ジョブの実行時間やリソース使用量を考慮することが重要です。
Q. cronジョブの実行タイミングがずれる理由は?
A. cronジョブの実行タイミングがずれる主な理由として、システム時刻のずれ(NTP未同期)、cronデーモンの再起動、またはジョブが重複実行された場合の競合が考えられます。また、システム負荷が高い場合、cronがジョブを実行するタイミングが遅延することもあります。定期的にシステム時刻を確認し、cronサービスの再起動やジョブの排他制御を検討してください。
本記事はInfra Academy編集部が各ベンダー公式ドキュメント・エンジニア監修をもとに作成しています。インフラ・クラウド構築は環境により異なります。本番環境への適用前に必ずテストを実施してください。情報の正確性には万全を期していますが、最新情報は各公式ドキュメントをご確認ください。 編集ポリシーはこちら




