1. 写在前面
干了这么多年运维,我最大的感受就是:这行看起来是“修电脑的”,实际上拼的是快速定位问题的能力和日复一日积累下来的小套路。无论是服务器崩了、办公网卡了、还是业务上线前要巡检,真正拉开效率差距的,往往不是哪些高深的架构设计,而是那些随时能拿出来用的命令技巧、工作习惯和判断逻辑。
这一次我不打算讲什么大而全的运维体系,就专门把平时在 Linux 环境、桌面支持、机房巡检和日常自动化处理里踩过的坑、用顺手的技巧整理一遍。这篇内容适合刚入行的运维新人、负责公司内部 IT 支持的桌面运维,以及想优化自己日常工作流的工程师。每一条我都尽量说清楚为什么这么做、在什么场景下用,顺便附上我自己的实测经验,希望能给你一些可以拿过去直接用的参考。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 服务器运维中的实操技巧与高频命令
2.1 命令技巧:别再敲完整路径和重复命令了
服务器运维最怕两件事:一是敲错命令,二是浪费时间敲重复的命令。先说让人“真香”的几个技巧。
善用 alias 固化高频操作
我习惯在自己管理的每台服务器上,把常用的命令简化成一串短别名,写在 ~/.bashrc 里:
bash复制alias ll='ls -alF'
alias vi='vim'
alias grep='grep --color=auto'
alias rm='rm -i'
alias cp='cp -i'
alias mv='mv -i'
alias netstat='netstat -tunlp'
alias df='df -h'
别小看加 -i 参数这件事。服务器上误删文件、误覆盖配置的案例,百分之八十发生在深夜变更和紧急排障的时候,这时候一个默认的交互确认提示能救回半条命。改完 ~/.bashrc 记得执行 source ~/.bashrc,让它立刻生效。
历史命令搜索与调用
很多运维同事还在用上下方向键翻历史命令,翻得眼花缭乱。实际上用 Ctrl + R 可以反向搜索历史命令,输入几个关键字母就能快速调出之前执行过的完整命令,效率提升非常明显。
如果想看到历史上所有执行过的命令,直接敲:
bash复制history
但要真正发挥价值,还得配合 ! 符号。比如 !ps 会重新执行最近一条以 “ps” 开头的命令;!! 表示执行上一条命令。日常改配置文件时我经常用 !! 反复调试命令,省去重复输入的麻烦。
多条命令组合执行
一个是用 && 连接,前一条成功后才会执行后一条。另一个是用 ; 分隔,无论前一条是否成功都会继续往后执行。做服务发布时我一般写成这样:
bash复制cd /app/deploy && tar -zxvf app.tar.gz && systemctl restart app && systemctl status app
这样的好处是,哪一步失败了就立刻停下来,不会在解压失败后还傻傻地去重启服务。
2.2 排查三板斧:CPU、内存、磁盘的快速体检
系统出问题,先看什么?绝大多数情况下,一台服务器表现异常,无非是 CPU 飙升、内存不足、磁盘写满、IO 卡顿这几类问题。我的习惯是先用 top 和 free 摸个底,再用 df 和 iostat 做精细定位。
定位 CPU 占用高的进程
top 进入后按 P 键可以让进程按 CPU 使用率排序,这是最快把“罪魁祸首”揪出来的办法。如果发现某个进程 CPU 占用率长时间在 100% 以上,先别急着 kill,先用 ps 看一下它到底是什么:
bash复制ps -ef | grep 进程名
如果确定是需要重启的业务进程,先重启再观察;如果是可疑进程,结合启动时间和执行路径判断是否为异常程序。另外,多核 CPU 环境下看 CPU 使用率要留意数值可能超过 100%,因为 top 显示的是所有核的累计占用率。
释放内存前先搞清楚谁在占用
当 free -h 看到内存不足时,很多人第一反应是“清理缓存”。但其实 Linux 的内存管理机制中,buff/cache 占用的内存是可以在需要时自动释放的,不需要手动干预。真正的问题是进程占用的内存异常增长。
此时我会用:
bash复制ps aux --sort=-%mem | head -20
从高到低列出内存占用最高的 20 个进程,看看是哪个业务在吃内存。如果是 Java 应用,再用 jmap 或 jstat 进一步查看堆内存使用情况;如果是数据库,检查慢查询和连接数。
磁盘写满后别忽略 inode
df -h 查看磁盘剩余空间是大家都会做的事,但还有一类经典问题:磁盘明明还有空间,却提示“No space left on device”。这种时候十有八九是 inode 耗尽了。
bash复制df -i
用 df -i 查看 inode 使用率,如果 IUse% 接近 100%,说明磁盘上小文件太多,需要找出这些文件并清理。常见的位置包括 /tmp 目录、邮件队列目录、容器日志目录等。我曾处理过一台被大量 0 字节临时文件塞满 inode 的服务器,最后是用 find /tmp -type f | wc -l 确认数量后批量清理解决的。
2.3 日志查看与实时追踪:别只会 tail -f
看日志是运维的基本功,但怎么看得快、看得准,还是有技巧的。
多文件实时追踪
一次部署多个服务时,我常需要同时看多个日志的输出。简单做法是开多个终端窗口,但更优雅的方式是用 tail -f 同时跟踪多个文件,并且用 --pid 参数让它跟随某个进程退出:
bash复制tail -f /var/log/nginx/access.log /var/log/nginx/error.log
如果担心日志文件被 logrotate 切割后 tail -f 失效,推荐用 tail -F(大写 F),它会自动重试打开被轮转的文件。这个细节在跑长期任务时特别重要,否则日志一切割,终端就再也不输出新内容了,你以为是应用停了,其实只是跟踪断开了。
按关键字抓上下文
排查报错时,只知道“有 ERROR”是不够的,得看到报错前后的日志内容。用 grep -C 可以同时打印匹配行的前几行和后几行:
bash复制grep -C 5 "ERROR" /var/log/app/error.log
加上 -n 显示行号,去开发那边对质时就非常硬气,直接能指出大概在哪个时间点、哪一段逻辑附近出了问题。
日志分析推荐用 awk 统计
经常遇到客户问“这个接口最近一小时请求了多少次”,如果日志格式是 Nginx 默认的 combined 格式,一行一个请求,可以用 awk 快速统计:
bash复制awk '{print $1}' access.log | sort | uniq -c | sort -rn | head -10
这是统计访问量最高的 TOP10 IP。第一列取 IP,然后排序、去重并统计次数,最后按次数倒序取前十条。类似的逻辑可以扩展到统计 URL 访问量、状态码分布等,只是改一下 print 的字段序号就行。
我经常把这类命令保存在一个脚本目录里,要用的时候直接拿,省得每次现场重写。
2.4 文件查找与批量处理
服务器上文件多、路径深,最担心的是找不到要处理的目标。除了用 find 之外,我总结了一套快速处理的方式。
按时间过滤定位问题文件
有一次用户反馈某目录占用空间暴涨,我第一时间不是去目录里看大文件,而是用查找最近 24 小时内修改过的文件来定位问题源头:
bash复制find /data -type f -mtime -1 -size +100M -exec ls -lh {} \;
这句话的含义是:在 /data 下找 24 小时内修改过、大小超过 100MB 的文件,并用 ls -lh 把它们列出来。-mtime 后面数字为负表示 n 天以内,正数表示 n 天以前。-exec ... \; 是对找到的每个文件执行后续命令。
批量修改与传文件
批量重命名文件时可以配合 sed 处理。比如把当前目录下所有 .htm 后缀改为 .html:
bash复制for f in *.htm; do mv "$f" "${f%.htm}.html"; done
${f%.htm} 是 Shell 的变量替换,表示删除变量 f 中从尾部开始匹配到的最短的 .htm 字符串,再拼接 .html 后缀。这种写法在写脚本时非常常用。
传递文件时,我习惯用 rsync 而不是 scp。两者都能传文件,但 rsync 支持断点续传、增量传输,尤其是大批量文件或频繁同步目录时,效率差距非常明显:
bash复制rsync -avz --progress /data/app user@192.168.1.10:/backup/
推荐固定加 -a 归档模式(保留文件权限、属主、时间等属性),-v 显示详细信息,-z 传输时压缩。首次全量同步会比较久,后续再执行时只传变化的文件,速度感人。
网络排查工具组合
运维排查网络的频率很高,我的固定动作是先 ping 测连通性,再 telnet 或 nc 测端口,最后用 traceroute 定位网络路径问题。如果发现连接被重置或超时,立刻在服务器上抓包:
bash复制tcpdump -i eth0 host 1.2.3.4 and port 80 -w capture.cap
抓包文件用 Wireshark 打开,能直观看到 TCP 三次握手是否完成。很多经验丰富的运维工程师不会一上来就怀疑交换机或防火墙,而是先用 tcpdump 确认报文是否到达服务器,再逐层排查,这样效率远高于盲目找网络管理员。
2.5 UOS 与国产化环境下的运维工具箱思路
这两年国产操作系统在政企单位大面积推广,其中 UOS、麒麟等系统的运维需求和传统 CentOS 有重叠也有差异。很多运维同行发现,传统的 Windows 远程工具不一定兼容,需要重新整理一套适配国产环境的运维方式。
我个人的做法是维护一个便携工具箱目录,里面放常用软件的离线安装包、自制的系统巡检脚本、进程排查脚本和日志收集脚本。UOS 基于 Linux 内核,常见的 top、free、df、journalctl 命令都能直接用,但对软件包的安装方式要有所准备,离线环境下 .deb 包和依赖的处理是个大工程。
我的经验是提前做一次依赖收集。在一台联网的 UOS 机器上,先安装好需要的软件,然后用 apt download 连依赖一起拉下来,存成一个本地仓库目录。之后到内网机器上,直接通过 dpkg -i *.deb 或配置本地 apt 源的方式批量安装,省去每台设备手动解决依赖问题的痛苦。如果你所在单位正在做国产化替代,建议提前把这类离线部署方案准备好,真到项目交付的时候能少加不少班。
3. 桌面运维的常见故障与解决套路
3.1 桌面运维遇到的问题其实有规律
很多人觉得桌面运维就是接电话、跑现场、装软件,技术含量低。但实际上,桌面运维最能锻炼人,因为它要求你面对的都是非标准化的环境、非技术背景的用户,以及各种意想不到的使用习惯。排查起来考验的是逻辑推理能力和经验积累。
桌面端常见的故障类型其实很集中,整理下来无外乎这几种:开机异常、网络连接问题、办公软件崩溃、外设无法识别、系统卡顿和权限配置出错。每类问题都有相对固化的排查路径,把这些路径总结成自己的处理清单,处理速度能比临场发挥快很多。
3.2 电脑无法上网的排查顺序
比如用户报修“电脑连不上网”,我到了现场不会先急着查 IP,而是按以下顺序问和查:
先看右下角网络图标状态,判断是“已连接但无法上网”还是“未连接”。如果是未连接,点开网络列表看是否能看到周围 Wi-Fi。看不到说明无线网卡可能被禁用或驱动异常,能看信号但连不上,优先考虑密码错误或认证方式不匹配。
如果是有线网络,查网口指示灯。网口灯不亮,大概率是物理链路问题,换网线换端口试试。网口灯亮还是上不了网,就要查 IP 获取情况了。
Windows 下我习惯用以下命令快速排查:
bash复制ipconfig /all
看 IP 地址是否正常。如果 IP 是 169.254.x.x 开头的,说明 DHCP 获取失败。这种情况先 ipconfig /release 再 ipconfig /renew 重新获取一次。如果还是失败,检查 DHCP 服务是否正常,或者干脆手动配一个静态 IP 测试。
能获取到 IP 但还是上不了网,就 ping 网关和公共 DNS。网关不通,多半是交换机端口或网线问题;网关通了外网不通,检查 DNS 配置,尝试把 DNS 改成 223.5.5.5 这类公共 DNS 再测。
判断网络问题的核心逻辑:先物理链路,再网络配置,再往上走。 有了这条主线,就不会被用户的各种描述带着走。
3.3 系统卡顿的快速诊断思路
“电脑很卡”是桌面运维最高频的请求,但“卡”只是一个主观感受,背后原因可能差很远。我的处理习惯是:先打开任务管理器,点 CPU、内存、磁盘三个标签页,按使用率排序,看看是什么进程占用了资源。
如果 CPU 飙高的是某个 Office 进程或浏览器,通常关掉重开就好。如果是名为 svchost.exe 的系统进程占满 CPU,这多发生在 Windows Update 后台检查更新时。这种时候可以先看更新服务状态,把 Windows Update 服务暂时停掉,错开办公高峰期再更新。
如果卡顿主要发生在开机阶段,检查开机自启动项。Win+R 输入 msconfig 打开系统配置,在“启动”标签页里可以看到自启程序列表,把不需要随系统启动的软件禁用。Win10/11 的任务管理器里也有更直观的“启动”标签页,能直接看到各程序的启动影响,建议把影响为“高”的非必要程序全部禁用。
内存不足导致的卡顿也很常见。4GB 内存的机器跑 Win10 + 浏览器 + Office,基本是强弩之末。条件允许建议加内存条,条件不允许就想办法精简软件。把默认安装在 C 盘的软件能挪就挪,桌面文件定期清理,也能缓解一部分压力。
3.4 外设“不识别”的问题基本是驱动或接口的事
打印机无法打印、U盘不识别、显示器无信号,这类外设问题在桌面运维中占比不小。处理外设问题,我一般先分清是硬件问题还是驱动问题。
判断逻辑:
- 换一个 USB 口试试。换口能识别,说明原来的接口或供电有问题。
- 换个电脑试试。换台电脑正常,说明原电脑的驱动或系统设置有问题;换台电脑也不行,基本是外设本身硬件故障。
- 设备管理器里看有没有黄色感叹号。有感叹号,右键更新驱动,或用驱动精灵类的工具匹配安装对应驱动,大部分情况能解决。
打印机是桌面运维的一个重头。打印机无法打印时,除了看驱动和连接,还要检查默认打印机是否被切换了,以及打印队列里是否有卡住的任务。清空打印队列的方法是:在“服务”里重启 Print Spooler 服务,重启后之前卡住的任务会被清掉。这个操作能解决的打印机问题,比重新装驱动还多。
临时跑现场时,我注意到了一个细节:大量 UOS 系统的桌面环境下,打印机驱动的适配比 Windows 麻烦得多,很多老旧打印机没有官方 Linux 驱动,只能找通用驱动代替。如果遇到这种情况,建议优先跟厂商要兼容驱动,别自己花太多时间去折腾。
3.5 桌面运维的记录与知识沉淀
桌面运维做久了,会发现用户报修的问题高度重复。今天 A 部门网络掉线,明天 B 部门打印机罢工,底层原因翻来覆去就是那几种。如果不做记录,每次都要重新排查一遍,效率低不说,还容易在忙乱中漏掉关键步骤。
我建议每位桌面运维都建一个自己的问题记录库,最简单的形式就是一个表格,字段包括:现象、原因、处理方式、耗时、是否复用。每次处理完一个问题就更新一行。半年下来,回头看这些记录,你会发现自己处理同类问题的速度提升非常明显。
如果团队多人做桌面支持,可以考虑共用一套知识库。新人入职时,不用从零开始摸索,直接翻知识库里的历史问题就能快速上手。很多公司花大价钱上 ITIL 系统,但落到桌面运维层面,最实用的往往就是一本大家愿意更新的知识手册。
4. 提效工具与自动化脚本的整理思路
4.1 能自动化的事,别用手工反复做
运维工作的核心矛盾,是日常琐碎事务占据了大量时间,这些问题本身不复杂,但极其消耗精力。而且凡是重复性的工作,就一定有自动化的空间。
我自己的原则是:同一件事如果需要手工处理三次以上,就要考虑写脚本或工具来替代。比如批量检查远程服务器是否在线,手工操作要逐台 ping 或逐台登录,而写一个简单的批量检查脚本,能一次性跑完所有机器并输出结果。
批量检查服务器存活脚本示例:
bash复制#!/bin/bash
server_list=(192.168.1.11 192.168.1.12 192.168.1.13 192.168.1.14)
for ip in "${server_list[@]}"
do
if ping -c 2 -W 2 "$ip" > /dev/null 2>&1; then
echo "$ip 在线"
else
echo "$ip 离线"
fi
done
这个脚本用 ping -c 2 -W 2 发送两个 ICMP 包并设置 2 秒超时,避免单台机器不可达时卡住整个流程。执行后能快速得到一份所有服务器的在线状态列表。如果配合邮件发送命令,还能做到巡检结果自动通知团队。
批量检查远程端口脚本示例:
bash复制#!/bin/bash
for port in 22 80 443 3306; do
timeout 2 bash -c "echo >/dev/tcp/192.168.1.11/$port" 2>/dev/null && echo "端口 $port 开放" || echo "端口 $port 不通"
done
这个方法利用了 Linux 的特殊文件 /dev/tcp,不需要安装额外的 nc 工具,就能测试 TCP 端口连通性。timeout 2 用于防止端口不通时长时间阻塞。
这两个脚本是我最早写的自动化工具之一,代码量不大,但帮我省下了每天大量用于“登录服务器看状态”的时间。后来逐步演变成一个自动巡检脚本,用来巡检所有线上服务器的 CPU、内存、磁盘和关键进程状态,超过阈值自动告警。
4.2 远程批量执行命令
不是每台服务器都允许配置 SSH 免密登录,但在内网环境或测试环境里,配置免密登录能大幅提升批量操作的效率。
配置免密登录的步骤:
bash复制ssh-keygen -t rsa
ssh-copy-id user@192.168.1.11
同样把公钥复制到其他机器上后,再执行远程命令就不需要输入密码了。批量执行命令时可以用 for 循环:
bash复制for ip in 192.168.1.11 192.168.1.12 192.168.1.13; do
ssh user@$ip "uptime && df -h"
done
这样写的好处是清晰直观,十几台机器也能轻松管理。但如果管理的机器数量上百台,建议考虑使用 Ansible 这类自动化运维工具,通过 inventory 文件管理主机列表,用 Playbook 编排任务。Ansible 的核心思路是无 Agent 架构,基于 SSH 协议执行任务,学习曲线相对平缓,是目前自动化运维领域的主流选择之一。
我的经验是先从小事做起,不要一上来就追求“平台化”。把日常环境里最耗时的操作梳理一遍,找两三个最适合自动化的点写脚本跑起来,等习惯建立后再逐步扩展。
4.3 系统巡检脚本的设计思路
服务器巡检是运维的基本功,手工巡检时,我需要登录到每台服务器执行 top、free -h、df -h、uptime、dmesg -T | tail 等命令,然后人工判断是否有异常。整个过程繁琐且容易遗漏。
可以这样写一个简单的巡检脚本,一次性输出关键指标:
bash复制#!/bin/bash
echo "==== 系统时间:$(date) ===="
echo "---- CPU 负载 ----"
uptime
echo "---- 内存使用 ----"
free -h
echo "---- 磁盘使用 ----"
df -h | grep -vE 'tmpfs|udev'
echo "---- 监听端口 ----"
ss -tlnp | grep LISTEN
推荐用 ss 命令替代 netstat 查看监听端口。ss 输出更快,且能显示更多连接信息,在查看 TCP 连接状态时优势更明显。需要查看建立状态的连接数也可以直接:
bash复制ss -s
这条命令会输出当前系统 TCP 连接统计汇总,包括 established、time_wait、close_wait 等状态的连接数,一眼就能看出系统当前连接状态是否健康。TIME_WAIT 连接数过多通常意味着短连接请求量太大,CLOSE_WAIT 过多则往往说明应用程序没有正确关闭连接。
如果你习惯按固定时间巡检,可以把脚本交给 crontab 定时执行,并在输出异常时发送通知:
bash复制30 8 * * * /usr/local/bin/check_system.sh >> /var/log/system_check.log 2>&1
这段 crontab 配置的含义是每天 8:30 执行巡检脚本,并将输出追加写入日志文件。
4.4 ITIL 体系下运维工作的记录规范
近几年不少企业开始落实 ITIL 管理流程,把运维工作纳入事件管理、问题管理、变更管理等框架。很多运维很排斥这类流程,觉得是给自己增加负担。但说实话,合理运用 ITIL 的思想对自己的工作记录是有帮助的。
重点是不要把 ITIL 理解为“填表”,而要理解它强调的核心价值:事件的完整记录、分类、优先级评定,以及从事件中总结经验形成问题的解决方案库。这些习惯养成了,能显著减少重复处理同类问题的时间。
我的做法是平时每处理一个工单,花一分钟写清楚三件事:
- 用户描述的现象是什么
- 我最终定位到的原因是什么
- 解决步骤是什么
这三个字段写多了以后,你会发现大多数新问题都能匹配到以前处理过的老问题上。这时候处理速度就不是以小时计,而是以分钟计了。
4.5 从“人肉运维”到“数智化运维”的渐进路径
在云计算、云原生、AI 运维这些概念狂轰滥炸的今天,运维人员容易有两个极端:一种是焦虑,觉得传统运维要被淘汰了;另一种是无感,觉得那些概念离自己很远,继续按照老办法干活。
我觉得正确的态度是:关注趋势,但立足当下。服务器、网络、系统层面的运维基本功,永远有存在价值。即便自动化和智能化程度不断提高,仍然需要懂原理、能排查、会优化的人来维护这些系统。只是大家的工具可能会发生变化:从手动敲命令,到脚本批量执行,到监控告警平台,到自动化运维平台,最后到 AI 辅助分析和诊断。
如果你的目标是云计算运维或运维开发方向,建议先掌握这些能力,形成自己的知识框架后再持续向前走。具体到技能积累层面,我建议按以下顺序学习:
- 扎实的 Linux 系统管理能力:系统启动流程、权限管理、文件系统、日志系统、Systemd 服务管理。
- Shell 脚本能力:能写脚本解决重复性操作,理解变量、循环、判断、函数。
- 网络基础:TCP/IP 协议栈、HTTP 协议、DNS 解析流程、常见网络故障排查。
- 监控体系:Prometheus + Grafana 或其他监控系统的部署和使用。
- 自动化配置工具:Ansible、SaltStack 等,至少熟练掌握一种。
- CI/CD 与容器化:Docker、Kubernetes 的基本概念和日常运维操作。
- 数据库运维:至少熟悉 MySQL 的基础运维,包括备份恢复、慢查询分析、主从复制。
如今 AI 运维更是站在风口上:从告警噪音降噪、日志智能分析到故障预测与自愈,AI 正在渗透运维的各个场景。作为运维工程师,要抓住这些能力,关键还是得有扎实的数据基础:你得知道系统产生哪些指标、哪些日志是有价值的,才能让 AI 替你干活。没有理解系统的能力,AI 给你一堆告警你也判断不了该信哪条。
5. 避坑手册与排查经验实录
5.1 故障排查的核心逻辑:从现象到根因
做运维排障最忌讳的是“头痛医头”。举个例子,用户说网站打不开,如果你只盯着 Web 服务状态看,重启一次 Nginx 发现没好转,才开始想到查数据库、查存储,这中间浪费的时间其实就是事故扩大的时间。
我惯用的排查思路是分层排查,构建一条完整的链路视图:从客户端发起请求,到 DNS 解析、网络传输、负载均衡、Web 服务、应用逻辑、数据库、存储,每一层层层排除。
排查问题时的反应顺序应该类似医生问诊:
- 什么时间开始的?是突发的还是逐渐变差的?
- 影响范围是全部用户还是部分用户?
- 最近做过变更吗?代码发布、配置调整、硬件维护都有可能。
- 有没有相关的报错信息或用例可以复现?
把这些问题在脑子里过完一遍,才轮到看监控数据、翻日志。很多运维新手习惯一上来就抓日志,结果翻了半天没有头绪。正确的姿态是先通过问问题和观察全局数据把问题范围缩小。有了一个明确的假设后再找证据,才能高效定位根因。
5.2 我踩过的坑和应对办法
这里整理一些我在实际工作中真实遇到过的问题,以及后来总结的应对方案,希望能帮新人少走弯路。
第一个坑:磁盘满后盲目删除文件,忘记释放空间。
有些文件虽然删了,但进程仍然占用着文件句柄,磁盘空间不会释放。表现就是 df -h 仍然显示满了。这种情况要先定位是哪个进程占用了已删除文件:
bash复制lsof | grep deleted
找到对应进程后,重启进程或服务,空间才会真正释放。不重启的话也可以 : > /proc/进程号/fd/文件描述符 方式清空文件内容,但方式对新手来说并不友好,优先级还是先找到是什么进程,再考虑如何处理。经历过一次深夜处理磁盘报警,删了半天文件发现空间没动,最后才想起来是日志文件被进程占用,这个教训我一直记到现在。
第二个坑:修改远程服务器的防火墙和网络配置时,把自己锁在门外。
修改 iptables 规则或 SSH 端口时,如果没有预留逃生通道,一旦规则写错,远程连接就断了。而且机房服务器往往没有本地控制台,你只能求助现场同事。更麻烦的是,如果你在深夜操作,可能连现场都找不到人。
我的建议是:修改防火墙规则前,先添加一个定时任务,在几分钟后清空防火墙规则或恢复 SSH 服务。这样就算造成失联,过几分钟也能自动恢复,再重新连接调规则。下面这个命令给了自己一个 5 分钟的“后悔药”:
bash复制at now + 5 minutes <<< "systemctl stop firewalld"
第三个坑:误以为备份了就万事大吉,恢复时才发现备份不可用。
备份是运维的底线,但备份不经过恢复演练,就跟没备份一样。我见过不少同事用 crontab 定期执行备份脚本,日志里也显示成功,但真到出了问题需要恢复时,才发现备份文件损坏或备份脚本漏掉了某个关键目录。
我的习惯是每月至少做一次恢复演练,从备份文件完整走一遍恢复流程。数据库备份恢复后要检查数据完整性,配置文件备份恢复后要确认服务是否能正常启动。这类时间投资非常值得,关键时刻能救你于水火。
5.3 常见问题速查表
运维场景中反复出现的问题是有固定答案的,做一份速查表,可以帮你在高压环境里快速检索到正确处理姿势。我把自己常用的速查逻辑整理在下面:
| 现象 | 排查方向 | 常用命令/操作 |
|---|---|---|
| CPU 占用过高 | 找出高占用进程 | top 按 P 排序,ps aux --sort=-%cpu |
| 内存不足 | 检查进程内存占用 | free -h,ps aux --sort=-%mem |
| 磁盘空间不足 | 找大文件或日志 | df -h,du -sh /* 2>/dev/null |
| inode 耗尽 | 检查小文件数量 | df -i,配合 `find / -type f 2>/dev/null |
| 服务端口没监听 | 检查服务状态和端口 | systemctl status 服务名,ss -tlnp |
| 远程连接慢 | 检查 DNS 反解和 SSH 配置 | sshd -T,检查 UseDNS 是否改为 no |
| 网站打开缓慢 | 分层排查网络和应用 | curl -w 查看耗时,tcpdump 抓包确认耗时点 |
| 日志不输出 | 检查磁盘和文件权限 | df -h,ls -l /var/log/,tail -F |
| 服务频繁重启 | 看系统日志和 OOM | journalctl -u 服务名 -n 200,`dmesg -T |
| Windows 蓝屏 | 查 dump 文件和分析日志 | 事件查看器,蓝屏代码检索 |
这张表只是给一个框架,你可以把工作中实际遇到的问题持续补充进去。形成自己的速查表之后,当你同时面对三四个告警时,才能保持节奏、不乱阵脚。
5.4 面试和职业发展中的技术要点
结合我这些年参与面试候选人和自己准备面试的经验,运维岗位面试其实有很多高频问题值得提前准备。面试官问的问题,往往不是考察你背了多少命令,而是考察你排查问题的思路和对系统原理的理解。
比如“服务器 CPU 高,你如何排查?”这个问题,如果只回答“用 top 看”,那就是不及格。更好的回答是说明你如何区分是用户态高还是内核态高,如何用 pidstat 或 perf 定位到具体的线程,甚至到代码行级别,如何结合业务场景判断是正常流量高峰还是程序死循环。
再比如“Linux 启动流程是怎样的”,考察你对系统引导、内核加载、init 进程、systemd 启动目标的理解是否清晰。这类问题没有捷径,理解原理后再结合实操就能融会贯通。
对于想要从传统运维转型云计算或运维开发的同行,我想分享的额外建议是:简历上少写“精通”二字,多用实际项目和场景来证明自己。面试官更想听到你说:“我曾经在什么情况下,通过什么方法,解决了一个什么问题”,而不是一句空荡荡的“精通 Linux”。
5.5 少走弯路的三个经验
最后分享三个我用了很久才真正内化的经验。
第一,变更操作前写清楚操作步骤和回退方案。 没有回退方案的变更,实际上就是在赌运气。重要变更前我会写一份简短的变更文档,内容包括变更目的、影响范围、操作步骤、验证方式、回退方案、紧急联系人。内容不用很长,关键是让自己在操作前把可能遇到的问题预演一遍。
第二,保留现场。 排查问题的时候,不要为了急于修复而破坏现场证据。比如服务器出现故障,先收集 dmesg 输出的内核日志、系统当时的进程状态、网络连接状态,再考虑重启服务或重启机器。因为一旦重启,很多临时状态就消失了,问题可能永远找不到根因。
第三,把知识输出变成习惯。 每次处理完一个有价值的问题,用文字记录下来,分享给团队。这样做一方面是在帮同事避坑,另一方面也是帮自己梳理思路。我写技术博客的这些年,最大的收获不是积累了文章,而是通过写作把自己零散的知识点连成了网。运维这个职业非常依赖经验,而记录和整理就是经验最牢靠的载体。
我个人在实际操作中最深的一点体会是:运维的每一个小技巧,背后都是一次踩坑换来的经验教训。有些坑今天踩了记住,明天就不会再踩。但团队会来新人,公司会有新项目,环境永远在变,唯一能让我们保持从容的,就是把那些有效的技巧和思考方式记录下来、传下去。希望这篇整理能给你带来一些启发,也欢迎你在实践中总结出更适合自己的运维套路。
