【Bash講座 第11回】サーバー管理の完全自動化!バックアップ・監視スクリプトとCronの鉄則

【Bash講座 第11回】寝ている間に仕事が終わる?「完全自動化」へのラストピース

こんにちは!「リナックス先生」です。
前回は、テキスト処理の三種の神器(grep, sed, awk)を使って、ログ解析を行う方法を学びました。
コウ君、スクリプト作りは捗ってる?

コウ君

先生!ログ解析スクリプトのおかげで、エラーの集計がめちゃくちゃ楽になりました!
でも…結局そのスクリプトを「毎日手動で実行」してるんですよね。
昨日は実行するのを忘れて帰っちゃって、先輩に怒られました…。
僕が寝ている間も、勝手にやってくれないかなぁ。

リナックス先生

人間だもの、忘れちゃうことはあるわ。
だからこそ、定型業務は機械に任せるべきなの。
今回は、サーバー管理者の最強のパートナー「Cron(クーロン)」を使って、スクリプトの定期実行をセットするわよ。
さらに、実務で必須の「世代管理付きバックアップ」「ディスク監視」のスクリプトも作るわ。これが書ければ一人前のエンジニアよ!

第11回となる今回は、これまでの知識の集大成として「実践的な自動化スクリプト」を作成し、それを「Cron」でスケジュール実行する手順を解説します。
ここを乗り越えれば、あなたは「サーバーに張り付かなくていい自由な時間」を手に入れられます。

本講座のカリキュラム(全12回)

AlmaLinux 9 (RHEL 9互換) 環境を前提に、基礎から応用までステップバイステップで進めます。

  1. Bash入門編:シェルとカーネルの関係、CUIの哲学、環境構築
  2. ファイル操作の極意:絶対パス・相対パスと「ワイルドカード」の魔術
  3. 権限(パーミッション)とユーザー:chmod, chown, sudoの仕組みを完全理解
  4. 入出力リダイレクトとパイプ:Linuxの真骨頂!コマンド同士を連携させる技術
  5. テキスト処理の基本:cat, head, tail, less…ファイルの中身を覗く道具たち
  6. 最強のエディタ「Vi/Vim」入門:サーバー内でテキストを編集する必須スキル
  7. シェルスクリプトの第一歩:ファイルにまとめて自動実行!変数と引数の基礎
  8. 条件分岐(if文):サーバーの状態を見て「判断」できるスクリプトを作る
  9. 繰り返し処理(for/while文):面倒な単純作業を1秒で終わらせるループ処理
  10. テキスト処理の応用:grep, sed, awk…ログ解析の達人になるための三種の神器
  11. 【今回】実践・自動化スクリプト:バックアップと監視を自動化し、Cronで定期実行する
  12. 総仕上げ:自作スクリプトの集大成と、エンジニアとしての歩き方

1. 実践1:世代管理付きバックアップスクリプト

ただコピーを取るだけなら簡単ですが、プロの現場では「毎日バックアップを取りつつ、30日より前の古いデータは自動で消す」という運用が求められます。
これを「世代管理」と呼びます。

スクリプトの要件

  • /var/www/html (Webサイトのデータ)を圧縮してバックアップする。
  • ファイル名には「日付」をつける。
  • バックアップ先は /backup ディレクトリ。
  • 保存期間は7日間とし、それより古いファイルは削除する。
  • 処理結果をログに残す。

スクリプト作成 (backup.sh)

#!/bin/bash

# 設定
TARGET_DIR="/var/www/html"
BACKUP_DIR="/backup"
DATE=$(date +%Y%m%d_%H%M)
FILENAME="backup_${DATE}.tar.gz"
LOG_FILE="/var/log/backup_script.log"

# バックアップ先ディレクトリがなければ作成
if [ ! -d "$BACKUP_DIR" ]; then
    mkdir -p "$BACKUP_DIR"
fi

# ログ出力関数
log() {
    echo "[$(date '+%Y-%m-%d %H:%M:%S')] $1" >> "$LOG_FILE"
}

log "バックアップ開始: $TARGET_DIR"

# 1. 圧縮してバックアップ作成 (tarコマンド)
# z:gzip圧縮, c:作成, f:ファイル指定
tar zcf "${BACKUP_DIR}/${FILENAME}" "$TARGET_DIR" 2>> "$LOG_FILE"

if [ $? -eq 0 ]; then
    log "バックアップ成功: ${FILENAME}"
else
    log "バックアップ失敗!"
    exit 1
fi

# 2. 古いバックアップの削除 (findコマンド)
# -mtime +7 : 7日より前の更新日時のファイルを探す
# -delete   : 見つけたファイルを削除する(超便利!)
log "7日より前の古いファイルを削除します..."
find "$BACKUP_DIR" -type f -name "*.tar.gz" -mtime +7 -delete

log "全処理完了"

💡 ポイント解説:findコマンドの魔術

find コマンドは検索だけでなく、アクションも実行できます。
-mtime +7 は「更新日が7日より前(8日前〜)」という意味です。
-delete オプションをつけるだけで、該当ファイルを安全に削除してくれます。(※古いOSでは -exec rm {} \; と書く必要があります)

2. 実践2:ディスク容量監視アラート

サーバーが止まる原因で意外と多いのが「ディスクがいっぱいで書き込めない」という事故です。
容量が危なくなったら警告を出すスクリプトを作りましょう。

スクリプト作成 (disk_check.sh)

#!/bin/bash

# 監視するディスクの使用率閾値(%)
THRESHOLD=90

# dfコマンドの結果から使用率(%)を抜き出す(awkの出番!)
# /dev/root などのメインパーティションを対象にする場合
CURRENT_USE=$(df -h / | grep / | awk '{print $5}' | sed 's/%//')

if [ "$CURRENT_USE" -ge "$THRESHOLD" ]; then
    echo "【警告】ディスク使用率が危険です! 現在: ${CURRENT_USE}%"
    # ここにメール送信コマンドなどを書く
    # 例: echo "Disk Full" | mail -s "Alert" admin@example.com
else
    echo "ディスク使用率は正常です。 現在: ${CURRENT_USE}%"
fi
コウ君

おお…! 第10回で習った awksed がここで役に立つんですね!
90%%sed で消して、数字として比較できるようにしてるのが芸が細かい!

3. 定期実行の守護神「Cron(クーロン)」

スクリプトができたら、いよいよ定期実行の設定です。
Linuxには「crond(クーロンディー)」という常駐プログラムがいて、指定された時間になるとコマンドを実行してくれます。

設定方法:crontab

以下のコマンドで設定ファイルを開きます。

[root@localhost ~]# crontab -e

(Vimが起動します)

Cronの書き方:5つの星

左から順に「分・時・日・月・曜日」を指定します。

# 書式
# 分  時  日  月  曜日  実行したいコマンド

# 例1:毎朝 4:00 にバックアップを実行
00  04  * * * /root/backup.sh

# 例2:平日の 9:30 に実行(曜日は 0=日, 1=月 ... 6=土)
30  09  * * 1-5  /root/weekday_task.sh

# 例3:10分おきに監視スクリプトを実行
*/10 * * * * /root/disk_check.sh

⚠️ 初心者が必ずハマる「環境変数の罠」

Cronで実行される時は、普段ログインしている時とは違い、「PATH(パス)」が通っていません。
つまり、普段なら java だけで動くコマンドが、Cronだと command not found になることがあります。

対策:
1. スクリプト内でコマンドは「フルパス(絶対パス)」で書く。(例:/usr/bin/java
2. スクリプトの冒頭で source /etc/profile などを読み込んで環境変数をセットする。

4. 実行ログの行方とメール通知

Cronが実行したコマンドの結果(標準出力・標準エラー出力)は、デフォルトでは実行ユーザー宛てに「メール(ローカルメール)」として届きます。
しかし、最近の環境ではメール設定をしていないことが多いため、結果がどこにも残らず「動いているか分からない」状態になりがちです。

推奨設定:ログファイルに捨てるか残すか

Crontabの行末でリダイレクトを設定します。

# パターンA:結果はいらない(エラーも捨てる)
00 04 * * * /root/backup.sh > /dev/null 2>&1

# パターンB:実行ログを専用ファイルに残す(追記)
00 04 * * * /root/backup.sh >> /var/log/cron_backup.log 2>&1

基本はパターンBのようにログを残し、スクリプト側で適切にログローテーション(古いログの削除)を行うのがベストプラクティスです。

次回予告:エンジニアとしての第一歩を踏み出そう

第11回は、実務レベルの「自動化スクリプト」と「Cron」について解説しました。
これで、「毎日決まった時間に、古いデータを消しながらバックアップを取り、ディスク容量を監視する」という、サーバー管理者の基本業務が自動化できました。

次回はいよいよ最終回です。
これまで学んだ全12回の知識を総まとめし、「自作スクリプト集」を作って管理する方法や、さらに上のレベル(Git管理やAnsibleなど)へ進むためのロードマップを示します。
黒い画面に怯えていたコウ君も、もう立派なBash使いですね。最後まで駆け抜けましょう!

リナックス先生

次回までに、今日作ったスクリプトをCronに登録して、わざと時間を「5分後」とかに設定してみて。
ちゃんと自動でファイルが作られる瞬間を目撃すると、感動して震えるわよ!

▼Cronの実験も気兼ねなくできる!推奨VPS

【2026年最新】Linuxサーバー構築におすすめのVPS比較3選!現役エンジニアが速度とコスパで厳選
Linuxの勉強、まだ「自分のPC」でやって消耗していませんか?「Linuxを覚えたいけど、環境構築でエラーが出て先に進めない…」「VirtualBoxを入れたらパソコンが重くなった…」これは、Linux学習を始める9割の人がぶつかる壁です...

コメント