【サーバー管理入門 第10回】管理者を「手作業」から解放する。Cronとシェルスクリプトによる全自動化

Linux

【サーバー管理入門 第10回】管理者を「手作業」から解放する。Cronとシェルスクリプトによる全自動化

こんにちは!「リナックス先生」です。
前回は、ログ管理とjournalctlの使い方を学び、サーバーの健康状態を把握できるようになりました。
コウ君、第8回でデータベースのバックアップ方法(mysqldump)を教えたけれど、あれから毎日ちゃんとバックアップ取ってる?

コウ君

えっ……あー、その……。
最初の3日間くらいは手動でコマンドを打ってたんですけど、最近は忙しくて……。
「今日はまあいいか」ってサボっちゃってます。

リナックス先生

正直でよろしい(笑)。でも、障害はそういう「油断した日」に限って起きるものよ。
人間は忘れるし、ミスをする生き物。
だからプロの管理者は、決まりきった作業を絶対に人間にはやらせないの。
今回は、サーバーの中の執事「Cron(クーロン)」を使って、全てのルーチンワークを全自動化するわよ!

第10回となる今回は、サーバー管理の効率を劇的に向上させる「自動化技術」について解説します。
指定した日時にコマンドを実行する Cron の設定方法から、バックアップを自動化する 「実用的なシェルスクリプト」 の作成まで、現場で即戦力となるスキルを習得しましょう。

本講座のカリキュラム

  1. サーバー管理入門:RHEL系OSの選定理由とローカル仮想環境の構築
  2. 初期設定とセキュリティの要:SSH鍵認証、禁止設定、ユーザー管理の鉄則
  3. パッケージ管理の裏側:dnf/rpmの仕組みとリポジトリの依存関係解決
  4. ネットワーク設定の極意:nmcli、IPアドレス設計、DNSリゾルバの設定
  5. ストレージ管理とファイルシステム:LVMの概念、ディスク拡張、fstabの罠
  6. プロセスとサービス管理:systemd (systemctl) の仕組みとUnit定義ファイルの作成
  7. Webサーバー構築(Nginx):ハイパフォーマンスWebサーバーの導入と設定最適化
  8. データベース構築(MariaDB):インストール、初期セキュリティ、バックアップの基礎
  9. ログ管理とトラブルシュート:rsyslog、journalctl、ログローテートの設計
  10. 【今回】自動化の第一歩:Cronによる定期実行と管理用シェルスクリプトの作成
  11. バックアップと障害復旧:tar/rsyncによるデータ保全とリカバリ手順
  12. 監視と運用設計:サーバーのリソース監視、死活監視、そしてプロの運用論

1. 定期実行の守護神「Cron」とは

Cron(crond)は、あらかじめ指定したスケジュールに従って、コマンドやスクリプトを自動実行してくれる常駐デーモンです。
「毎朝4時にバックアップ」「5分おきに監視」「月曜日の朝だけメール送信」といったことが可能です。

設定ファイルの種類

Cronの設定場所は大きく分けて2つあります。

  • システム設定 (/etc/crontab など): root権限でシステム全体のタスクを管理する場合に使います。ユーザー名の指定が必要です。
  • ユーザー設定 (crontab -e): 各ユーザーが個別に設定する場合に使います。基本的にはこちらを使います。

2. Cronの書き方(呪文の解読)

Cronの設定は、スペース区切りの5つの数字(または記号)と、実行するコマンドで構成されます。
この並び順を暗記するのが最初のステップです。

# 書式
分  時  日  月  曜日  実行したいコマンド
フィールド 入力可能な値
0〜59 0 (毎時0分)
0〜23 4 (朝4時)
1〜31 1 (毎月1日)
1〜12 * (毎月)
曜日 0〜7 (0,7は日曜) 1 (月曜)

便利な記号(ワイルドカード)

  • * :すべて(毎回)
  • , :リスト指定(例:0,30 → 0分と30分に)
  • - :範囲指定(例:9-17 → 9時から17時の間)
  • / :間隔指定(例:*/5 → 5分ごとに)

設定例クイズ

Q1. 30 8 * * *
A. 毎日 朝8時30分 に実行

Q2. 0 */3 * * *
A. 3時間おき(0時, 3時, 6時…)の0分 に実行

Q3. 0 9 * * 1-5
A. 平日(月〜金)の朝9時00分 に実行

3. 実践:バックアップ用シェルスクリプトの作成

Cronには直接長いコマンドを書くこともできますが、プロは「処理をまとめたシェルスクリプト」を作成し、Cronからはそのスクリプトを呼び出すように設定します。
こうすることで、複雑な処理(エラー処理、古いファイルの削除など)が可能になるからです。

今回は、第8回で作成したデータベース webapp_db をバックアップし、さらに「過去7日分より古いファイルは自動削除する」スクリプトを作りましょう。

スクリプト作成

管理者用のスクリプト置き場として /root/bin を作成し、そこに配置します。

[root@server01 ~]# mkdir -p /root/bin
[root@server01 ~]# vi /root/bin/backup_db.sh

backup_db.sh の内容:

#!/bin/bash

# --- 設定変数 ---
BACKUP_DIR="/backup/db"
DB_NAME="webapp_db"
DB_USER="root"
DB_PASS="ここにrootパスワード"
DATE=$(date +%Y%m%d_%H%M)
FILE_NAME="${DB_NAME}_${DATE}.sql.gz"

# --- 準備 ---
# バックアップ保存先がなければ作る
mkdir -p $BACKUP_DIR

# --- バックアップ実行 ---
# mysqldumpの結果をgzipで圧縮して保存
mysqldump -u $DB_USER -p$DB_PASS $DB_NAME | gzip > $BACKUP_DIR/$FILE_NAME

# 実行結果の判定 ($? は直前のコマンドの成功/失敗が入る変数)
if [ $? -eq 0 ]; then
    echo "SUCCESS: Database backup created at $BACKUP_DIR/$FILE_NAME"
    
    # --- 古いファイルの削除 (7日以上前) ---
    # findコマンドで古いファイルを探して削除する
    find $BACKUP_DIR -name "${DB_NAME}_*.sql.gz" -mtime +7 -delete
    echo "CLEANUP: Old backups deleted."
else
    echo "ERROR: Database backup failed!" >&2
    exit 1
fi

💡 ポイント:セキュリティ

このスクリプトにはDBのパスワードが平文で書かれています。
必ず「rootユーザー以外は見られない」ように権限を設定してください。

[root@server01 ~]# chmod 700 /root/bin/backup_db.sh

動作テスト

まずは手動で実行して、エラーが出ないか確認します。

[root@server01 ~]# /root/bin/backup_db.sh
SUCCESS: Database backup created at /backup/db/webapp_db_20240125_1000.sql.gz
CLEANUP: Old backups deleted.

/backup/db/ ディレクトリにファイルが生成されていれば成功です。

4. Cronへの登録と「環境変数の罠」

スクリプトが完成したので、これを毎日深夜3時に実行するようCronに登録します。

crontabの編集

[root@server01 ~]# crontab -e

viエディタが開くので、以下の行を追記します。

0 3 * * * /root/bin/backup_db.sh >> /var/log/db_backup.log 2>&1

⚠️ プロの極意:ログ出力とフルパス

1. 出力の保存:
Cronで実行されたコマンドの出力結果は、通常捨てられるか、root宛てにメールで飛びます。
>> /var/log/db_backup.log 2>&1 と書くことで、実行結果(エラー含む)をログファイルに追記保存できます。「動かない!」という時の調査に必須です。

2. フルパス記述:
Cron実行時は、通常のログイン時と違って PATH (コマンドの検索場所)が通っていないことが多いです。
スクリプト内では mysqldump ではなく /usr/bin/mysqldump と書くか、スクリプトの先頭でPATHを定義するのが安全です。

登録の確認

[root@server01 ~]# crontab -l
0 3 * * * /root/bin/backup_db.sh >> /var/log/db_backup.log 2>&1

5. トラブルシューティング:Cronが動かない時

「設定したはずなのに動いていない」
そんな時は以下の3点を確認してください。

1. Cronのログを確認

Cron自体がコマンドを実行しようとしたかは、/var/log/cron に記録されます。

[root@server01 ~]# grep "backup_db" /var/log/cron
Jan 25 03:00:01 server01 CROND[1234]: (root) CMD (/root/bin/backup_db.sh ...)

これが出ていれば、「Cronは仕事をしたが、スクリプト側でエラーが出ている」可能性が高いです。

2. スクリプトの実行権限

スクリプトに chmod +x (実行権限) がついているか再確認しましょう。

3. %記号のエスケープ

Cronの設定行に直接 date +%Y%m%d などを書く場合、% は「改行」として扱われる特殊記号です。
Cron定義ファイル内で使う場合は \% とエスケープする必要があります。
※ 今回のようにスクリプトファイルの中に書く場合はエスケープ不要です。だからこそスクリプト化が推奨されるのです。

次回予告:壊れたサーバーを蘇らせる

今回は、サーバー管理者の心強い味方、Cronによる自動化を学びました。
これで毎晩自動的にデータベースのバックアップが取られ、古いものは削除されるサイクルが完成しました。枕を高くして眠れますね。

しかし、「バックアップがある」だけで安心していませんか?
「バックアップから正しく戻せるか」を試したことはありますか?
次回は、実際にサーバーのデータを削除して障害を発生させ、そこからバックアップデータを使ってシステムを復旧させる「リストア訓練」を行います。
インフラエンジニアとしての真価が問われる回です。お楽しみに!

リナックス先生

自動化は便利だけど、間違ったスクリプトを登録すると「毎朝3時にシステムを破壊する」時限爆弾にもなり得るわ。
必ず手動でテストをして、想定通りに動くことを確認してからCronに登録する癖をつけてね。
VPSなら、もし失敗しても「スナップショット」機能で時間を巻き戻せるから、検証には最適よ。

Cronの動作検証や、自作スクリプトのテスト環境として、自由に壊してやり直せるVPS(仮想専用サーバー)を持っておくことを強くお勧めします。
私も開発環境として愛用している、初心者にも使いやすくコスパ最強のVPSを以下に紹介しておきます。

▼スクリプトの実験場に最適!推奨VPS

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

コメント