ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

Linux登录自动巡检:用Bash脚本在SSH登录时展示系统信息

Linux登录自动巡检:用Bash脚本在SSH登录时展示系统信息 不知道你有没有过这种经历刚接手一批服务器每天要 SSH 上去巡检第一件事就是敲uptime、free、df -h然后对着输出逐条核对。次数一多人还没疯手先累了。我后来干脆写了一个 Bash 脚本让它在每次登录 Shell 时自动把系统信息打印出来登录即巡检省掉那些重复敲命令的功夫。这个项目很小但用起来非常顺手尤其适合运维、开发以及所有需要经常登录 Linux 服务器的人。今天我把完整的实现思路、脚本代码和踩坑记录一起放出来你可以直接抄作业也可以根据自己环境改着玩。这个方案的核心作用就一句话把“手动查”变成“登录自动看”。一次配置后续每次通过 SSH 或su -进入登录 Shell 时系统会自动展示主机名、负载、内存、磁盘、内核版本这些关键状态。如果哪台机器磁盘快满了、负载异常高一登录就能瞄到不用再挨个命令去查。而且它本质上就是一个 Bash 脚本加几行登录钩子配置不引入额外进程、不装第三方工具几乎零成本。1. 整体设计思路为什么选 Bash 脚本挂在登录环节1.1 登录时查看系统信息的几种落地路径想实现“登录就看到系统信息”Linux 下其实有好几种做法我先把常见的都列出来再说为什么最终选了 Bash 脚本挂登录钩子。第一种改/etc/motd。这个文件是传统 Unix 登录时打印欢迎信息的地方SSH 登录成功后会直接显示里面的内容。你可以写个脚本动态生成 motd 内容再配置 SSH 的pam_motd模块或者干脆用 cron 定时刷新。但问题也很明显motd 的更新是静态文件刷新如果系统状态是登录那一刻才想要的这个方案要么有延迟要么得额外维护脚本生成逻辑。第二种用系统监控工具比如neofetch、screenfetch、fastfetch。这些工具输出很漂亮能显示 Logo、颜色块、系统信息深受桌面用户喜欢。但服务器场景下它们往往不是默认装的而且输出偏向“炫”重度信息密度不够。我想要的是内存、磁盘、负载这些一眼能看清的状态不是壁纸级别的横幅。第三种也就是我最终采用的方案把 Bash 脚本放到/etc/profile.d/下或者从~/.bash_profile里显式调用。这个方案的逻辑是Bash 在作为登录 Shell 启动时会依次读取/etc/profile、~/.bash_profile等文件而/etc/profile会循环加载/etc/profile.d/下所有.sh脚本。只要把系统信息输出脚本丢进去每次登录自动执行不需要额外守护进程不需要改 SSH 配置纯粹利用 Shell 本身的机制。1.2 这个方案解决什么问题我统计过自己平时登录服务器的习惯巡检动作基本集中在几个固定的命令上uptime看负载和运行时间、free -h看内存、df -h看磁盘、uname -a或hostnamectl看内核和发行版、ip addr看 IP。这些命令单独执行都很快但每天在几十台机器上重复敲就变成纯体力活了。把信息采集写成脚本还有一个额外的好处输出格式是统一的。不同发行版之间free的版本不完全一样磁盘挂载点也可能不同人肉看容易漏。脚本会把关键项整理成固定的排版一眼扫过去就能发现哪台机器状态不对而不是被一屏原始输出淹没。后来我又在这个脚本里加了一个“关键指标异常提醒”的小功能如果内存使用率超过 90%直接在登录输出里高亮警告磁盘某个分区使用率超过 85%同样单独标出来。这样登录时哪怕只是扫一眼也能最快速度发现需要处理的机器。1.3 为什么不是系统服务而是登录脚本你可能会问这些信息为啥不用prometheus、zabbix这类监控系统来采集说实话生产环境当然应该有完整的监控体系但登录脚本和监控系统定位不一样。监控看的是趋势和报警登录脚本看的是“此时此刻这台机器到底什么状态”。当你在命令行里准备执行操作时最需要的是即时、直接、不绕路的信息。而且这个脚本在没有任何监控组件的场景下也能用比如临时排查问题、管理没有纳入监控系统的测试机、或者内网环境不方便部署 agent 的时候。登录脚本的另一个隐藏价值是“环境感知”。每次登录自动看一遍系统信息时间久了你会形成一种直觉哪台机器内核版本老、哪台机器内存小、哪台机器磁盘分区比较紧张。这些背景知识在日常排障和做变更评估时非常有用。2. 核心细节拆解每个系统信息背后的命令与参数2.1 信息采集命令选型先看下面的表这是脚本里会用到的命令和用途对应关系信息项推荐命令关键参数/说明发行版名称/etc/os-release无需命令直接读取文件兼容性最好内核版本uname -r轻量任何 Linux 都有主机名hostname也可以用hostnamectl但前者更快内外网 IPhostname -I注意是大写 I输出所有地址运行时间与负载uptime输出 load average 三项CPU 型号/核数lscpu没有的话用/proc/cpuinfo内存使用free -m用 MB 单位避免不同版本 -h 的兼容性问题磁盘使用df -h只看本地磁盘时排除 tmpfs 等伪文件系统当前在线用户who看是否有其他管理员在线最近登录记录last -a | head -n 5需要读 wtmp权限一般 OK这些命令里最值得注意的是free -h的兼容性问题。较老的 CentOS 6 或 Ubuntu 16.04 上free命令其实不支持-h参数直接报错。为了兼容新旧系统我建议脚本里用free -m再在 Shell 里用awk把数字换算成人类可读的 GB或者干脆就保留 MB 单位。我在后面的脚本模板里用了 MB因为数字直观脚本也简单。df -h也有一个隐蔽的点如果机器上挂了 NFS 或者一大堆 tmpfs输出会特别长刷屏不说还没有意义。建议加一个条件只显示 SSH 服务器或对应根分区等关键挂载点。脚本里我直接用df -h / /home /data这类写法只关心最常用的分区。你也可以用df -h -x tmpfs -x devtmpfs -x overlay把虚拟文件系统排除掉。2.2 从/proc直接拿细节数据如果只看命令输出很多信息其实是从/proc虚拟文件系统读出来的。比如/proc/loadavg就是uptime负载数据的来源/proc/meminfo是free输出内容的来源。脚本里如果只依赖free和uptime这类封装命令够用但如果你想做更精细的控制比如读取某个进程占用的内存、统计 CPU 核心数直接解析/proc文件反而更灵活。CPU 核数这一项我见过有人用grep -c processor /proc/cpuinfo来取但这样取到的是逻辑核数不是物理核数。现代 CPU 普遍开了超线程逻辑核可能是物理核的两倍。如果想区分需要解析/proc/cpuinfo里的physical id和core id。但咱们这个场景只是为了显示一台机器的“CPU 规模”逻辑核数就够用了所以脚本里直接nproc简单明确。内存信息的核心其实是/proc/meminfo里的MemTotal、MemAvailable两个字段。我写脚本时优先用free -m的原因就是它已经把这些字段换算得比较友好。如果哪天你想在脚本里做百分比计算再改用awk去解析/proc/meminfo也不迟。咱们的目标是登录时快速展示不是写监控采集器所以别过度设计。2.3 Shell 语境中的三个隐藏注意点写这个脚本时有三个细节如果不注意效果会大打折扣。第一登录 Shell 和非登录 Shell 的区别。SSH 登录、su -切换用户都是登录 Shell会读/etc/profile和~/.bash_profile。但是你在图形终端里新开一个标签页时通常是非登录 Shell只读~/.bashrc。所以如果你的使用场景是“打开终端就看系统信息”脚本应该从~/.bashrc里调用或者直接在/etc/profile.d/的脚本里额外. ~/.bashrc这种逻辑。我建议两边都照顾登录钩子放/etc/profile.d/用户级入口放~/.bashrc里用一段判断避免重复输出两次。第二PATH 可能还没加载完整。/etc/profile在执行过程中会加载/etc/profile.d/下的脚本但此时 PATH 是在这些脚本执行前就被/etc/profile设置了一部分并不一定包含/usr/local/sbin、/usr/sbin这些目录。如果你的脚本里写了ss或ip这类在/usr/sbin下的命令有些系统上会提示找不到。我习惯在脚本开头先做一次“补全”export PATH$PATH:/usr/sbin:/usr/local/sbin或者直接用命令的绝对路径。后者更保险但可读性差。折中方案是command -v做存在性检查存在才调用。第三避免登录变慢。如果脚本里有 DNS 反向解析、远程 API 调用、或apt update这类耗时操作每次登录都会卡几秒甚至更久非常影响体验。记住脚本的定位是“快、轻、一眼看懂”凡是可能产生网络超时的命令都不要放进去。我这里强调一下登录脚本不是监控 agent不要搞太重。3. 脚本实现完整代码与部署步骤3.1 完整脚本模板下面的脚本是我在自己服务器上跑着的完整版本注释写得比较详细。注意所有输出都是纯文本加 ANSI 颜色不需要额外工具#!/usr/bin/env bash # # sysinfo.sh -- 登录时展示 Linux 系统信息 # 适用环境Bash 3.2Linux 全发行版 # 用法部署到 /etc/profile.d/ 或 从 ~/.bashrc 调用 # # 只在交互式登录 Shell 中显示防止非交互执行时刷屏 if [ -n $BASH_VERSION ] [ $- ! *i* ]; then return 0 2/dev/null || exit 0 fi # 补全 PATH避免 ip/free 等命令找不到 export PATH$PATH:/usr/local/sbin:/usr/sbin:/sbin # ---------- 颜色定义 ---------- CLR_GREEN\e[1;32m CLR_YELLOW\e[1;33m CLR_RED\e[1;31m CLR_CYAN\e[1;36m CLR_RESET\e[0m # ---------- 工具函数 ---------- # 检测命令是否存在 has_cmd() { command -v $1 /dev/null 21 } # 打印分割线 print_line() { printf ${CLR_CYAN}%*s${CLR_RESET}\n $(tput cols 2/dev/null || echo 80) | tr - } # ---------- 信息采集 ---------- # 发行版与内核 if [ -r /etc/os-release ]; then . /etc/os-release OS_NAME$PRETTY_NAME else OS_NAME$(head -n 1 /etc/issue 2/dev/null || echo Unknown Linux) fi KERNEL$(uname -r) ARCH$(uname -m) HOSTNAME$(hostname) # 运行时间与负载 LOAD_INFO$(uptime | sed s/.*up//; s/ */ /g) # 直接取 load average 字段 LOAD_AVG$(uptime | awk -Fload average: {print $2}) # CPU if has_cmd lscpu; then CPU_MODEL$(lscpu | awk -F: /^Model name/ {print $2; exit}) CPU_CORES$(nproc) else CPU_MODEL$(grep -m1 model name /proc/cpuinfo | cut -d: -f2 | sed s/^ //) CPU_CORES$(grep -c ^processor /proc/cpuinfo) fi # 内存 (单位 MB) if has_cmd free; then MEM_TOTAL$(free -m | awk /^Mem:/ {print $2}) MEM_USED$(free -m | awk /^Mem:/ {print $3}) MEM_AVAIL$(free -m | awk /^Mem:/ {print $7}) MEM_PERCENT$(awk BEGIN {printf \%.1f\, ($MEM_AVAIL/$MEM_TOTAL)*100}) else MEM_TOTALN/A; MEM_USEDN/A; MEM_PERCENT100 fi # 磁盘只列常用挂载点你按需改成自己的分区 DISK_INFO$(df -h / /home /data 2/dev/null | tail -n 2) # IP 地址 IP_ADDR$(hostname -I 2/dev/null | awk {print $1}) # 在线用户 ONLINE_USERS$(who | wc -l) # ---------- 输出 ---------- print_line printf ${CLR_GREEN} %s${CLR_RESET}\n Linux System Information print_line printf ${CLR_CYAN}主机名:${CLR_RESET} %s\n $HOSTNAME printf ${CLR_CYAN}系统:${CLR_RESET} %s\n $OS_NAME printf ${CLR_CYAN}内核:${CLR_RESET} %s (%s)\n $KERNEL $ARCH printf ${CLR_CYAN}IP 地址:${CLR_RESET} %s\n $IP_ADDR printf ${CLR_CYAN}CPU:${CLR_RESET} %s (%s 核)\n $CPU_MODEL $CPU_CORES printf ${CLR_CYAN}内存:${CLR_RESET} %s MB total, %s MB used (可用 %.0f%%)\n $MEM_TOTAL $MEM_USED $MEM_PERCENT printf ${CLR_CYAN}负载:${CLR_RESET} %s\n $LOAD_AVG printf ${CLR_CYAN}在线用户:${CLR_RESET} %s\n $ONLINE_USERS print_line printf ${CLR_YELLOW}磁盘使用:${CLR_RESET}\n printf %s\n $DISK_INFO print_line # ---------- 异常状态提醒 ---------- # 内存可用比例低于 10% 时标红 if [ $MEM_PERCENT ! N/A ]; then if awk BEGIN {exit !($MEM_PERCENT 10)}; then printf ${CLR_RED} [警告] 内存可用低于 10%%请关注${CLR_RESET}\n fi fi # 磁盘使用率超过 85% 的挂载点单独报警 echo $DISK_INFO | tail -n 2 | while read -r line; do USE_PERCENT$(echo $line | awk {print $5} | tr -d %) MOUNT_POINT$(echo $line | awk {print $6}) if [ ${USE_PERCENT:-0} -gt 85 ] 2/dev/null; then printf ${CLR_RED} [警告] 分区 %s 使用率已达 %s%%${CLR_RESET}\n $MOUNT_POINT $USE_PERCENT fi done print_line printf ${CLR_GREEN} %s${CLR_RESET}\n 登录时间: $(date %Y-%m-%d %H:%M:%S) print_line这个脚本用到了不少小技巧下面逐段讲一下为什么这么写。3.2 关键代码段解析脚本开头那个$- ! *i*判断是防止误伤非交互式 Shell。$-变量保存的是当前 Shell 的选项开关其中i代表 interactive。如果某次执行是bash -c source /etc/profile.d/sysinfo.sh这类非交互场景脚本应该直接退出不要打印一屏幕信息。很多新手写类似的脚本时会忽略这一点结果导致 scp、rsync 远程执行命令时输出被污染。print_line函数里用tput cols获取终端列数再通过printf %*s生成一个指定宽度的空字符串最后用tr把空格换成横线。这个做法比写死 80 个横线好看因为宽屏终端下分割线能拉满。如果tput cols获取失败比如某些非标准终端就回退到 80。内存百分比计算的写法awk BEGIN {exit !($MEM_AVAIL/$MEM_TOTAL 0.1)}可能有点绕但它是一种惯用法通过 awk 的 exit code 在 Shell 里做浮点数比较。需要注意的是内存使用率的标准算法在不同发行版上有细微差异有的把 buff/cache 算作可用有的不算。free -m里的第七列available是比较靠谱的“真实可用内存”因为它已经考虑了 buffer 和 cache 可以回收的情况。所以脚本里用$7而不是$4老版本 free 没有第七列这也是为什么我建议 CentOS 7 以上使用。磁盘报警那段用了管道while read循环。这里有个 Shell 脚本里著名的坑“管道里的 while 是在子 Shell 里执行的循环内对变量的修改不会带出管道”。我这个脚本只在循环里做打印不修改外部变量所以没问题。如果你想把报警汇总到一个变量里最后统一打印就得改用进程替换while read ...; do ...; done (echo $DISK_INFO)这种写法。3.3 部署的两种方式脚本写完之后部署方式根据你的管理范围来选。全局部署把文件保存为/etc/profile.d/sysinfo.sh赋予执行权限sudo tee /etc/profile.d/sysinfo.sh /dev/null sysinfo.sh sudo chmod 755 /etc/profile.d/sysinfo.sh只要用户通过登录 Shell 进入系统/etc/profile会自动加载它。这是最省事的方式适合管理一台机器或者想对所有用户生效的场景。注意/etc/profile.d/目录下脚本的执行顺序是按文件名排序的如果你的脚本名字用了sysinfo.sh基本会在所有系统脚本之后执行PATH 和基础环境变量都已经就绪比较稳。单独用户部署如果只是自己用可以把脚本放到~/.local/bin/sysinfo.sh然后在~/.bashrc末尾加一段if [ -f $HOME/.local/bin/sysinfo.sh ]; then bash $HOME/.local/bin/sysinfo.sh fi加个if -f判断是防止脚本被删后 Shell 报一堆错。这种方式对单用户体验更灵活不会影响其他用户。一个我在实际部署中踩过的坑/etc/profile.d/下的脚本如果用bash执行而非source那么脚本里的export PATH...和把当前目录切换cd都不会对父 Shell 生效。登录脚本不管有没有export语句本质都应该被source。在/etc/profile.d/场景下这一点由/etc/profile的for循环保证但是如果你手动测试时直接bash /etc/profile.d/sysinfo.sh环境变量是不继承到当前 Shell 的容易误以为脚本有问题。测试的时候要记得用source /etc/profile.d/sysinfo.sh或者干脆重新登录。3.4 效果验证的正确姿势部署完成后怎么确认脚本真的生效了最简单的方式是exit后重新 SSH 登录或者直接ssh localhost来模拟一次新登录会话。如果你是手动执行source ~/.bashrc来测试有时候会重复输出两次系统信息因为~/.bashrc可能已经被动过、嵌套调用过。我测试时的验证清单登录输出能看到主机名和系统信息。手动执行bash -xl跟踪登录 Shell 的详细过程能看到/etc/profile.d/sysinfo.sh被加载。执行scp或rsync远程命令时不会在目标机器上触发信息输出。在 tmux 里新开窗口非登录 Shell不会重复显示如果你希望显示则在~/.bashrc里手动调用脚本并去掉开头那个交互判断。4. 常见问题与排查技巧实录4.1 “找不到命令”或 PATH 不完整表现脚本里明明写了ip addr但登录时提示ip: command not found。原因ip命令在/usr/sbin/ip而/etc/profile.d/脚本执行时PATH 不一定包含/usr/sbin。有些发行版默认把/sbin、/usr/sbin放在普通用户的 PATH 里但有些发行版比如某些精简版系统需要额外添加。我在脚本开头统一export PATH补全基本能解决所有同类问题。如果还有找不到的就type 命令名看它真实路径然后改成绝对路径调用。4.2 登录时卡住几秒才出信息表现SSH 连接后要等两三秒才出现系统信息体验很差。原因大多数时候是脚本里某个命令做了超时等待比如hostname -I在极少数网络配置复杂的机器上会慢或者误放了 DNS 解析类的命令。排查办法在脚本里不同位置加date %s%N打印耗时找到慢的命令。我自己的环境里最常出问题的是/etc/os-release被某个软件包改成了可执行脚本Source 时执行了外部命令。用bash -x追踪也能较快定位。4.3 中文乱码或 ANSI 颜色不生效表现系统信息里中文显示成乱码或者颜色代码直接变成\e[1;32m这样的文本。原因分两个方向。乱码一般是因为终端字符集不是 UTF-8登录 Shell 的LANG环境变量没有正确设置。可以在~/.bashrc里强制export LANGen_US.UTF-8或zh_CN.UTF-8。颜色不生效则是因为echo命令不加-e参数时不会解释\e转义序列。我的脚本里统一用printf它天生支持转义但注意格式字符串里不能随便把变量放进去当格式符否则会有很多意想不到的问题。技巧是变量全部放在参数区格式串里只写%s。4.4 每次打开新终端都重复输出表现登录时显示了一遍进入桌面终端再开一个窗口又输出一遍。原因你的图形终端通常以非登录 Shell 模式启动它只读~/.bashrc不读/etc/profile。如果两者都配置了输出就会见到两遍。如果你希望所有场景都输出那保留重复没问题如果你只想登录时输出一次就把~/.bashrc里的调用删掉只留/etc/profile.d/或~/.bash_profile。我个人推荐留着~/.bashrc的版本因为日常开着终端时切换目录、重载配置后也能顺便看一眼系统状态。4.5su -和sudo su场景下的双输出表现root 用户登录后再su -切换到别的用户又看到一次系统信息或者sudo su -时直接看到两次。原因su -会重新模拟登录 Shell自然会触发目标用户的登录钩子。如果你的 root 用户的 profile 配置和普通用户不一致也可能出现多次加载。解决方法是脚本开头判断环境变量SSH_TTY是否存在只有来自 SSH 真实登录时才输出su切换不输出。但这个策略要看场景我一般在管理的跳板机上启用其他机器保持默认。4.6 Bash 语法层面的细节坑写这个脚本的过程中我还遇到一些 Bash 基础语法导致的坑新手容易踩if [ $MEM_PERCENT -lt 10 ]如果MEM_PERCENT是浮点数-lt会直接报错。浮点比较要用awk或者bc。df -h输出的Use%列可能带百分号直接拿去和数字比较必须在前面tr -d %清理掉。printf %s\n $DISK_INFO和echo $DISK_INFO的区别是前者处理转义更安全变量里如果是多行字符串也能原样输出不会把-n之类的内容误解为参数。数组声明MEM_TOTAL$(free -m | awk ...)里如果 awk 匹配不到行变量就变成空。脚本里要加默认值兜底否则 printf 输出空字段后会显得很凌乱。4.7 生产环境的高级注意点如果你打算把这类脚本放到生产环境的服务器上下面几个点务必注意不要用脚本读取敏感信息。系统信息本身还好但如果某些路径或变量里涉及加密连接的信息就不要在外设终端上输出。避免在脚本里使用sudo或要求输入密码的命令否则每个普通用户登录时都会卡在密码提示上非常尴尬。脚本要考虑到非 Bash 用户。/etc/profile.d/下文件如果被zsh或csh读取语法上可能不兼容。要么使用纯 POSIX 语法要么在脚本开头判断BASH_VERSION。我的脚本已经做了这个判断如果是非 Bash Shell直接跳过输出安全。不要用top、free命令行以外的重型工具。有些系统工具在登录时调用会读大量/proc数据几百个用户同时登录时每人都跑一遍会造成无谓的 IO 放大虽然单次很小但规模化后不可忽视。5. 延伸玩法让登录信息更贴合你的运维习惯5.1 登录后自动展示最近登录记录系统信息里加一个last -a | head -n 5的输出可以快速知道这台机器最近谁登录过。对小团队环境或者个人开发机这个功能能帮你发现异常登录。如果你担心last输出的时间格式不够直观可以用last -F或last -i调整。我实际用下来last -a -n 3最合适三行记录不刷屏信息量刚刚好。5.2 加一个“今日提醒”或“待办提示”运维场景里我经常把“记得备份”“周五更新内核”这类事项写在一个/etc/motd.local或~/todo文件里登录脚本顺带读一下。这样登录时既看系统状态也看自己的备忘。实现很简单if [ -f ~/.todo ]; then printf ${CLR_YELLOW}今日备忘:${CLR_RESET}\n cat ~/.todo fi这个功能特别适合多服务器管理员。你在跳板机上维护一个待办清单每次登录都能看见比手机备忘录还稳。5.3 多台服务器批量配置如果你想在 20 台服务器上统一部署这个脚本可以用ansible的copy模块把脚本分发到/etc/profile.d/或者写一个简单的for循环加scp。脚本是纯文本没有依赖拷贝过去就能跑。我见过有人用clusterssh批量执行也见过直接挂配置管理工具统一发布。方式不重要反正脚本本身足够简单分发成本很低。5.4 和 Git Bash / WSL 的兼容性搜索热词里有不少关于 Git Bash 和 WSL 的内容这里也顺手说一下。如果你在 Windows 上装了 Git Bash这个脚本的大部分内容能跑但有两点要注意hostname -I在 Git Bash 下不一定有输出df -h输出的是 Windows 驱动器的挂载信息而非 Linux 分区。WSL 里则基本可用但同样存在某些命令路径和真实 Linux 发行版不一致的问题。我在写脚本时加了has_cmd检查命令不存在就跳过对应项所以即使放在这类兼容环境里也能安全执行不会因为某个命令缺失导致整个脚本报错退出。5.5 让输出风格更花哨如果你喜欢更醒目的登录横幅可以在脚本里加个 ASCII 艺术字用figlet或banner命令生成主机名大标题再配合lolcat上色。不过我不建议在纯运维场景这么干一是依赖多二是重度终端用户早就关了figlet这类输出。好看的排版应该服务于信息密度而不是反向干扰。我自己的脚本里颜色都控制在三个以内绿色表示正常信息、黄色用于提示、红色用于告警干净且高效。6. 个人实践总结这个脚本改变了我什么最后说点实际的感受。我管理的服务器里有不少是没有任何监控 agent 的纯计算节点以前每次上机器都要手动敲三四个命令看“有没有问题”。写完这个脚本之后登录变得非常安静——信息自动在眼前铺好然后我只需要判断“有没有红色警告”就行。有一次排查一台数据库服务器的慢查询问题刚 SSH 上去就发现输出里磁盘使用率标红/var/lib/mysql所在分区已经 97% 了。在这之前我根本没把慢查询和磁盘空间关联起来但登录脚本让我第一眼就看到了这个关键线索节省了不少排查时间。后来我又给脚本加了一个负载异常的提醒逻辑很简单/proc/loadavg的第一个数字1 分钟负载如果超过 CPU 核数的两倍就直接把整行输出改成红色。这个阈值并不精确但它作为“需要看一眼”的信号在登录取向上非常有效。你可以根据自己机器的核心数和业务类型去调整。如果要说这个项目最大的收获那就是一条 Linux 运维的经验法则“信息要主动出现在操作者面前而不是等人去翻命令”。Bash 的灵活性让这类小改造变得极其便宜——一个脚本、一个配置、零依赖却每天都能为你节省几分钟。别小看这几分钟积年累月下来多出来的有效操作时间相当可观。这套代码和思路如果你觉得有用直接拿着用就行。有不明白的地方也可以照着bash -x的方式逐步跟踪脚本执行过程把每一行都过一遍理解之后你就能根据自己的环境随意改出更多花样来。
返回列表