週次サマリを自動配信|ログ集計→メールまでをcronで完全自動化

ログ運用・解析
スポンサーリンク

「毎週ログを眺めて状況報告を書いている」「障害の芽は拾いたいけど時間がない」——その繰り返し、cronで自動化しましょう。
本記事では、直近7日分の要点をテキスト集計 → メール送信するまでを、コピーして動く形で解説します。想定キーワードは「ログ メール 自動」「レポート 自動送信」「cron mail」です。

ゴール(できること)

  • サーバの基本情報・ディスク使用量・重大ログを週次で自動集計
  • テキストレポートをメール送信(必要ならエラー抜粋の添付も同封)
  • 多重起動防止(flock)とログ保存で運用も安定

事前準備(最短)

  • 送信コマンド:mailx(推奨)または sendmail
    • Debian/Ubuntu 系例:sudo apt install -y s-nail(= Heirloom/S-nail mailx)
    • RHEL/AlmaLinux 系例:sudo dnf install -y mailx
  • MTA/リレー設定(Postfix/msmtp など)は環境に応じて済ませておきます

コピペで使える週次レポートスクリプト

保存先:/usr/local/bin/weekly_summary.sh(権限:sudo chmod 755 /usr/local/bin/weekly_summary.sh

#!/usr/bin/env bash
# weekly_summary.sh - 週次レポートを作成してメール送信
set -euo pipefail

# === 設定(必要に応じて変更) =========================
TO="ops@example.com"                      # 送信先
SINCE="-7d"                               # 集計期間(systemd-journal基準)
LOCK="/var/lock/weekly-summary.lock"      # 排他ロックファイル
LOGFILE="/var/log/weekly_summary.log"     # 実行ログ(cronで追記)
# ======================================================

HOST="$(hostname -f || hostname)"
WORKDIR="$(mktemp -d)"
REPORT="$WORKDIR/weekly_report.txt"
ATTACH="$WORKDIR/log_extracts.txt"
SUBJECT="[週次サマリ] ${HOST} $(date +%Y-%m-%d)"

cleanup(){ rm -rf "$WORKDIR"; }
trap cleanup EXIT

# === レポート本体(テキスト) =========================
{
  echo "# 週次サマリ (${HOST})"
  date
  echo
  echo "== 基本情報 =="
  uptime || true
  echo
  echo "== ディスク使用率 =="
  df -h --output=source,pcent,size,used,avail,target 2>/dev/null | sed 1d || df -h || true
  echo
  echo "== systemd 重大ログ(直近7日) =="
  if command -v journalctl >/dev/null 2>&1; then
    journalctl -p err..alert --since="$SINCE" --no-pager | tail -n 200 || true
  else
    echo "journalctl が未導入のため省略"
  fi
  echo
  echo "== サービス失敗状況 =="
  systemctl --failed || true
} > "$REPORT"

# === 添付用(必要なら詳細ログ抜粋) ====================
{
  echo "[journalctl errors last 7d]"
  if command -v journalctl >/dev/null 2>&1; then
    journalctl -p err..alert --since="$SINCE" --no-pager || true
  else
    echo "journalctl が未導入のため省略"
  fi

  if [ -f /var/log/nginx/error.log ]; then
    echo -e "\n[nginx error.log 最近1000行]"
    tail -n 1000 /var/log/nginx/error.log || true
  fi

  if [ -f /var/log/syslog ]; then
    echo -e "\n[syslog エラー抜粋(最近1000行から)]"
    grep -Ei 'error|critical|panic|fail' /var/log/syslog | tail -n 1000 || true
  elif [ -f /var/log/messages ]; then
    echo -e "\n[/var/log/messages エラー抜粋(最近1000行から)]"
    grep -Ei 'error|critical|panic|fail' /var/log/messages | tail -n 1000 || true
  fi
} > "$ATTACH"

# === 送信:mailx 優先、なければ sendmail ===============
send_text_only() {
  # sendmail テキストのみ(添付なし)
  {
    echo "Subject: $SUBJECT"
    echo "To: $TO"
    echo "Content-Type: text/plain; charset=UTF-8"
    echo
    cat "$REPORT"
  } | sendmail -t
}

if command -v mailx >/dev/null 2>&1; then
  # Heirloom/S-nail mailx は -a で添付、BSD mailx は -a がヘッダ扱い
  if mailx -V 2>&1 | grep -qiE 'heirloom|s-nail'; then
    mailx -s "$SUBJECT" -a "$ATTACH" -- "$TO" < "$REPORT"
  else
    # BSD mailx 環境は添付なしで送信(mutt 等が使えるなら置き換え可)
    mailx -s "$SUBJECT" -- "$TO" < "$REPORT"
  fi
elif command -v sendmail >/dev/null 2>&1; then
  send_text_only
else
  echo "ERROR: mailx/sendmail が見つかりません" >&2
  exit 1
fi

echo "$(date +%F\ %T) sent weekly summary to $TO" >> "$LOGFILE" || true

ポイント:

  • journalctl がある環境(systemd)なら期間指定で楽に抽出(--since=-7d
  • mailx(S-nail/Heirloom) なら -a で簡単添付。BSD mailx は添付が非対応なので本文のみ送信
  • もっとリッチな添付が必要なら mutt などに差し替えOK(mutt -s "$SUBJECT" -a "$ATTACH" -- "$TO" < "$REPORT"

cron に登録(多重起動防止つき)

毎週月曜の朝 7:00 に送信する例。PATH を明示し、flock で重複防止。

# 編集
crontab -e

以下を追記:

PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
SHELL=/bin/bash

0 7 * * 1 /usr/bin/flock -n /var/lock/weekly-summary.lock \
  /usr/local/bin/weekly_summary.sh >> /var/log/weekly_summary.log 2>&1
  • >> /var/log/weekly_summary.log 2>&1実行ログも残しておくと安心
  • 時刻はチームの運用に合わせて調整(深夜バッチとぶつけない)

動かないときのチェックリスト

  • systemctl status cron(Deb系)/ crond(RHEL系)が active
  • スクリプトに 実行権限シバン#!/usr/bin/env bash
  • フルパス指定mailxsendmail が PATH 外になっていないか)
  • 改行コードが LF(Windows 由来は dos2unix で変換)
  • ログにヒント:tail -n 200 /var/log/weekly_summary.log
  • メール配送の疎通(ローカルMTAやSMTPリレーの設定)

さらに実用的にするアイデア

  • HTMLメールで見やすい体裁に(S-nail の -a と MIME ヘッダで実現可)
  • サービス別サマリjournalctl -u nginx --since=-7d のようにユニット単位で整理
  • しきい値通知:df の使用率 >80% で件名に【要注意】を付ける など
  • 複数サーバ:各ノードからメール→Gmail でラベル付け/自動振り分け

まとめ

  • 週次レポートの作成〜配信を cron×mailx で自動化すれば、人的ミスと作業時間を削減
  • journalctl と df の基本情報に、重大ログの添付まで押さえれば一次対応の見落としが減る
  • flock とログを組み合わせれば、運用の安定性も担保

まずは自分宛てに送って体裁を確認し、必要な項目を足し引きしてチーム配信へ。習慣の自動化で、来週のあなたを少しラクにしましょう。

スポンサーリンク
Bash玄

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

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

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

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

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

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

Bash玄をフォローする

コメント