「毎週ログを眺めて状況報告を書いている」「障害の芽は拾いたいけど時間がない」——その繰り返し、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
- Debian/Ubuntu 系例:
- 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
) - フルパス指定(
mailx
やsendmail
が 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 とログを組み合わせれば、運用の安定性も担保
まずは自分宛てに送って体裁を確認し、必要な項目を足し引きしてチーム配信へ。習慣の自動化で、来週のあなたを少しラクにしましょう。
コメント