跳转到内容
学习日志learning-log

第 2 天:Bash 系统巡检脚本

使用花括号命令组、重定向和日期文件名,编写适用于 Raspberry Pi OS 的本地系统巡检脚本。

状态
已审阅
难度
入门
平台
raspberry-pi · raspberry-pi-os
日期
2026-07-08

把多条系统检查命令整理成可重复执行的 Bash 脚本,并将同一天的多次结果追加到一个私有日志文件。

Bash 的正式术语是 花括号命令组(brace group)

Terminal window
{
date
uname -srmo
} >> output.log 2>&1

花括号命令组在当前 Shell 环境执行。左花括号后需要空白,最后一条命令后必须有换行或分号。末尾重定向会作用于整个命令组:

  • >> output.log 追加标准输出。
  • 2>&1 再把标准错误合并到同一日志。
  • $(date) 是命令替换:先执行 date,再把输出放到当前位置。
Terminal window
mkdir -p "$HOME/day2/scripts"
nano "$HOME/day2/scripts/sys-check.sh"

在 Nano 中,Ctrl+O 是 Write Out(保存),按 Enter 确认文件名;Ctrl+X 退出。

写入以下完整脚本:

#!/usr/bin/env bash
umask 077
export PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
LOG_DIR="$HOME/day2/logs"
LOG_FILE="$LOG_DIR/system-check-$(date +%Y-%m-%d).log"
mkdir -p -- "$LOG_DIR"
{
printf '===== System check: %s =====\n\n' "$(date --iso-8601=seconds)"
printf '[Network]\n'
hostname -I
printf '\n'
printf '[Kernel]\n'
uname -srmo
printf '\n'
printf '[OS]\n'
if [[ -r /etc/os-release ]]; then
cat /etc/os-release
else
printf '%s\n' '/etc/os-release unavailable'
fi
printf '\n'
printf '[Disk]\n'
df -h
printf '\n'
printf '[Memory]\n'
free -h
printf '\n'
printf '[Uptime]\n'
uptime
printf '\n'
printf '[Temperature]\n'
if command -v vcgencmd >/dev/null 2>&1; then
vcgencmd measure_temp
else
printf '%s\n' 'vcgencmd unavailable'
fi
printf '\n'
} >> "$LOG_FILE" 2>&1
printf 'Saved locally: %s\n' "$LOG_FILE"

vcgencmd measure_temp 是 Raspberry Pi 专用命令,用于读取 SoC 温度,不是通用 Linux 接口。脚本先检测命令是否存在,因此在缺少该工具时不会尝试使用 sudo

只给文件所有者增加执行权限:

Terminal window
chmod u+x "$HOME/day2/scripts/sys-check.sh"
"$HOME/day2/scripts/sys-check.sh"

原笔记中的 ~day2/scripts/... 会被 Shell 解释为用户 day2 的家目录,正确写法是 ~/day2/scripts/... 或上面的 $HOME 形式。

目标 文件名策略 重定向
每天只保留最后一次 system-check-YYYY-MM-DD.log >
同一天保留多次检查 system-check-YYYY-MM-DD.log >>
每次单独建档 文件名增加时分秒 >

本例采用“每日文件 + 追加”,适合一天内重复检查。长期自动运行还需要设置保留期限,避免日志无限增长。

脚本输出可能包含局域网地址、系统版本、资源使用量和运行时间,应只保存在本机,不能直接作为网站附件发布。umask 077 让新日志默认仅当前用户可访问。

这份脚本面向 Raspberry Pi OS:

  • BusyBox 的 hostnamefreedfdate 选项可能不同。
  • 精简 Buildroot 系统可能没有 Bash、/etc/os-releasevcgencmd
  • 使用 #!/usr/bin/env bash 前,应确认 command -v bash 能找到解释器。
  • 将错误术语改为花括号命令组(brace group)。
  • 统一脚本名为 sys-check.sh,修正 Nano 保存快捷键和运行路径。
  • 将标准错误纳入日志,并使用每日文件名。
  • 限制日志权限,明确它包含不能直接公开的系统信息。

把脚本接入普通用户的 systemd timer,并增加日志轮换与失败状态检查。