🎯 この記事で学べること
- 1`cron`の基本的な概念と仕組みを理解できます
- 2crontabの時刻指定フォーマットをマスターできます
- 3定期バックアップやシステムメンテナンスの自動化ができるようになります
- 4@記法などの便利な機能を活用できます
- 5エラーハンドリングとログ管理のベストプラクティスが身につきます
読了時間: 約10分
cronとは
みなさん、毎日同じ時間にバックアップを取ったり、定期的にログをクリーンアップしたりする作業を手動でやっていませんか?そんな繰り返し作業を自動化してくれるのがcron
(クーロン)です!
cron
は、Linuxシステムで定期的にコマンドやスクリプトを自動実行するためのスケジューラです。一度設定してしまえば、あとは自動で実行してくれるので、作業の効率化と確実性が大幅に向上しますよ!
cronの基本概念
crontabファイル
cronジョブはcrontab
(cron table)と呼ばれるファイルに記述します。各ユーザーが独自のcrontabを持つことができるんです。
# 現在のユーザーのcrontabを表示
$ crontab -l
# crontabを編集
$ crontab -e
# crontabを削除(注意!)
$ crontab -r
crontab -r
は確認なしでcrontabを削除します。誤って実行しないよう注意してくださいね!
cronの時刻指定フォーマット
crontabの各行は以下の形式で記述します。これが最初は少し難しく感じるかもしれませんが、慣れれば簡単ですよ!
分 時 日 月 曜日 コマンド
各フィールドの値:
- 分 - 0-59
- 時 - 0-23(24時間表記)
- 日 - 1-31
- 月 - 1-12(またはjan-dec)
- 曜日 - 0-7(0と7は日曜日、またはsun-sat)
基本的な使い方
シンプルな例
まずは基本的な例から見ていきましょう!
# 毎日午前3時30分に実行
30 3 * * * /path/to/script.sh
# 毎時0分に実行
0 * * * * /usr/local/bin/hourly_task.sh
# 平日の午前9時に実行
0 9 * * 1-5 /usr/local/bin/weekday_task.sh
特殊文字の使い方
cronでは便利な特殊文字が使えます!
# アスタリスク(*): すべての値
* * * * * echo "毎分実行"
# カンマ(,): 複数の値を指定
0 9,12,18 * * * echo "9時、12時、18時に実行"
# ハイフン(-): 範囲を指定
0 9-17 * * * echo "9時から17時まで毎時実行"
# スラッシュ(/): 間隔を指定
*/5 * * * * echo "5分ごとに実行"
*/2 * * * * echo "2分ごとに実行"
*/5
は「5分ごと」を意味します。0,5,10,15...という具合に5分間隔で実行されますよ!
よく使うスケジュール例
定期バックアップ
実際によく使われるバックアップのスケジュール例です!
# 毎日深夜2時にバックアップ
0 2 * * * /usr/local/bin/backup.sh
# 毎週日曜日の午前1時にフルバックアップ
0 1 * * 0 /usr/local/bin/full_backup.sh
# 毎月1日の午前3時に月次バックアップ
0 3 1 * * /usr/local/bin/monthly_backup.sh
システムメンテナンス
システムを健全に保つためのメンテナンスタスクです。
# 毎日午前4時に古いログファイルを削除
0 4 * * * find /var/log -name "*.log" -mtime +30 -delete
# 毎時ディスク使用量をチェック
0 * * * * df -h > /var/log/disk_usage.log
# 毎週月曜日にシステムアップデート
0 3 * * 1 apt-get update && apt-get upgrade -y
レポート生成
定期的なレポート生成も自動化できます!
# 平日の午前9時に日次レポート
0 9 * * 1-5 /usr/local/bin/daily_report.sh
# 毎月最終日の午後6時に月次レポート
0 18 28-31 * * [ $(date -d tomorrow +\%d) -eq 1 ] && /usr/local/bin/monthly_report.sh
# 四半期ごとのレポート(1,4,7,10月の1日)
0 0 1 1,4,7,10 * /usr/local/bin/quarterly_report.sh
特殊な時刻指定
@記法
cronには便利な@記法があります。覚えやすくて便利ですよ!
@reboot # システム起動時
@yearly # 年に1回(0 0 1 1 *と同じ)
@annually # @yearlyと同じ
@monthly # 月に1回(0 0 1 * *と同じ)
@weekly # 週に1回(0 0 * * 0と同じ)
@daily # 日に1回(0 0 * * *と同じ)
@midnight # @dailyと同じ
@hourly # 時間ごと(0 * * * *と同じ)
使用例:
# 毎日バックアップ
@daily /backup/daily_backup.sh
# 週次クリーンアップ
@weekly /maintenance/weekly_cleanup.sh
# システム起動時にサービス初期化
@reboot /startup/init_services.sh
環境変数の設定
crontab内での環境変数
cronは最小限の環境で実行されるので、必要な環境変数は明示的に設定しましょう!
# crontabファイル内で環境変数を設定
SHELL=/bin/bash
PATH=/usr/local/bin:/usr/bin:/bin
MAILTO=admin@example.com
HOME=/home/username
# 環境変数を使用
0 2 * * * $HOME/scripts/backup.sh
# 複数のメールアドレスに送信
MAILTO="admin@example.com,backup@example.com"
0 3 * * * /usr/local/bin/important_task.sh
スクリプト内での環境設定
スクリプト内でも環境を整えることが重要です。
#!/bin/bash
# backup.sh
# 必要な環境変数を設定
export PATH=/usr/local/bin:$PATH
export BACKUP_DIR=/backup
export DATE=$(date +%Y%m%d)
# バックアップ実行
tar -czf $BACKUP_DIR/backup_$DATE.tar.gz /important/data
出力とログ管理
標準出力とエラー出力
cronジョブの出力は適切に管理しましょう!
# 出力を破棄
0 2 * * * /scripts/task.sh > /dev/null 2>&1
# 出力をファイルに保存
0 3 * * * /scripts/backup.sh > /var/log/backup.log 2>&1
# 追記モードで保存
0 4 * * * /scripts/monitor.sh >> /var/log/monitor.log 2>&1
# 標準出力とエラー出力を別々に保存
0 5 * * * /scripts/process.sh > /var/log/process.log 2> /var/log/process_error.log
ログローテーション
ログファイルが大きくなりすぎないように管理しましょう。
#!/bin/bash
# log_rotate.sh
LOG_DIR="/var/log/myapp"
KEEP_DAYS=7
# 古いログを圧縮
find $LOG_DIR -name "*.log" -mtime +1 -exec gzip {} \;
# 指定日数より古い圧縮ログを削除
find $LOG_DIR -name "*.log.gz" -mtime +$KEEP_DAYS -delete
実践的な使用例
データベースバックアップ
データベースの自動バックアップは必須ですね!
# MySQLの日次バックアップ
0 2 * * * mysqldump -u root -p'password' --all-databases | gzip > /backup/mysql_$(date +\%Y\%m\%d).sql.gz
# PostgreSQLのバックアップ
0 3 * * * pg_dump -U postgres dbname | gzip > /backup/postgres_$(date +\%Y\%m\%d).sql.gz
# バックアップファイルの世代管理
0 4 * * * find /backup -name "*.sql.gz" -mtime +7 -delete
パスワードを直接cronに書くのは避けましょう。設定ファイルや環境変数を使う方が安全です!
Webサイト監視
Webサイトの死活監視も自動化できます。
#!/bin/bash
# website_monitor.sh
URL="https://example.com"
EXPECTED_STATUS="200"
# HTTPステータスコードを取得
STATUS=$(curl -s -o /dev/null -w "%{http_code}" $URL)
if [ "$STATUS" != "$EXPECTED_STATUS" ]; then
echo "Alert: Website is down! Status: $STATUS" | mail -s "Website Alert" admin@example.com
fi
cronに登録:
# 5分ごとにWebサイトを監視
*/5 * * * * /usr/local/bin/website_monitor.sh
トラブルシューティング
cronが動作しない場合
cronが動かない時のチェックポイントです!
# cronサービスの状態確認
$ systemctl status cron
# または
$ service cron status
# cronログの確認
$ grep CRON /var/log/syslog
# または
$ journalctl -u cron
パスの問題
cronでよくある問題はPATHです。必ずフルパスを使うか、PATHを設定しましょう!
# フルパスを使用
0 2 * * * /usr/bin/python3 /home/user/scripts/task.py
# またはPATHを設定
PATH=/usr/local/bin:/usr/bin:/bin
0 2 * * * python3 /home/user/scripts/task.py
デバッグ方法
問題を見つけるためのデバッグテクニックです。
# テスト用に毎分実行
* * * * * /path/to/script.sh >> /tmp/cron_debug.log 2>&1
# スクリプトの最初でデバッグ情報を出力
#!/bin/bash
echo "Script started at $(date)" >> /tmp/debug.log
echo "PATH=$PATH" >> /tmp/debug.log
echo "USER=$USER" >> /tmp/debug.log
🎮 理解度チェック
📝 まとめ
今回はcron
について学びました!
cron
は定期的なタスクを自動実行するスケジューラ- crontabで「分 時 日 月 曜日 コマンド」の形式で記述
- @記法で簡単に一般的なスケジュールを指定できる
- 環境変数とPATHの設定が重要
- 適切なログ管理とエラーハンドリングで確実な自動化を実現
次はsystemctlコマンドで、サービスの管理方法を学びましょう!