高負荷回避のための自動化:夜間バックアップの実現方法
システム運用では、データや構成ファイルの定期的なバックアップが不可欠です。しかし、これらの処理はCPUやI/Oリソースを消費するため、ユーザーの利用ピーク時に実行するとサービス品質に悪影響を与えます。たとえば飲食デリバリーサービスであれば昼の12時から14時、夕方17時から深夜2時が繁忙時間帯であり、動画配信プラットフォームなら夜20時以降が最もアクセスが集中します。こうした状況下で手動でのバックアップを行うのは非効率かつ人的負担が大きいため、cron を用いた自動タスクスケジューリングが必須となります。
設定ファイルの種類と配置場所
Linuxにおける定期タスク(cronジョブ)には、システム全体向けと個別ユーザー向けの2種類があります。
/etc/crontab— システム全体の設定ファイル。実行ユーザーを明示的に指定可能。/var/spool/cron/root— rootユーザー専用のジョブ定義ファイル。/var/spool/cron/username— 一般ユーザーのジョブ(例: yunzhongzi)。
編集には以下のコマンドを使用します:
crontab -e # 現在のユーザーのジョブを編集
crontab -l # 登録済みのジョブ一覧表示
トラブルシューティング時には次のログも確認してください:
/var/log/cron— cronデーモンの実行ログ。/var/spool/mail/root— 標準出力・エラーが出力された場合のメールバッファ(Postfix未設定時はファイルとして残る)。
基本構文とスケジュール表現
cronのスケジュールは5つのフィールドで構成され、順に「分 時 日 月 曜」を表します。
| 位置 | 意味 | 許容値 |
|---|---|---|
| 1 | 分 | 0–59 |
| 2 | 時 | 0–23 |
| 3 | 日 | 1–31 |
| 4 | 月 | 1–12 |
| 5 | 曜日 | 0–6(0=日曜, 7も可) |
特殊記号の使い方:
*:すべての値(毎回実行)。例:* * * * *→ 毎分実行。*/n:n単位ごとの間隔。例:*/10 * * * *→ 10分ごと。1-6:範囲指定。例:0 9-17 * * *→ 午前9時から午後5時まで毎時実行。,:複数の値を指定。例:0 7,12,18 * * *→ 朝7時、正午、夜6時に実行。
実践的な使用例
以下は代表的なcronジョブの設定例です。
# 朝8時30分に「出勤」と出力
30 8 * * * echo "go to work"
# 深夜0時0分に「帰宅」と出力
0 0 * * * echo "go home"
# 毎分、テキストファイルにユーザー名を追記
* * * * * echo "yunzhongziedu" >> /root/yunzhongzi.txt
# 5分ごとにNTPサーバーで時刻同期
*/5 * * * * /usr/sbin/ntpdate ntp1.aliyun.com
注意: コマンドパスが通っていない場合は、which コマンドでフルパスを確認し、絶対パスで記述しましょう。
よくある問題と対策
cronジョブで特に注意すべきポイントを紹介します。
パーセント記号(%)のエスケープ
cronでは%が改行コードとして解釈されるため、日付フォーマットなどで使う際は\%とエスケープが必要です。
# NG: エラーになる
* * * * * touch `date +%F`.txt
# OK: エスケープして使用
* * * * * touch `date +\%F`.txt
# 推奨: スクリプトに切り出して実行
* * * * * sh /root/create_timestamp_dir.sh
標準出力のハンドリング
出力を明示的に破棄しない場合、cronはメール送信を試みます。メールサーバーが無効な環境では/var/spool/postfix/maildrop/などに多数の小ファイルが生成され、inode枯渇の原因になります。
# 出力を破棄する例
* * * * * /root/backup.sh > /dev/null 2>&1
大量の小ファイル検出には次のようなfindコマンドが有効です:
# inode消費の原因になりやすいディレクトリを調査
find /var/spool -type f -size -1k | head -20
# 大きなファイルを探す(100MB以上)
find / -size +100M -exec ls -lh {} \; 2>/dev/null
ベストプラクティスまとめ
- システムジョブは
/etc/crontab、ユーザー別ジョブはcrontab -eで管理。 - PATH環境変数が狭いので、コマンドは絶対パスで記述する。
%記号はエスケープまたは外部スクリプトに移動。- 出力があるジョブは必ず
> /dev/null 2>&1などでリダイレクト。 - 複数のコマンドはbashスクリプトにまとめて
crontabから呼び出す。 - ログ監視と定期的なcleanupタスクを併用して安定運用を確保。