Linuxでcronを使って毎日自動実行する方法|基本構文と設定例をわかりやすく解説

Linux

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 式説明
@daily0 0 * * *毎日午前0時
@midnight0 0 * * *毎日午前0時(@dailyと同じ)
@hourly0 * * * *毎時0分
@weekly0 0 * * 0毎週日曜日午前0時
@monthly0 0 1 * *毎月1日午前0時
@yearly0 0 1 1 *毎年1月1日午前0時
@annually0 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設定は定期的にバックアップ

実用的な応用

  • バックアップ自動化:データベース、ファイルシステムの定期バックアップ
  • ログ管理:ログローテーション、古いファイルの自動削除
  • システム監視:リソース使用状況、セキュリティイベントの監視
  • レポート生成:日次・週次・月次レポートの自動作成

コメント

タイトルとURLをコピーしました