学习日志learning-log
第 2 天:Bash 系统巡检脚本
使用花括号命令组、重定向和日期文件名,编写适用于 Raspberry Pi OS 的本地系统巡检脚本。
把多条系统检查命令整理成可重复执行的 Bash 脚本,并将同一天的多次结果追加到一个私有日志文件。
Bash 的正式术语是 花括号命令组(brace group):
{ date uname -srmo} >> output.log 2>&1花括号命令组在当前 Shell 环境执行。左花括号后需要空白,最后一条命令后必须有换行或分号。末尾重定向会作用于整个命令组:
>> output.log追加标准输出。2>&1再把标准错误合并到同一日志。$(date)是命令替换:先执行date,再把输出放到当前位置。
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 077export 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。
只给文件所有者增加执行权限:
chmod u+x "$HOME/day2/scripts/sys-check.sh""$HOME/day2/scripts/sys-check.sh"原笔记中的 ~day2/scripts/... 会被 Shell 解释为用户 day2 的家目录,正确写法是 ~/day2/scripts/... 或上面的 $HOME 形式。
如何选择 > 与 >>
Section titled “如何选择 > 与 >>”| 目标 | 文件名策略 | 重定向 |
|---|---|---|
| 每天只保留最后一次 | system-check-YYYY-MM-DD.log |
> |
| 同一天保留多次检查 | system-check-YYYY-MM-DD.log |
>> |
| 每次单独建档 | 文件名增加时分秒 | > |
本例采用“每日文件 + 追加”,适合一天内重复检查。长期自动运行还需要设置保留期限,避免日志无限增长。
隐私与平台差异
Section titled “隐私与平台差异”脚本输出可能包含局域网地址、系统版本、资源使用量和运行时间,应只保存在本机,不能直接作为网站附件发布。umask 077 让新日志默认仅当前用户可访问。
这份脚本面向 Raspberry Pi OS:
- BusyBox 的
hostname、free、df和date选项可能不同。 - 精简 Buildroot 系统可能没有 Bash、
/etc/os-release或vcgencmd。 - 使用
#!/usr/bin/env bash前,应确认command -v bash能找到解释器。
- 将错误术语改为花括号命令组(brace group)。
- 统一脚本名为
sys-check.sh,修正 Nano 保存快捷键和运行路径。 - 将标准错误纳入日志,并使用每日文件名。
- 限制日志权限,明确它包含不能直接公开的系统信息。
已整理的速查内容
Section titled “已整理的速查内容”- 命令:date、hostname、uname、df、free、uptime、vcgencmd、chmod、nano
- 概念:花括号命令组、命令替换、Shebang、文件权限、输入输出重定向
- 实战:每日系统巡检脚本
把脚本接入普通用户的 systemd timer,并增加日志轮换与失败状态检查。