【Linux】長期休暇前のサーバー停止を防ぐ!logrotate総点検とディスク監視自動化スクリプト

スクリプト設計実務レシピ

年末年始や夏季休暇、大型連休(ゴールデンウィーク・シルバーウィーク)の前になると、インフラエンジニアやシステム運用担当者、社内情シスの間で必ず話題に上がるのが「休暇中の無人稼働によるサーバー停止事故」です。

「連休中に突如アクセスが集中してアクセスログが数十GBに跳ね上がった」「バッチ処理のエラーログが毎秒出力され、元日の早朝にディスク使用率100%(Disk Full)でDBやWebサーバーが道連れ停止した」「担当者不在で誰も気付けず、休み明けに出社したら大障害になっていた」――こうしたインフラ現場の悪夢は、事前のログ総点検とディスク監視の自動化によって100%未然に防ぐことができます。

こんにちは、Bash玄(ばっしゅげん)です。当サイト「Bash道」のモットーは「手作業は負け」「スクリプトはシンプルに」。正月やお盆休みに『サーバー落ちました!』と電話がかかってくる地獄、絶対に味わいたくないですよね。「手作業は負け」。休暇に入る前にスクリプトを仕込んで、心置きなく休みを満喫しましょう!

本記事では、長期休暇に入る前にわずか5分で完了する安全点検チェックリスト(Pattern #20準拠)から、ディスク容量とinode枯渇の特定手順、logrotateの設定検証・強制テスト実行、そしてディスク使用率85%超過を検知してSlack/Discordへ即時通知する自作Bash監視スクリプトの完全版まで、現場で培った実践的な自衛策を徹底解説します。

  1. 【結論】連休前にチェックすべきインフラ安全点検チェックリスト
  2. 第1ステップ: 現状のディスク容量と大容量ファイルの特定
    1. df -h(ディスク容量)と df -i(inode枯渇)のダブルチェック手順
    2. du -sh /* 2>/dev/null | sort -hr | head -n 10 で肥大化ディレクトリを特定
    3. 削除しても容量が空かない「プロセス掴み(deleted)」の特定と解放(lsof | grep deleted)
  3. 第2ステップ: logrotateの設定確認と強制ローテーション検証
    1. logrotateの設定ファイル構造(/etc/logrotate.conf と /etc/logrotate.d/)
    2. ドライラン(-d)による設定構文エラーの事前チェック
    3. 強制実行(-f)による確実な動作確認手順
    4. 「ローテーションされたが圧縮(compress)されていない」等の実務落とし穴
  4. 第3ステップ: ディスク使用率超過を検知するBash自動監視スクリプト
    1. ディスク使用率が閾値(85%)を超えたら警告するBashスクリプト(コピペ用完全版)
    2. cronへの登録手順と定期実行(内部リンク: /post/cron/)
    3. Webhook(Slack/Discord)連携によるスマホ即時通知カスタマイズ例
  5. 第4ステップ: systemdのjournaldログ制限
    1. journalctlの肥大化対策(journalctl –vacuum-time=7d または /etc/systemd/journald.conf 設定)
  6. 実務エラー・トラブルシューティング
    1. ディスク100%でSSHログイン不能・サービス停止したときの緊急リカバリ手順
    2. ログパーミッション変更によるローテーション失敗エラーの防ぎ方
  7. まとめ: 自動監視とログローテーションで安心して休暇を迎えよう
  8. あわせて読みたい関連記事
  9. 関連記事

【結論】連休前にチェックすべきインフラ安全点検チェックリスト

まずはファーストビューで、長期休暇に入る直前のエンジニアが「今すぐターミナルにコピペして5分でサーバーの安全性を確認できる点検コマンド一覧表」を提示します(Pattern #20準拠・アンサーファースト)。

点検フェーズ 実行コマンド 判定基準と危険シグナル
1. ディスク容量確認 df -h 使用率が80%以上のパーティションがあれば即時警戒・ログ調査が必要
2. inode枯渇確認 df -i 容量に空きがあってもIUse%が85%以上なら小ファイル増殖の危険あり
3. logrotate構文検証 sudo logrotate -d /etc/logrotate.conf エラー(error: ...)が1行も出なければ設定構文は正常
4. 巨大ファイル抽出 sudo find /var/log -type f -size +500M 500MB以上の巨大ログがあればローテーション漏れやログフラッドを疑う
5. プロセス掴み確認 sudo lsof | grep deleted 削除済みログをプロセスが掴んでディスクが解放されていない状態を検知
6. journalログ容量 journalctl --disk-usage systemdログが数GB〜数十GBに肥大化していないかを即座に確認
7. 自動監視スクリプト /usr/local/bin/disk_alert.sh(cron登録) 使用率が閾値を超えたらSlack/Discordへ自動発報する仕組みを配備

上記の7項目をチェックするだけで、無人稼働中に突如ディスクがパンクするリスクを最小限に抑え込めます。それでは、各ステップの具体的な調査手順と対策を詳しく見ていきましょう。

第1ステップ: 現状のディスク容量と大容量ファイルの特定

サーバー保守の初動対応として最初に行うべきは、現在のストレージ使用状況の正確な把握です。ここでは単なる容量確認にとどまらず、現場で事故になりやすい「inode枯渇」や「プロセス掴み(deleted)」まで確実に炙り出す手順を解説します。

df -h(ディスク容量)と df -i(inode枯渇)のダブルチェック手順

ストレージの空き容量を調べる際、大半のエンジニアは df -h だけを実行して満足してしまいがちです。しかし、Linuxファイルシステムには「容量(バイト数)は空いているのに、inode(管理インデックス)が100%枯渇してファイルが一切作成できなくなる」という致命的な落とし穴が存在します。

# 1. ディスク容量(バイト数)の空き状況を確認
df -h

# 出力例:
# Filesystem      Size  Used Avail Use% Mounted on
# /dev/sda1        50G   43G  4.5G  91% /
# /dev/sda2       100G   20G   75G  22% /data

ルートパーティション(/)の使用率(Use%)が80%を超えている場合は黄色信号、90%を超えている場合は無人稼働中に100%へ到達する危険性が極めて高いため、ただちに不要ファイルの削除やログローテーションの見直しが必要です。

続けて、必ず df -i を実行して inode の残量を確認します。

# 2. inode(ファイル数上限)の空き状況を確認
df -i

# 出力例:
# Filesystem       Inodes   IUsed   IFree IUse% Mounted on
# /dev/sda1       3276800 3112960  163840   95% /

Webセッションファイルやキャッシュファイル、PHPの微小セッションログなどが数百万個単位で生成されると、ストレージ容量が数十GB余っていても IUse% が100%に達し、No space left on device エラーが発生してサービスが停止します。必ず両方のコマンドで空き領域をダブルチェックしてください。

du -sh /* 2>/dev/null | sort -hr | head -n 10 で肥大化ディレクトリを特定

ディスク使用率が高いパーティションを特定したら、次は「どのディレクトリが容量を消費しているか」を段階的に深掘りします。システム保護のため、エラー出力を捨てつつ上位10件を降順でソートして表示します。

# ルート直下で容量の大きい上位10ディレクトリを表示
sudo du -sh /* 2>/dev/null | sort -hr | head -n 10

# 出力例:
# 28G    /var
# 10G    /usr
# 4.2G   /home
# 1.1G   /opt

上記のように /var が最も容量を圧迫していることが判明したら、さらに sudo du -sh /var/* 2>/dev/null | sort -hr | head -n 10 とディレクトリ階層を掘り下げていきます。大半のケースでは /var/log または /var/lib/docker、/var/www が原因となっています。

さらに、特定のディレクトリ配下から「500MB以上の巨大な単一ファイル」や「過去30日以上前の古い未圧縮ログ」をピンポイントで抽出・削除したい場合は、findコマンドを活用するのが最も確実です。詳しい検索オプションや安全な一括削除コマンドについては、findコマンドで大容量ファイルや古いログを抽出・一括削除する方法 で徹底解説しています。

削除しても容量が空かない「プロセス掴み(deleted)」の特定と解放(lsof | grep deleted)

インフラ運用現場で非常によくあるトラブルが、「肥大化したログファイルを rm コマンドで削除したのに、df -h の空き容量が1バイトも増えない」という現象です。

Linuxでは、あるプロセス(NginxやJava、Pythonアプリ等)がログファイルを開いたまま(オープンハンドルを維持した状態)で rm を実行すると、ディレクトリのエントリ(ファイル名)は消去されますが、プロセスのファイルディスクリプタが掴んでいる実体領域(inode)はディスク上に残存し続けます。

この「幽霊ファイル」を特定するには、lsof コマンドを使用します。

# 削除されたがプロセスに掴まれて解放されていないファイルをリストアップ
sudo lsof | grep deleted

# 出力例:
# nginx   12345  www-data    7w   REG   8,1  15728640000  123456 /var/log/nginx/access.log (deleted)

上記のように access.log (deleted) として約15GBの領域がプロセスによって保持されていることが分かります。これを安全に解放する方法は以下の2通りです。

  1. 対象サービスの再起動またはシグナル再オープン:
    # Nginxのログを安全に再オープンさせて古いハンドルを解放
    sudo systemctl reload nginx
    # またはプロセス再起動
    sudo systemctl restart nginx
  2. プロセス停止が困難な場合の即時空化(truncate):
    プロセスを即座に再起動できない場合は、該当プロセスのファイルディスクリプタ(FD)に対して直接サイズをゼロにする書き込みを行います。

    # /proc/<PID>/fd/<FD番号> に対して空文字をリダイレクト
    sudo : > "/proc/12345/fd/7"

    これにより、プロセスを落とすことなくディスク実体領域を即座に0バイトに切り詰めて空き容量を回復できます。

第2ステップ: logrotateの設定確認と強制ローテーション検証

休暇中のログ肥大化を防ぐ中核ツールが logrotate です。しかし、「設定ファイルを置いたつもりで動いていなかった」「文法ミスで丸ごとスキップされていた」というケースが後を絶ちません。連休前に必ず設定ファイル構造を把握し、テスト実行を完了させておきましょう。

logrotateの設定ファイル構造(/etc/logrotate.conf と /etc/logrotate.d/)

Linux環境における logrotate の設定は、以下の2層構造で構成されています。

  • /etc/logrotate.conf : サーバー全体のデフォルト動作(全体ローテーション周期、世代数、圧縮有無など)を定義するグローバル設定ファイルです。
  • /etc/logrotate.d/ : Nginx、Apache、MySQL、Syslog、自作アプリケーションなど、サービス個別のローテーションルールを配置するディレクトリです。内部で include /etc/logrotate.d されることで読み込まれます。

設定の優先順位は「個別設定(/etc/logrotate.d/ 配下)> 全体設定(/etc/logrotate.conf)」です。個別ファイルで指定されたディレクティブがグローバル設定を上書きします。詳しいディレクティブの一覧や設定ファイルの基本構造については、logrotateの設定ファイル作成とオプション解説 をご参照ください。

ドライラン(-d)による設定構文エラーの事前チェック

設定ファイルに変更を加えた際、「次の定期実行まで放置する」のは厳禁です。タイポや構文エラーがあると、エラーで停止してローテーションが一切行われなくなります。

必ず ドライラン(デバッグモード: -d) を実行して構文の妥当性を検証してください。

# 全設定ファイルを対象にドライランを実行
sudo logrotate -d /etc/logrotate.conf

# 特定の設定ファイルのみを検証する場合
sudo logrotate -d /etc/logrotate.d/nginx

-d(--debug)オプションを付与すると、実際のファイルの切り替えや圧縮、スクリプト実行は一切行われず、内部判定ロジックが画面に詳細出力されます。出力内に error: ... という文字列が1行も含まれていなければ構文チェックは合格です。

強制実行(-f)による確実な動作確認手順

構文エラーがないことを確認したら、次に実際にファイルを切り替えて動作確認を行います。通常、日次(daily)設定のログは24時間以上経過していないとスキップされますが、強制実行フラグ(-f)と詳細出力(-v)を組み合わせることで今すぐテストできます。

# 特定サービスの設定を強制ローテーション(詳細ログ出力)
sudo logrotate -fv /etc/logrotate.d/nginx

コマンド実行後、対象ログディレクトリ(/var/log/nginx/ など)を確認し、以下の3点を必ず検証してください。

  1. 新しいログファイル(access.log)が生成され、適切な所有者・パーミッション(例: www-data:adm 0640)になっているか。
  2. 古いログがリネーム(access.log.1 または access.log-YYYYMMDD)されているか。
  3. アプリケーションからテストアクセスを送り、新しいログファイルにリアルタイムで追記されているか(tail -f access.log で確認)。

「ローテーションされたが圧縮(compress)されていない」等の実務落とし穴

logrotate の運用でエンジニアが最も混乱しやすいのが、「compress を設定したのに、直前のログ(.1)が gzip 圧縮されていない」という点です。

これは設定ミスではなく、delaycompress ディレクティブによる正常な挙動です。Linuxでは、ログ切り替え直後はプロセスがまだ古いファイルハンドルを開いたまま書き込みを行っている可能性があるため、直前の世代は平文のまま残し、次回のローテーション実行時(翌日)に安全に圧縮する仕組みになっています。

また、長期休暇に向けた最大の防衛策として、通常の daily に加えて maxsize を併用することを強く推奨します。

/var/log/myapp/*.log {
    daily
    # 連休中に突発的なアクセス急増があっても、500MBに達したら日次を待たずに即時ローテーション
    maxsize 500M
    rotate 14
    compress
    delaycompress
    missingok
    notifempty
    copytruncate
}

daily と maxsize 500M を併用しておけば、通常時は1日1回ローテーションされますが、万が一スパム攻撃やエラー連発でログが500MBを超えた場合、定期実行のタイミングで即座にローテーションされ圧縮に回されるため、ディスクの急激な枯渇を確実に防ぐことができます。

第3ステップ: ディスク使用率超過を検知するBash自動監視スクリプト

「手作業は負け」。定期的にターミナルを開いて df -h を叩くのではなく、「閾値を超えたらサーバー自身がエンジニアのスマートフォン(SlackやDiscord)へ自動通報する」自作監視スクリプトを仕込んでおきましょう。

ディスク使用率が閾値(85%)を超えたら警告するBashスクリプト(コピペ用完全版)

外部エージェントや重いSaaSを導入せず、Linux標準のBashとcurlだけで完結する軽量・堅牢なディスク監視スクリプトの完全版です。多重通知(Slackスパム)を防ぐクーリングダウン機能も内蔵しています。

#!/usr/bin/env bash
# ==============================================================================
# ディスク使用率監視 & Webhook自動通知スクリプト
# ==============================================================================
set -euo pipefail

# ------------------------------------------------------------------------------
# 1. 運用設定パラメータ(環境に合わせて調整してください)
# ------------------------------------------------------------------------------
THRESHOLD=85                                      # 警告を発報する使用率(%)
TARGET_MOUNT="/"                                  # 監視対象のマウントポイント
WEBHOOK_URL="https://hooks.slack.com/services/T00/B00/XXXXX" # SlackまたはDiscordのURL
ALERT_FLAG_FILE="/var/run/disk_alert_${THRESHOLD}.flag"       # アラート多重送信防止フラグ
LOG_FILE="/var/log/disk_monitor.log"              # 監視実行ログ

# ------------------------------------------------------------------------------
# 2. ロガー関数と通知ヘルパー
# ------------------------------------------------------------------------------
log_msg() {
  local level="$1"
  shift
  echo "[$(date '+%Y-%m-%d %H:%M:%S')] [${level}] $*" | tee -a "${LOG_FILE}"
}

send_notification() {
  local usage="$1"
  local hostname
  hostname="$(hostname)"
  local current_time
  current_time="$(date '+%Y-%m-%d %H:%M:%S')"

  # Slack Incoming Webhook向けJSONペイロード
  local payload
  payload=$(cat <<EOF
{
  "attachments": [
    {
      "color": "danger",
      "title": "【警告】ディスク使用率超過アラート",
      "text": "サーバーのディスク使用率が閾値(${THRESHOLD}%)を超過しました!連休中のDisk Fullを防ぐため至急確認してください。",
      "fields": [
        { "title": "対象ホスト", "value": "${hostname}", "short": true },
        { "title": "マウント先", "value": "${TARGET_MOUNT}", "short": true },
        { "title": "現在の使用率", "value": "${usage}%", "short": true },
        { "title": "検知時刻", "value": "${current_time}", "short": true }
      ]
    }
  ]
}
EOF
)

  # WebhookへPOST送信(通信エラーでスクリプト自体が異常終了しないよう保護)
  curl -s -X POST -H 'Content-type: application/json' --data "${payload}" "${WEBHOOK_URL}" > /dev/null 2>&1 || true
}

# ------------------------------------------------------------------------------
# 3. メイン監視ロジック
# ------------------------------------------------------------------------------
main() {
  # dfコマンドから対象マウントポイントの使用率(数値のみ)を抽出
  local current_usage
  current_usage=$(df -h "${TARGET_MOUNT}" | awk 'NR==2 {print $5}' | tr -d '%')

  # 数値として正しく取得できているかバリデーション
  if [[ ! "${current_usage}" =~ ^[0-9]+$ ]]; then
    log_msg "ERROR" "ディスク使用率の取得に失敗しました: ${current_usage}"
    exit 1
  fi

  log_msg "INFO" "マウントポイント: ${TARGET_MOUNT} | 現在の使用率: ${current_usage}% (閾値: ${THRESHOLD}%)"

  # 閾値判定
  if (( current_usage >= THRESHOLD )); then
    log_msg "WARN" "使用率が閾値(${THRESHOLD}%)を超過しています!"

    # フラグファイルが存在しない場合(初回検知時)のみ通知を送信
    if [[ ! -f "${ALERT_FLAG_FILE}" ]]; then
      log_msg "INFO" "初回検知のためWebhook通知を送信します..."
      send_notification "${current_usage}"
      touch "${ALERT_FLAG_FILE}"
    else
      log_msg "INFO" "既にアラート送信済みのため通知を抑制します(クーリングダウン中)。"
    fi
  else
    # 閾値を下回って正常復旧した場合はフラグを消去
    if [[ -f "${ALERT_FLAG_FILE}" ]]; then
      log_msg "INFO" "ディスク使用率が正常範囲(${current_usage}%)に回復したためフラグを解除します。"
      rm -f "${ALERT_FLAG_FILE}"
    fi
  fi

  exit 0
}

main "$@"

cronへの登録手順と定期実行(内部リンク: /post/cron/)

作成したスクリプトを /usr/local/bin/disk_alert.sh に保存し、実行権限を付与した上で、cron を使って1時間ごとに定期実行させます。

# スクリプトに実行権限を付与
sudo chmod +x /usr/local/bin/disk_alert.sh

# rootのcrontabを編集
sudo crontab -e

crontabの編集画面で、以下の設定を追加します。

# 環境変数PATHを明示的に指定
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin

# 毎時0分にディスク監視スクリプトを実行(flockで二重起動防止)
0 * * * * /usr/bin/flock -n /var/run/disk_alert.lock /usr/local/bin/disk_alert.sh >> /var/log/disk_monitor.log 2>&1

cron実行環境では、「cron特有の最小限のPATH設定」が原因で外部コマンドが見つからず失敗する事故が多発します。必ず冒頭で PATH=... を明示宣言するか、絶対パスでコマンドを記述してください。crontabの詳しい書き方や環境変数の作法については、Linuxのcron設定方法と自動実行の実務例 をあわせてご確認ください。

Webhook(Slack/Discord)連携によるスマホ即時通知カスタマイズ例

通知先が Discord の場合は、ペイロードのJSON構造を以下のように変更するだけで簡単に対応できます。

# Discord Webhook向けJSONペイロード例
send_discord_notification() {
  local usage="$1"
  local hostname
  hostname="$(hostname)"

  local payload
  payload=$(cat <<EOF
{
  "username": "Disk Alert Bot",
  "embeds": [
    {
      "title": "⚠️ 【警告】ディスク使用率超過アラート",
      "description": "サーバーのディスク容量が逼迫しています。至急ログや不要ファイルを確認してください。",
      "color": 15158332,
      "fields": [
        { "name": "ホスト名", "value": "${hostname}", "inline": true },
        { "name": "使用率", "value": "${usage}%", "inline": true },
        { "name": "マウント先", "value": "${TARGET_MOUNT}", "inline": true }
      ]
    }
  ]
}
EOF
)
  curl -s -X POST -H 'Content-type: application/json' --data "${payload}" "${WEBHOOK_URL}" > /dev/null 2>&1 || true
}

スマートフォンにSlackやDiscordアプリをインストールしておけば、外出先や帰省中でもプッシュ通知で瞬時に異常を検知でき、手遅れになる前に対処できます。

第4ステップ: systemdのjournaldログ制限

近年のLinux(Ubuntu、Debian、RHEL、Rocky Linux、AlmaLinux等)では、従来のテキストログ(/var/log/syslog 等)に加えて、systemd-journald が管理するバイナリログが /var/log/journal/ に蓄積されます。

実はこの journald、デフォルト設定ではファイルシステム全体の最大10%(または最大4GB)まで自動的にログを溜め込み続けるという仕様になっています。大容量ストレージを搭載したサーバーでは、放置しているだけで十数GBのディスク領域が journald に占有されてしまいます。

journalctlの肥大化対策(journalctl –vacuum-time=7d または /etc/systemd/journald.conf 設定)

まずは、現在の journald がどれだけのディスク容量を消費しているかを確認しましょう。

# journalログの現在の消費容量を確認
journalctl --disk-usage

# 出力例:
# Archived and active journals take up 12.8G in the file system.

もし数GB〜十数GBに達している場合、以下のコマンドで即座に古いログを安全に切り詰める(vacuum)ことができます。

# 1. 過去7日より前の古いjournalログを一括消去
sudo journalctl --vacuum-time=7d

# 2. 合計容量が500MB以下になるように古いログから順次消去
sudo journalctl --vacuum-size=500M

これらは即効性のある手動コマンドですが、放置すると再び肥大化するため、設定ファイルで「上限サイズ」を恒久的に固定しておくのが現場の鉄則です。

# /etc/systemd/journald.conf を編集
sudo nano /etc/systemd/journald.conf

[Journal] セクション内に以下の2行を設定(またはコメントアウトを解除して変更)します。

[Journal]
# journalログが使用する最大ディスク容量を500MBに制限
SystemMaxUse=500M
# 最低でも1GBの空きディスク容量を維持する
SystemKeepFree=1G

設定を保存したら、systemd-journald サービスを再起動して反映させます。

# journaldサービスを再起動(ログ収集は瞬断なく継続)
sudo systemctl restart systemd-journald

# 反映後の容量を再確認
journalctl --disk-usage

これで、systemd ログが指定サイズを超えて勝手に膨らむ心配は完全に解消されます。

実務エラー・トラブルシューティング

ここからは、長期休暇中や緊急メンテナンス時に実際に発生しやすい障害シナリオと、現場エンジニアが実践する安全なリカバリ手順を解説します。

ディスク100%でSSHログイン不能・サービス停止したときの緊急リカバリ手順

ディスク使用率が完全に100%(0バイト空き)に達すると、単にWebサイトが表示されなくなるだけでなく、「一般ユーザーでのSSHログインが拒否される」という深刻な二次災害が発生します。

これは、ログイン処理時に .bash_history への書き込みや /tmp 配下のセッションファイル生成、SSH公開鍵の認証ログ作成がすべて失敗してセッションが強制切断されるためです。

この状態に陥った場合の復旧フローは以下の通りです。

  1. VPS/クラウド管理コンソールからrootログイン:
    多くのLinuxディストリビューションでは、rootユーザー向けに5%の「予約領域(Reserved Blocks)」が確保されているため、クラウド事業者のWeb管理画面(VNCコンソールやシリアルコンソール)から直接 root アカウントでログインすれば作業領域が残されています。
  2. 一時領域(/tmp)の即時清掃:
    # /tmp 配下の不要な一時ファイルを安全に削除
    sudo rm -rf /tmp/* /var/tmp/*
  3. 巨大ログを truncate(ゼロバイト化)で即時解放:
    ここで rm access.log を実行すると、前述の「deletedプロセス掴み」によって空き容量が増えないリスクがあります。必ずリダイレクトまたは truncate コマンドで中身を0バイトに切り詰めます。

    # 空リダイレクトによる安全なゼロバイト化
    sudo : > /var/log/nginx/access.log
    # または truncate コマンド
    sudo truncate -s 0 /var/log/syslog
  4. 停止したサービスの再起動と健全性確認:
    空き容量が回復したことを df -h で確認したら、ディスク枯渇によって異常終了したデータベースやWebサーバーを再起動します。

    sudo systemctl restart nginx
    sudo systemctl restart mysql

ログパーミッション変更によるローテーション失敗エラーの防ぎ方

「設定ファイルを正しく作成したはずなのに、翌日ログがローテーションされていない」という場合、システムログ(journalctl -u logrotate や /var/log/syslog)を確認すると、以下のエラーが記録されていることがあります。

error: skipping "/etc/logrotate.d/myapp" because parent directory has insecure permissions (It's world writable or writable by group which is not "root")

logrotate には厳格なセキュリティポリシーが備わっており、設定ファイル自身や配置ディレクトリのパーミッションが「誰でも書き込み可能(777等)」であったり、所有者が root 以外である場合、権限昇格攻撃を防ぐために設定を丸ごと無視します。

# 設定ファイル自体の所有者を root:root、権限を 0644 に修正
sudo chown root:root /etc/logrotate.d/*
sudo chmod 0644 /etc/logrotate.d/*

# ディレクトリの権限を 0755 に修正
sudo chmod 0755 /etc/logrotate.d

また、ログ出力先ディレクトリが一般アプリケーションユーザー(例: www-data や node)所有の場合は、logrotate の設定ブロック先頭に su <ユーザー> <グループ> ディレクティブを明記することで、安全かつ確実にローテーションを実行できます。

まとめ: 自動監視とログローテーションで安心して休暇を迎えよう

年末年始や大型連休を心置きなく楽しむためのサーバー防衛術を解説してきました。最後に、休暇前に確認すべき最重要ポイントを振り返ります。

  • 容量とinodeのダブル点検: df -h だけでなく df -i も実行し、80%以上の逼迫パーティションは連休前に整理する。
  • logrotateの動作検証: 放置せず logrotate -d で構文エラーをゼロにし、logrotate -fv で確実な切り替えを確認する。
  • maxsizeによる急増対策: 通常の daily に maxsize 500M を併用し、スパムやエラー急増による突発的パンクを阻止する。
  • Bashスクリプトによる自動通知: 1時間ごとの定期cronで閾値(85%)超過を監視し、SlackやDiscordへプッシュ通知を仕込んでおく。
  • journaldの上限設定: /etc/systemd/journald.conf で SystemMaxUse=500M を指定し、バイナリログの肥大化を恒久的に防ぐ。

「手作業は負け」。休暇に入る前にスクリプトを仕込んでおけば、正月やお盆休みにサーバーの障害電話で起こされる悪夢とは無縁になります。事前の備えを万全にして、心ゆくまで休暇を満喫してください!

なお、長期休暇に向けて開発・ステージング環境のストレージ増強や別系統の監視サーバー構築を検討されている方は、コストパフォーマンスに優れた おすすめの格安VPS比較 もぜひ参考にしてください。

あわせて読みたい関連記事

Bash玄

はじめまして!Bash玄です。

エンジニアとしてシステム運用に携わる中で、手作業の多さに限界を感じ、Bashスクリプトを活用して業務を効率化したのがきっかけで、この道に入りました。「手作業は負け」「スクリプトはシンプルに」をモットーに、誰でも実践できるBashスクリプトの書き方を発信しています。

このサイトでは、Bashの基礎から実践的なスクリプト作成まで、初心者でもわかりやすく解説しています。少しでも「Bashって便利だな」と思ってもらえたら嬉しいです!

# 好きなこと
- シンプルなコードを書くこと
- コマンドラインを快適にカスタマイズすること
- 自動化で時間を生み出すこと

# このサイトを読んでほしい人
- Bashに興味があるけど、何から始めればいいかわからない人
- 定型業務を自動化したい人
- 効率よくターミナルを使いこなしたい人

Bashの世界に一歩踏み出して、一緒に「Bash道」を極めていきましょう!

Bash玄をフォローする

コメント