ARTICLE DETAIL

资讯详情

深耕网站建设、视觉设计与SEO优化的一线实战洞察。

Linux运维命令实战指南:从排查思路到面试考点一次串清

Linux运维命令实战指南:从排查思路到面试考点一次串清 从面试被问到哑口无言到靠命令排查问题拿绩效Linux运维命令实战指南说到Linux命令很多刚入行或者干了几年桌面运维转服务器的朋友第一反应就是“命令太多背不下来”、“反正遇到问题能百度到就行”。但真正到了线上故障、面试考核、或者领导站在你身后问你“现在服务为什么挂了”的时候你脑子里如果没有一套清晰的命令体系手忙脚乱是小事错过故障恢复窗口才是真问题。这篇内容我从实际工作里总结出来不是教你背命令而是带你把Linux运维最常用、最能救命的那批命令按“排查场景”重新串一遍看完你至少会知道什么情况该用什么命令命令输出的关键字段到底怎么看以及那些网上搜不到的小细节和小坑。无论你是刚接触服务器的实习生还是已经会写点脚本但遇到系统问题还是发怵的桌面运维同学这篇内容都适合。我会把命令分成系统信息、文件处理、网络诊断、服务管理、容器排查、甚至是面试常考的提权和面试题几个模块每一条都会说清楚“为什么用”而不是只列参数。1. 整体思路Linux运维命令先别急着背你得构建一个“排查闭环”先说个我自己的体会。早年我带过一个新人很努力拿了个Linux命令大全在背背了一个月什么tar -zxvf、chmod 777张口就来。结果线上有一台机器负载飙高他上去一顿top、free、df -h按了个遍最后跟我说“我看不懂是什么意思”。问题出在哪他背的是命令孤立语法但运维排查需要的是一条“链路”先看系统整体状态再定位具体进程然后顺着进程查日志最后定位到代码或配置。你输入的命令只是这条链路上的“探针”。所以这篇文章我不会按man手册的目录结构来写而是按“故障半小时急救”的视角来组织。你遇到的百分之八十的运维问题无非就这么几类系统资源告警、服务起不来、网络不通、磁盘满了、进程僵死、日志疯狂输出、或者干脆是权限不够干不了活。对应地你的命令工具箱也应该分成几组系统概览组uname、uptime、free、df、du、top、ps文件与权限组ls、find、grep、chmod、chown、tar、rsync网络诊断组ping、telnet、ss、netstat、curl、traceroute服务与日志组systemctl、journalctl、tail、head、less、vim、sed、awk高级场景组git、containerd、shift技能点、cmake调用bash、sqlmap的排查思路每组命令解决一类问题组内命令通常按照“从宽到窄”的顺序组合使用。这个思路比死记硬背重要得多。你以后无论遇到什么没见过的系统、国产化操作系统、还是性能调优场景这套“分组建链”的方法都能复用。后面我会一步步把每个模块拆开讲。2. 系统信息与文件操作不做“只会ls的运维”2.1 系统概况三件套uname、uptime、free 的实战读法很多朋友一上来就按top其实先花三秒钟看一眼系统整体情况会更有方向感。uname -a能看到内核版本和系统架构这个东西在国产化适配、驱动编译、装Python时特别重要。比如你明明下载了amd64的包结果机器是aarch64架构装到一半报错才反应过来那就太浪费时间了。还有free -h显示的buff/cache那一列很多新手一看到used特别高就以为内存泄漏其实buff/cache是Linux的文件缓存在内存紧张时会被自动回收。判断内存到底够不够不要只看used要看available这个值这才是真正可用的内存量。uptime命令输出的三个负载值也容易被误解它代表的是过去1分钟、5分钟、15分钟的系统平均负载。对于运维判断重点是看趋势如果1分钟负载远大于15分钟说明负载正在快速上涨要警惕了如果三个值都高说明系统已经持续繁忙了一阵子。这里有个经验值负载除以CPU核数如果结果超过0.7就值得关注超过1.0基本就是过载状态了。注意free命令在不同发行版上输出格式有差异CentOS 7和Ubuntu 22.04显示的内存单位可能不同建议统一用free -h否则容易看错数量级。2.2 df与du磁盘满排查的正确姿势“Linux删除文件夹命令”是搜索热词但更常见的问题是“删了文件空间却没释放”。这个问题的经典原因是有进程还在占用已删除的文件句柄。我在用WSLWindows Subsystem for Linux时也踩过这个坑在WSL里删了一个大文件Windows侧磁盘空间没变化当时还以为是WSL的bug后来排查发现其实是某个后台服务一直open着这个文件。解决方案不是重启而是先用lsof | grep deleted找到占用的进程PID重启或kill掉对应进程空间才会真正释放。排查磁盘使用df -h看的是文件系统整体占用du -sh和du -sh *则用来逐层定位是哪个目录吃了空间。实操的时候我习惯这么组合先df -h看哪个挂载点满了再cd到对应目录用du -sh * | sort -rh | head -20直接列出占用最大的前二十个目录。sort -rh很关键它能把du输出的以K/M/G为单位的大小按人类可读的方式正确排序不然你以为的排序其实是按字母序排的会误导判断。另外强烈建议所有新人都要养成一个习惯在删文件之前先确认这个文件是否被进程占用。比如日志文件很多Java应用会一直持有日志文件的写句柄你直接rm了文件应用还在往被删除的inode写数据出现拿不到磁盘空间的结果不说连日志都断了。正确处理是cat /dev/null 文件名先把文件内容清空但不删文件句柄应用还能继续写空间也释放了。2.3 find、grep、sed、awk能不能“快准狠”就看这几个命令find命令用得最多的场景是“按名字找文件”和“按时间清理旧文件”。比如定期清理7天前的日志归档可以直接写find /var/log -name *.log -mtime 7 -exec rm {} \;。这里提醒一下-exec后面必须以\;结尾少了分号或者写错转义符号命令会直接报错。新手经常把{}和\;之间的空格漏掉这是find命令最容易翻车的地方。grep则要搭配日志分析场景来练。grep -E可以同时匹配多个关键词grep -A 5 -B 5能显示匹配行的上下文排查异常堆栈时特别好用。还有grep -v反过来过滤掉某些噪音信息。说实话看日志这事百分之五十的功夫在过滤和排除噪音上你如果不擅长用grep的组合参数排查效率会低很多。sed和awk是很多运维的短板但恰恰是它们能让你从“手动改文件”升级成“批量处理”。用sed -i做批量替换比如把配置文件里的旧IP换成新IPsed -i s/192.168.1.10/192.168.1.20/g *.conf。而awk最常用的就是按列提取信息比如从df输出里只取使用率df -h | awk {print $5}。我个人的建议是你不需要背所有参数但sed的s替换、awk的print和$NF取最后一列这几个搭配ps、netstat输出的分析场景必须要熟练。2.4 vim其实是个运维工具而不只是编辑器很多人觉得vim只是改改配置文件而已其实在服务器上排查问题时vim的很多“反人类”操作反而能救命。比如打开一个几十MB的日志文件用vim直接打开会卡半天但你用tail -n 100看一眼结尾又不够。这种情况下可以先grep -n 关键词 文件拿到关键行的行号再用vim 行号 文件直接跳到那一行效率翻几倍。另一个很实用的场景是处理Windows下传上来的脚本经常会出现\r换行符问题shell执行时报错“command not found”或者$\r: command not found。用vim打开文件执行:%s/\r//g一键搞定。还有set list可以显示隐藏字符排查空格和Tab混用问题时能看得一清二楚。Vim的dd、yy、p这些行操作虽然基础但在快速剪切和移动大段配置时比鼠标还快。3. 网络诊断telnet、ping、curl 不多但够用3.1 telnet命令的正确使用方式不只是登录设备在热词里看到“telnet命令怎么用”我觉得很多人把它简化成“远程登录工具”了。其实telnet在运维排查里最核心的用法是测试TCP端口连通性。比如你发现应用连不上数据库先别急着怀疑代码用telnet 10.0.0.5 3306试试如果连接成功说明网络层和端口是通的问题大概率在应用配置或认证如果卡住不动或者直接报Connection refused那基本就是端口没监听、防火墙拦截、或者网络根本不通问题被快速缩小到网络层排查范围立刻缩减。在排查网络时我的顺序通常是先ping测主机是否存活再telnet测目标端口是否可达接着用ss -lntp看一眼本地监听端口是否正常最后再用curl -v验证HTTP接口和响应头。很多人上来就抓包反而浪费了时间。特别是跨机房、跨网络区域访问超时的问题用 telnet 一层层跳着测能很清楚地定位到底是哪一段链路出了问题。经验补充现在很多发行版默认不安装telnet客户端也尽量不要用telnet登录设备做远程管理因为密码是明文传输的。安全做法是安装nc(netcat)做端口测试网络排查方法完全一致但数据加密和合规性都更稳。3.2 ss和netstat的对比连不上、被占用都能查netstat是老牌命令但新版系统都在推荐ss速度更快、信息更多。日常排查端口占用时我习惯用ss -lntp列出所有监听的TCP端口和对应进程-l是只看监听-n是显示数字端口不解析服务名-t只显示TCP-p显示进程名和PID。如果某个端口被占比如常见的8080端口起不来一句netstat -tlnp | grep 8080就能看到是哪个PID占用的。这里有个我踩过的坑-p参数在普通用户下看不到进程信息会显示不了PID必须配合sudo执行否则你会发现输出里没有进程列。还有一个和端口相关的高频场景是“反向代理配置好了但外部访问不到”这时候要检查的是防火墙而不是一直折腾Nginx配置。用iptables -L -n或者firewall-cmd --list-all看规则多数云服务器还涉及安全组。这个排查顺序很重要你在本地Telnet测试通了但外部访问超时问题大概率在网络边界而不是主机本身。3.3 curl的完整用法接口调试与请求排查curl的威力被很多人低估了。curl -v能看到完整的HTTP请求和响应头连SSL握手的细节都会显示排查HTTPS证书过期、域名解析不对、代理干扰等问题特别有用。curl -X POST -H Content-Type: application/json -d {key:value}可以模拟POST请求在不开启完整的接口测试工具时这是最快捷的接口联调方式。有一次我们线上服务报“414 Request-URI Too Large”我第一反应是检查Nginx配置里的large_client_header_buffers参数但为了验证是不是代理层出了问题我直接用curl -v带上一个超长Header去请求从返回结果里确认真实响应是由哪一层返回的。这个思路也可以用在排查“为什么接口响应慢”上分别用curl请求Nginx和应用端口对比耗时很快就能定位瓶颈层。curl -w还可以自定义输出时间指标比如curl -w TCP连接:%{time_connect}s 总耗时:%{time_total}s做链路耗时分析特别好用。运维做性能排查时这个技巧能帮你快速量化每一跳的耗时。3.4 git命令在运维场景中的隐藏价值热词里出现了“git命令”很多人奇怪这是开发工具运维为什么要学。实际上现在服务器的配置管理、发布脚本、K8s的YAML文件、甚至OpenStack和Kubernetes的部署完全离不开git。作为运维你至少要掌握git clone、git pull、git checkout、git log、git diff这几条。你可能会接手一个上一任留下的部署项目代码在GitLab上发布流程就是用git pull拉取某个tag然后执行构建。这种情况下你如果只会下载压缩包解压那你就没法完成接线。我自己的一个小习惯是每次上线前都会用git diff看看工作区和线上版本的差异防止“漏更新某个文件”。特别是配置文件经常会有本地改动没提交、线上拉取后配置被覆盖的问题。另外如果一次发布后服务异常git log --oneline能帮你快速确认当前线上版本对应的提交号结合二进制版本号做回滚决策这是标准的生产发布操作比靠记忆来管理版本靠谱得多。4. 进程、服务与日志排障三板斧4.1 用systemctl管理服务的正确姿势现在主流发行版都使用systemdsystemctl命令成了服务管理的核心。和传统的service命令比起来systemctl不仅能启动停止服务还能查状态、看依赖、设置开机自启。我以前遇到过一个很隐蔽的问题一个服务用systemctl start能起但重启机器后服务没起来。排查后发现是忘了执行systemctl enable这个细节在面试题里也经常出现。enable和start的区别必须记清楚start只影响当前会话重启后失效enable会把服务加入开机启动项两者通常要搭配使用。服务起不来的时候光看systemctl status还不够很多时候提示信息不完整。建议系统地去查先systemctl status 服务名看大体状态再用journalctl -u 服务名 --no-pager -n 50看最近的50行日志。journalctl是systemd自带的日志管理工具排查服务启动失败这个问题时它比/var/log/messages更直观因为它能按服务名过滤直接看到该服务的完整输出。4.2 ps和top的组合拳查到哪个进程在“吸血”top输出是运维确认系统负载的第一现场但打开top之后很多人只是看一眼就关了。这不行。我的习惯是进入top后立刻按P按CPU排序按M按内存排序来回切换先找出消耗资源的“出头鸟”。然后记住这个进程的PID用ps -fp PID看这个进程的完整启动命令和工作目录判断它是正常业务线程还是被人上传了挖矿程序。这里插一句top会默认显示很多systemd和内核线程这些一般不是问题源别被它们分散注意力。如果你觉得top的交互模式不方便在脚本里用那就用ps -aux --sort-%cpu | head -20和ps -aux --sort-%mem | head -20来拿进程快照。ps输出的STAT列很关键D表示不可中断睡眠通常在做IOZ表示僵尸进程。如果有大量Z进程你要思考是不是父进程没有处理子进程退出信号这往往是程序Bug或者启动方式不对导致的而不是简单的“kill掉就行”。另外kill一个进程也不是随手kill -9就好kill -15会先让进程优雅退出有机会保存状态kill -9是强杀处理不当可能留下残留句柄或损坏数据文件。这是很多面试官最爱挖坑的点。4.3 tail与journalctl查日志线上故障还原真相线上问题的黄金证据都在日志里。日志排查的铁律是“不改动现场先归档现场”。我用日志的思路如下如果服务是systemd管理的第一步永远是journalctl -u 服务名 --since 10分钟前 --no-pager把当前时间点之前的日志全部拉出来如果不是systemd管理就直接tail -n 200 日志文件路径。多数应用崩溃前都会在日志里留下最后的异常栈或错误码。如果日志文件太大tail会无力这时可以用less打开日志文件再按ShiftG直接跳到底部然后ShiftG后按?向上搜索关键词。热词里有“linux提权”这个在面试和真实渗透测试中常常被问到。但对运维来说更要重视的是防止权限被滥用。运维平时应该用最小权限账户操作需要root时用sudo临时提权而不是一直开着root终端。sudo -l可以查看当前用户能执行哪些特权命令sudo su -切换root时要谨慎尤其是在堡垒机上所有root操作都要有审计记录。另外可以看看/etc/sudoers文件确保某些危险命令比如vim、chmod、cp没有被错误地开放给低权限用户否则黑客即使只有一个普通账户也可能利用sudo配置不当直接提权到root。这块在面试里是最容易出现的考点也是实际运维中特别容易被忽视的隐患。5. 进阶命令与常见面试题不止于“会敲”还要“懂原理”5.1 shell的shift命令到底怎么用热词里有“shell的shift命令”想必很多人在脚本里见过但不太会用。shift的作用是让位置参数向左移动一位$2变成$1$#也相应减少。典型场景是写脚本时你想一边处理参数一边随时取剩余参数。比如你要写一个带开关项的部署脚本./deploy.sh --envprod --clean你可以在while [ $# -gt 0 ]的循环里判断$1然后使用case分支处理后执行shift把已消费的参数移除继续处理下一个。这个模式在写多参数工具脚本时非常实用比硬编码$1 $2 $3灵活得多。我当年写一键巡检脚本时就靠shift实现了可选参数的灵活解析。对比那些把参数写死在脚本里的版本shift的脚本可以复用给多个项目传不同参数就能适配不同环境。很多脚本老手进阶和面试的一道坎就在这里不光是会写命令还要会组织命令流。5.2 containerd命令与云原生运维的常见交集现在很多新项目已经开始用containerd替代docker作为容器运行时作为运维别再只会docker ps了containerd命令至少要会ctr和crictl两套。ctr是containerd的原生CLIcrictl是Kubernetes社区推荐的CRI兼容工具。平时排查节点上“镜像拉不下来”、“容器半夜被驱逐”如果不懂crictl ps -a查看容器状态、crictl logs 容器ID查看容器日志遇到K8s节点问题会寸步难行。需要注意一个点ctr和crictl的命令组织和参数风格并不完全一致。ctr images pull、ctr run和docker的对应命令比较相似但细节不同而crictl在K8s环境里更“懂”容器运行时。做云原生运维时如果只一味沿用docker命令思维容易踩坑。我的建议是先掌握crictl ps、crictl logs、crictl inspect这三个“排查三连”节点层面的绝大多数容器异常定位都能覆盖。5.3 Linux安装Python与离线安装pnpm环境准备类命令是运维日常热词里的“linux系统安装python”和“linux离线安装pnpm”背后都有一个共同需求在受限网络环境下做软件环境部署。运维在甲方机房、政务云这些网络隔离环境里几乎每天都要跟“离线安装”打交道。安装Python最常见的坑是系统自带的Python版本太老或者存在多个Python版本导致which python指向错误。我的建议是用update-alternatives管理多版本update-alternatives --install /usr/bin/python3 python3 /usr/local/bin/python3.11 1这样可以在多个Python版本之间动态切换比每次改软链接可靠得多。离线安装pnpm也是类似思路。在可以联网的机器上先npm install -g pnpm然后找到全局模块目录把整个pnpm目录连带依赖打包拷到目标机器上解压再通过软链接或PATH环境变量指过去。很多新手会尝试直接在离线机器上npm install -g pnpm结果因为网络问题卡死。记住一个原则离线部署的核心是“在联网环境准备好完整依赖包原样搬到离线环境”而不是在离线环境做在线解析。5.4 cmake执行bash命令与GCC工具链调试“cmake执行bash命令”这个热词透露了一个高频场景很多C/C项目的构建脚本里需要执行外部命令来获取参数或生成代码。CMake里可以用execute_process(COMMAND ...)来做。但这里有个坑很多人以为execute_process底层是shell其实它不是它直接执行可执行文件管道、重定向这些shell语法不一定支持。如果你要在构建时跑一段复杂的bash逻辑建议写法是把整个逻辑写进一个.sh脚本然后execute_process(COMMAND bash xxx.sh)。这个坑我当年踩过一次在CMake里写了execute_process(COMMAND echo abc | grep a)结果报出找不到|命令后来改成调用shell脚本就行了。排查这类问题时先看CMake输出的错误信息再确认是不是shell语法兼容性问题一般就能快速定位。5.5 运维常考面试题从基础命令到场景题热词里有很多“linux面试题”、“运维工程师面试题”说明大家找工作确实有需求。结合常见考点我建议重点准备以下几类文件处理类find找大文件、grep查关键词、sed替换、awk取列这类题考察你能不能快速处理文本和定位文件。进程与资源类如何查看CPU占用最高的进程、如何杀掉僵尸进程、如何判断内存是否够用、load average的意义。网络类如何测试端口通不通、如何查端口被哪个进程占用、如何查看系统监听了哪些端口。系统启动与服务类systemctl enable和start的区别、服务无法启动的排查步骤、查看日志用什么命令。安全与权限类sudo提权配置、chmod和chown的区别、如何防止sudo配置不当导致的提权漏洞。故障场景题比如“服务器负载突然高了你怎么排查”这是一个经典开放性题考察点是你的排查顺序是不是清晰、能不能把top、ps、iostat、sar联动起来。面试题不光考命令本身更考你的“思路和顺序”。你和面试官讲你平时怎么排查故障时把你真实的排查链路说出来比报菜名式的“我会用top”有用得多。6. 桌面运维与国产化系统的命令适配别给自己设限6.1 Windows命令与Linux命令的交叉思维热词里出现“桌面运维”、“桌面运维助手”、“gpedit.msc命令打不开”、“cmd命令”、“C盘清理命令”说明现在很多桌面运维的伙伴也在往Linux方向转。Windows下你有winver看版本、cmd里用ipconfig看网络、用cleanmgr清磁盘而Linux对应的是uname -a、ip addr、rm -rf配合find清理缓存。两者的逻辑是相通的都是“查看系统状态-定位问题源-执行修改”。但初学者最容易把Windows的“盘符”思维带到Linux里以为删除文件还要去对应分区找。Linux是“一切皆文件”一切都是从根目录/开始的树状结构挂载到某个目录下。桌面运维转做服务器运维时把这个思维先转过来后面命令学起来就顺了。我在处理用户报障时也经常用到ping、ipconfig /flushdns、netsh winsock reset这些Windows命令跟Linux的ip link、systemctl restart NetworkManager做对应对比两边一对照理解更深了。比如Windows的tasklist | findstr nginx对应Linux的ps aux | grep nginx是不是很像桌面运维的经验完全可以迁移到Linux运维上关键是要掌握“命令等价映射表”见多了就不慌了。6.2 国产系统与ARM架构下的命令兼容性这几年国产化替代越来越普遍热词里也有“linux国产”、“统信运维工具-livecd”。统信UOS、麒麟系统都是基于Linux内核的理论上你会的Linux命令基本都能用但细节上要小心包管理器不同有的用apt有的是yum或dnf服务管理也可能是systemd整体差别不大。真正要注意的是架构很多国产机型是ARM或龙芯LoongArch架构用uname -m确认之后拉软件包一定得选对架构apt源的失效是最常见的问题这时候要检查/etc/apt/sources.list中的源地址是否与当前系统匹配有没有配置好国内可用的镜像源。LiveCD作为系统救援盘用好了能救回不少机器。遇到系统无法启动优先用LiveCD启动挂载根分区备份数据修复/etc/fstab或grub引导文件这些操作离不开最基本的lsblk、mount、chroot这些命令。所以不管用什么发行版命令基本功扎实了就能覆盖多数国产化运维场景。6.3 运维工单与效率工具命令能力是底层的“铲子”热词里还有“设备运维工单系统设计”、“网络运维工具箱v8.4”、“it运维效率工具”、“netbox运维平台”这类方向。我个人的观点是工具和平台再高级底层还是需要会写命令、会看日志、会解析数据。你设计工单系统的时候总得要采集服务器状态吧采集状态就得靠top、df、ps这些命令你写效率工具的时候总得要跟进程、文件、网络打交道吧依然是这些命令。所以不要觉得“我以后要做平台不用学命令”。平台是你的上层建筑命令是你的地基。地基不稳上层建筑全是空中楼阁。我现在的习惯是任何一个自动化工具第一步都是先手工用命令行把流程跑通一遍再固化成脚本再对接平台。这样每一层都有据可查出了问题可以随时降级回命令行排错。很多运维事故就是“平台按钮一点全黑屏”根因就是对底层命令不熟没法直接登录机器抢救。命令能力就是你的保命技能。后记从“背命令”到“用命令”差的是一次次“救火”这几个月我又带了好几个新人发现他们最大的问题不是不努力而是“用不起来”一遇到真实故障就懵。原因其实很简单他们没有形成“命令采集信息 - 信息定位问题 - 问题指导行动”的思维模型。所以这篇实战指南想教给你的不只是命令而是这条链路。你把这套链路走熟了以后再遇到任何Linux机器上的疑难杂症都能淡定地打开终端一步步缩小范围快速恢复。我个人在实际操作中还有一个习惯想分享给自己做一份“命令速查手册”不是网上那种大而全的而是只记录自己真实用过的、踩过坑的、重要的命令和参数。每次排查完一个问题就回去更新这个文档写上“发生了什么 - 用了什么命令 - 输出怎么看 - 最终怎么解决”。坚持一年这份手册就是你的私人运维宝典。学到后面你会发现运维的底气不是背了多少命令而是你遇过多少坑并且知道怎么爬出来。Linux命令的乐趣也正是在这一次次“起死回生”的瞬间里真正上瘾的。
返回列表