Linuxサーバーを運用していると、
「バックアップスクリプトを毎日決まった時間に自動で動かしたい」
「ログを毎晩まとめて整理したい」
といった場面はよくあります。
そんなとき便利なのが、cron(クロン)というタスクスケジューラです。
この記事では:
- cronの基本的な仕組みと動作原理
- 毎日決まった時間に実行する詳細な設定方法
- つまずきやすい注意点とトラブルシューティング
- 実際の業務で使える実用的な設定例
を初心者の方にもわかりやすく解説します。
cronの基本概念と仕組み

cronとは何か?
cronの定義
cronは、LinuxやUnix系OSに標準搭載されている時間ベースのジョブスケジューラです。
設定ファイル(crontab)にスケジュールを記述することで、コマンドやスクリプトを自動的に実行できます。
cronの主な用途
- システム保守:ログローテーション、一時ファイル削除
- バックアップ:データベース、ファイルの定期バックアップ
- 監視・レポート:システム状態の監視、レポート生成
- データ処理:バッチ処理、データ集計・変換
cronの動作原理
cronデーモン(crond)
cronは「crond」というバックグラウンドプロセス(デーモン)として常時動作しています。
動作確認方法
# cronデーモンの状態確認
systemctl status cron # Debian/Ubuntu
systemctl status crond # CentOS/RHEL
# プロセス確認
ps aux | grep cron
crontabファイルの管理
各ユーザーと系統全体のcronジョブは、以下の場所で管理されています:
種類 | 場所 | 用途 |
---|---|---|
ユーザーcrontab | /var/spool/cron/ | 個別ユーザーのジョブ |
システムcrontab | /etc/crontab | システム全体のジョブ |
追加ディレクトリ | /etc/cron.d/ | パッケージ管理用 |
crontabの基本構文

標準的な構文形式
分 時 日 月 曜日 コマンド
各フィールドの詳細
フィールド | 範囲 | 説明 | 例 |
---|---|---|---|
分 | 0-59 | 分を指定 | 0, 15, 30, 45 |
時 | 0-23 | 時を指定(24時間形式) | 0, 9, 18, 23 |
日 | 1-31 | 月内の日を指定 | 1, 15, 31 |
月 | 1-12 | 月を指定 | 1(1月), 12(12月) |
曜日 | 0-7 | 曜日を指定(0と7は日曜) | 0(日), 1(月), 6(土) |
特殊文字の活用
アスタリスク(*)
「すべての値」を意味します。
例
# 毎時0分に実行
0 * * * * /path/to/script.sh
# 毎日毎時毎分実行(通常は推奨されません)
* * * * * /path/to/script.sh
ハイフン(-)
範囲を指定します。
例
# 平日(月-金)の9時に実行
0 9 * * 1-5 /path/to/script.sh
# 1月から3月の毎日実行
0 0 * 1-3 * /path/to/script.sh
カンマ(,)
複数の値を指定します。
例
# 毎日9時、12時、18時に実行
0 9,12,18 * * * /path/to/script.sh
# 月、水、金曜日に実行
0 9 * * 1,3,5 /path/to/script.sh
スラッシュ(/)
間隔を指定します。
例
# 15分おきに実行
*/15 * * * * /path/to/script.sh
# 2時間おきに実行
0 */2 * * * /path/to/script.sh
毎日実行の具体的な設定例

基本的な毎日実行パターン
特定時刻での実行
毎日午前3時に実行
0 3 * * * /home/user/scripts/backup.sh
毎日午後11時30分に実行
30 23 * * * /home/user/scripts/cleanup.sh
毎日正午に実行
0 12 * * * /home/user/scripts/report.sh
1日複数回の実行
毎日3回(9時、12時、18時)実行
0 9,12,18 * * * /home/user/scripts/check_status.sh
4時間おきに実行
0 */4 * * * /home/user/scripts/monitor.sh
特殊な時間指定記法
@記法の活用
crontabでは、よく使われるパターンに対して特別な記法が用意されています:
記法 | 同等の cron 式 | 説明 |
---|---|---|
@daily | 0 0 * * * | 毎日午前0時 |
@midnight | 0 0 * * * | 毎日午前0時(@dailyと同じ) |
@hourly | 0 * * * * | 毎時0分 |
@weekly | 0 0 * * 0 | 毎週日曜日午前0時 |
@monthly | 0 0 1 * * | 毎月1日午前0時 |
@yearly | 0 0 1 1 * | 毎年1月1日午前0時 |
@annually | 0 0 1 1 * | 毎年1月1日午前0時(@yearlyと同じ) |
使用例
# 毎日午前0時にバックアップ実行
@daily /home/user/scripts/daily_backup.sh
# 毎時間システムチェック
@hourly /home/user/scripts/hourly_check.sh
実用的な設定例
バックアップスクリプトの自動実行
データベースの毎日バックアップ
# 毎日午前2時にMySQLバックアップ
0 2 * * * /usr/bin/mysqldump -u backup_user -p'password' database_name > /backup/daily/db_$(date +\%Y\%m\%d).sql
ファイルシステムバックアップ
# 毎日午前3時にホームディレクトリをバックアップ
0 3 * * * /usr/bin/tar -czf /backup/home_backup_$(date +\%Y\%m\%d).tar.gz /home/user/
ログ管理の自動化
ログファイルの圧縮
# 毎日午前1時に古いログを圧縮
0 1 * * * /usr/bin/find /var/log/myapp/ -name "*.log" -mtime +1 -exec gzip {} \;
ログローテーション
# 毎日午前0時5分にカスタムログローテーション
5 0 * * * /home/user/scripts/custom_logrotate.sh
crontabの設定と管理

ユーザーcrontabの操作
crontabの編集
基本的な編集コマンド
# 現在のユーザーのcrontabを編集
crontab -e
# 特定ユーザーのcrontabを編集(root権限必要)
crontab -u username -e
初回実行時のエディタ選択
# エディタの選択画面が表示される例
Select an editor. To change later, run 'select-editor'.
1. /bin/nano <---- easiest
2. /usr/bin/vim.basic
3. /usr/bin/vim.tiny
4. /bin/ed
Choose 1-4 [1]:
crontabの表示と管理
現在の設定確認
# 現在のユーザーのcrontab表示
crontab -l
# 特定ユーザーのcrontab表示
crontab -u username -l
crontabの削除
# 現在のユーザーのcrontab削除(要注意)
crontab -r
# 確認付きで削除
crontab -i -r
システムcrontabの管理
/etc/crontabの編集
システム全体のcron設定
# システムcrontabの確認
cat /etc/crontab
# システムcrontabの編集
sudo vim /etc/crontab
システムcrontabの構文
# システムcrontabはユーザー名フィールドが追加される
# 分 時 日 月 曜日 ユーザー名 コマンド
0 2 * * * root /usr/bin/find /tmp -type f -atime +7 -delete
/etc/cron.d/ ディレクトリの活用
個別設定ファイルの作成
# /etc/cron.d/に個別ファイルを作成
sudo vim /etc/cron.d/my_daily_tasks
# ファイル内容例
SHELL=/bin/bash
PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin
# 毎日午前3時にスクリプト実行
0 3 * * * myuser /home/myuser/scripts/daily_maintenance.sh
環境変数とパスの設定

cronでの環境変数の問題
よくある問題
cronで実行されるジョブは、通常のシェル環境とは異なる限定的な環境で動作します:
制限される環境変数
- PATH:非常に限定的(通常は
/usr/bin:/bin
のみ) - HOME:ユーザーのホームディレクトリ
- SHELL:通常は
/bin/sh
- その他のカスタム環境変数:設定されていない
解決方法
方法1:crontab内で環境変数を設定
# crontabファイルの先頭で環境変数を設定
SHELL=/bin/bash
PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin
HOME=/home/user
# ジョブ定義
0 3 * * * /home/user/scripts/backup.sh
方法2:フルパスでコマンドを指定
# すべてのコマンドをフルパスで記述
0 3 * * * /usr/bin/python3 /home/user/scripts/backup.py
方法3:スクリプト内で環境変数を設定
#!/bin/bash
# スクリプト冒頭で必要な環境変数を設定
export PATH="/usr/local/bin:$PATH"
export LANG="en_US.UTF-8"
# 実際の処理
python3 /home/user/scripts/data_processing.py
実行権限の設定
スクリプトファイルの権限設定
実行権限の付与
# スクリプトファイルに実行権限を付与
chmod +x /home/user/scripts/backup.sh
# 権限の確認
ls -la /home/user/scripts/backup.sh
適切な権限設定例
# 所有者のみ読み書き実行可能
chmod 700 /home/user/scripts/backup.sh
# 所有者とグループが読み実行可能
chmod 750 /home/user/scripts/backup.sh
ログ出力とデバッグ

ログ出力の設定
標準出力とエラー出力の処理
基本的なログ設定
# 標準出力をファイルに保存
0 3 * * * /home/user/scripts/backup.sh > /home/user/logs/backup.log
# エラー出力も含めて保存
0 3 * * * /home/user/scripts/backup.sh >> /home/user/logs/backup.log 2>&1
# 出力を完全に破棄
0 3 * * * /home/user/scripts/cleanup.sh > /dev/null 2>&1
タイムスタンプ付きログ
# 実行時刻を記録
0 3 * * * echo "$(date): Starting backup" >> /home/user/logs/backup.log; /home/user/scripts/backup.sh >> /home/user/logs/backup.log 2>&1
ログローテーションの設定
logrotateの設定例
# /etc/logrotate.d/mycron の作成
/home/user/logs/*.log {
daily
rotate 7
compress
delaycompress
missingok
notifempty
create 644 user user
}
デバッグとトラブルシューティング
cronの実行ログ確認
システムログでcronの動作確認
# cronの実行ログを確認
grep CRON /var/log/syslog
# 特定ユーザーのcron実行状況
grep "CRON.*user" /var/log/syslog
# 直近のcron実行状況
tail -f /var/log/syslog | grep CRON
よくある問題と対処法
問題1:スクリプトが実行されない
診断手順
# 1. crontabの設定確認
crontab -l
# 2. スクリプトの実行権限確認
ls -la /path/to/script.sh
# 3. 手動でスクリプトを実行してテスト
/path/to/script.sh
# 4. cronログで実行状況確認
grep CRON /var/log/syslog | tail -10
問題2:スクリプトは実行されるが期待した結果にならない
デバッグ用の詳細ログ設定
# デバッグ情報を含むログ設定
0 3 * * * (echo "=== Start $(date) ==="; /home/user/scripts/backup.sh; echo "=== End $(date) ===") >> /home/user/logs/debug.log 2>&1
高度な設定とベストプラクティス

複雑なスケジューリング
条件付き実行
営業日のみ実行(土日を除く)
# 月曜から金曜のみ実行
0 9 * * 1-5 /home/user/scripts/business_day_report.sh
月末のみ実行
# 各月の最終日(月末)に実行するスクリプト例
0 23 28-31 * * [ $(date -d tomorrow +\%d) = "01" ] && /home/user/scripts/month_end.sh
ファイル存在チェック付き実行
ファイルが存在する場合のみ実行
# 処理対象ファイルが存在する場合のみ実行
*/5 * * * * [ -f /home/user/data/input.txt ] && /home/user/scripts/process_data.sh
セキュリティとベストプラクティス
セキュアなcron設定
権限制限
# cronの実行を特定ユーザーのみに制限
# /etc/cron.allow に許可ユーザーを記載
echo "user1" | sudo tee -a /etc/cron.allow
echo "user2" | sudo tee -a /etc/cron.allow
# 拒否ユーザーの設定
echo "guest" | sudo tee -a /etc/cron.deny
パスワードを含むスクリプトの保護
# スクリプトファイルの権限を厳しく設定
chmod 600 /home/user/scripts/db_backup.sh
# 設定ファイルで認証情報を分離
# ~/.my.cnf などに認証情報を保存し、スクリプトから参照
可用性の向上
エラー処理とリトライ機能
#!/bin/bash
# リトライ機能付きスクリプトの例
RETRIES=3
DELAY=60
for i in $(seq 1 $RETRIES); do
if /usr/bin/rsync -avz /source/ /destination/; then
echo "Backup successful on attempt $i"
exit 0
else
echo "Backup failed on attempt $i"
if [ $i -lt $RETRIES ]; then
sleep $DELAY
fi
fi
done
echo "Backup failed after $RETRIES attempts"
exit 1
通知機能の実装
# 失敗時のメール通知
0 3 * * * /home/user/scripts/backup.sh || echo "Backup failed on $(hostname)" | mail -s "Backup Error" admin@example.com
システム管理での実践例

実際のサーバー運用での活用例
Webサーバーのメンテナンス
アクセスログの処理
# 毎日午前2時にアクセスログを解析・アーカイブ
0 2 * * * /usr/local/bin/goaccess /var/log/nginx/access.log -o /var/www/html/reports/daily_$(date +\%Y\%m\%d).html
# 7日以上古いログファイルを圧縮
10 2 * * * /usr/bin/find /var/log/nginx/ -name "*.log" -mtime +7 -exec gzip {} \;
データベースメンテナンス
毎日のバックアップとクリーンアップ
# PostgreSQLの毎日バックアップ
0 1 * * * /usr/bin/pg_dump -U postgres mydb | gzip > /backup/postgres/mydb_$(date +\%Y\%m\%d).sql.gz
# MySQL/MariaDBの最適化
30 3 * * * /usr/bin/mysqlcheck -u root -p'password' --auto-repair --optimize --all-databases
セキュリティ監視
ログの監視と異常検知
# 毎時間、失敗したログイン試行をチェック
0 * * * * /usr/bin/grep "Failed password" /var/log/auth.log | tail -20 | mail -s "Login Failures $(hostname)" security@example.com
# 毎日のセキュリティスキャン
0 4 * * * /usr/bin/rkhunter --check --skip-keypress --report-warnings-only
まとめ
Linuxでcronを使った毎日の自動実行は、システム管理において非常に重要な技術です。重要なポイントを整理すると:
基本的な設定方法
- crontab構文:「分 時 日 月 曜日 コマンド」の形式
- 毎日実行:
0 3 * * *
(毎日3時)や@daily
(毎日0時) - 設定管理:
crontab -e
で編集、crontab -l
で確認
成功のためのポイント
- フルパス指定:コマンドとスクリプトは絶対パスで記述
- 実行権限:スクリプトファイルに適切な実行権限を設定
- 環境変数:必要に応じてPATHやその他の環境変数を明示的に設定
- ログ出力:実行結果とエラーを適切にログに記録
トラブル予防策
- テスト実行:本格運用前に手動でスクリプトをテスト
- 段階的導入:まず短時間間隔でテスト、問題なければ本来のスケジュールに変更
- 監視設定:定期的なログ確認とアラート設定
- バックアップ:重要なcrontab設定は定期的にバックアップ
実用的な応用
- バックアップ自動化:データベース、ファイルシステムの定期バックアップ
- ログ管理:ログローテーション、古いファイルの自動削除
- システム監視:リソース使用状況、セキュリティイベントの監視
- レポート生成:日次・週次・月次レポートの自動作成
コメント