メインコンテンツへスキップ
中級10分で読める

cronで定期実行

Linuxのcronを使って、バックアップやメンテナンスなどの作業を自動化する方法を実例を交えて詳しく解説します。

システム編cron自動化スケジューラ定期実行タスク管理

🎯 この記事で学べること

  • 1
    `cron`の基本的な概念と仕組みを理解できます
  • 2
    crontabの時刻指定フォーマットをマスターできます
  • 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

🎮 理解度チェック

毎日午前2時30分にスクリプトを実行するcrontabの記述は?
5分ごとにコマンドを実行する記述は?
@dailyと同じ意味の時刻指定は?

📝 まとめ

今回はcronについて学びました!

  • cronは定期的なタスクを自動実行するスケジューラ
  • crontabで「分 時 日 月 曜日 コマンド」の形式で記述
  • @記法で簡単に一般的なスケジュールを指定できる
  • 環境変数とPATHの設定が重要
  • 適切なログ管理とエラーハンドリングで確実な自動化を実現

次はsystemctlコマンドで、サービスの管理方法を学びましょう!