
干过几年运维的人多半都有个体会Linux命令不是背出来的是趟坑趟出来的。刚入行那会儿我也抱着一本厚得像砖头的命令手册啃结果真上了生产环境遇到问题三分钟想不起该用哪条命令急得满头汗。后来才慢慢明白真正值钱的不是“知道多少条命令”而是“面对一个故障能想起哪几条命令以及怎么组合它们快速定位”。这份速查指南就是奔着这个目标来的。我把日常工作中最高频的Linux命令按场景拆开文件操作怎么用才能不翻车进程怎么看、怎么管、甚至怎么改名网络端口通不通怎么一条命令试出来磁盘告警时从哪里下手还有vim、git、history这些天天要碰的效率工具。每条命令都会解释参数背后的原理标注容易踩的坑。适合刚接触Linux的新手建立完整命令体系也适合有几年经验的工程师查漏补缺顺便应付一下面试题。文章里的命令我在CentOS、Rocky、Debian、Ubuntu上都实测过不同发行版之间差异很小可以放心参考。1. 文件与目录操作高频命令的实战用法1.1 目录导航与文件查看先看懂再动手文件操作是Linux的根基但很多人只停留在ls、cd这一步参数含义根本没搞明白。先说ls -l输出的第一行-rw-r--r-- 1 user group 2048 Jan 12 10:30 app.log开头的-rw-r--r--一共10个字符。第一个字符表示文件类型-是普通文件d是目录l是软链接。后面9个字符分成三组分别对应属主、属组、其他用户对文件的权限每组三位r读、w写、x执行。app.log这个文件的权限就是属主可读写属组和其他人只能读。权限的数字表示法在设置时更常用规则很简单r4、w2、x1。7421表示读写执行642表示读写4表示只读。所以chmod 644 app.log就是把权限设成属主读写、其他人只读。目录导航这块除了cd ..返回上级目录还有一个被很多人忽略的cd -它能直接切回上一个工作目录。我在Xshell里操作时经常在两个目录之间来回切换用cd -比反复敲完整路径省事得多。配合pwd确认当前位置基本不会迷路。查看文件内容也有一套组合拳。小文件直接cat -n带行号看大文件用less翻页阅读而且less支持/关键词搜索按n跳到下一个匹配项。查看日志最常用的是tail -f app.log实时跟踪新写入的内容只想看最后100行就tail -100。如果要看文件中间某段sed -n 50,80p app.log能精确打印第50到80行这在排查日志时非常好用。1.2 文件查找find和grep组合起来才是无敌排查问题最耗时的往往不是看文件而是找文件。find是Linux下最强的查找工具基本格式是find 路径 条件。举几个实测高频用法find /var/log -name *.log -mtime -7 # 7天内修改过的日志文件 find /opt -type f -size 500M # 大于500MB的普通文件 find / -type f -name *.conf -exec grep -l timeout {} \;第三条要重点说。-exec ... {} \;的意思是把查到的每个文件依次传给后面的命令处理{}代表当前文件路径。这里用grep -l找出包含timeout关键字的配置文件-l只输出文件名避免刷屏。实际工作中排查某个服务读取了哪个配置文件、某段配置在哪些文件里出现过这条命令基本一把梭。find和grep组合也是老运维的常规操作。grep带-r递归搜索目录中的内容grep -rn Connection refused /opt/app/logs/ --include*.log-r递归、-n显示行号--include把搜索范围限定在.log文件里。如果没有这条限制grep会把日志目录里的二进制文件也扫一遍又慢又容易乱码。还有个细节find的-name匹配是区分大小写的想忽略大小写用-iname。文件查找时-mtime按修改时间、-size按大小、-type f/d/l文件类型这三个条件最常用多条件可以叠加用-o表示或但实际场景中宁可多跑几次find也不要写太复杂的表达式出了错反而更难排查。1.3 删除与移动的保命操作删除文件是Linux里事故率最高的操作没有之一。rm -rf用顺手了一个不小心就把不该删的东西带走了。我见过的真实事故包括在/usr目录下执行rm -rf ./把整台机器的系统文件清掉以及rm -rf /opt/app/和rm -rf /opt/app/*只差一个斜杠删的范围完全不同。先说几个保命习惯。第一执行rm之前先把路径echo出来确认一遍比如echo /opt/app/log/*.log看清楚通配符展开后匹配了哪些文件。第二给rm设置别名在~/.bashrc里加一行alias rmrm -i-i参数让每次删除前都提问确认。虽然会稍微慢一点但在生产环境里这种“慢”是值得的。第三如果不确定某个文件还要不要用mv移动到临时目录而不是直接删mv app.log /tmp/trash/ # 先挪走确认没问题再清mv看起来简单也有一个坑同一分区内的移动是纯改名操作瞬间完成跨分区的移动实际上是“复制到目标位置再删除源文件”如果磁盘空间不足移动会失败而且源文件还在。移动大文件时要先确认目标分区剩余空间命令前加一句df -h是基本素养。find也可以配合删除比如清理7天前的临时文件find /tmp -type f -mtime 7 -delete但-delete要谨慎使用建议先用不带-delete的版本看一遍匹配结果确认无误再加。我自己的习惯是删除大范围文件之前先用find ... -exec ls -lh {} \;列出文件大小和路径确认批量删对了再动手。2. 进程与系统管理从查看明白到干预有度2.1 ps与top先看懂进程状态再谈管理进程管理最常用的两条命令是ps和top。ps aux输出每一列的含义分别是用户、PID、CPU占用率、内存占用率、虚拟内存大小、驻留内存大小、终端、状态、启动时间、CPU时间、命令。排查消耗资源的进程时重点看CPU列和内存列用sort把结果排个序会更直观ps aux --sort-%cpu | head -10 # 按CPU占用排序取前10 ps aux --sort-%mem | head -10 # 按内存占用排序取前10ps输出里的STAT列代表进程状态这个是面试和排障都会遇到的知识点。常见状态有这几类状态含义说明RRunning正在运行或可运行占用CPUSSleeping可中断睡眠等待某个事件触发DUninterruptible Sleep不可中断睡眠多半在等待磁盘IO状态卡在这里时用kill -9也杀不掉TStopped被停止常见于CtrlZ挂起的任务ZZombie僵尸进程子进程已结束但父进程还没回收它D状态是运维排障的重点对象。系统负载看起来很高但CPU占用并没有多少用top一看大量进程处于D状态基本可以判断是磁盘IO问题比如存储设备响应慢或者NFS挂载点卡住了。这时候不要盲目kill -9应该先处理存储或网络问题让卡住的IO恢复进程状态自然会变回R或S。top进入界面后按P按CPU使用率排序、按M按内存排序、按k可以输入PID杀进程、按q退出。这些都是基本操作但很多人不知道top也支持按线程查看按H切换线程视图。排查Java应用CPU飙高时线程视图能直接看到是哪个线程在疯狂占CPU再配合jstack导出线程栈就能定位到具体代码。2.2 杀进程与修改进程名字干预要有分寸杀进程也是有分寸讲究的。kill后面跟的是信号编号不同信号的效果差别很大信号编号行为SIGTERM15默认信号请求进程自行退出可以参与清理资源SIGKILL9强制杀死进程没有机会清理最后手段SIGHUP1重新加载配置常用于让nginx、sshd等进程读取新配置SIGINT2相当于CtrlC中断前台进程绝大多数情况下先发kill PID也就是SIGTERM给进程一个自行清理退出环境的机会。只有进程没响应或者已经卡死时才kill -9。强行kill -9数据库、消息队列这类有状态服务可能导致数据文件损坏这个代价太高了。修改进程名称是个比较冷门但有实战价值的需求。用exec -a可以在启动时给进程指定一个别名exec -a report_worker python3 /opt/tasks/run_report.pyps看到的进程名就会是report_worker而不是python3。这样做的意义在于进程管理更清晰比如一台机器上跑了好几个Python脚本用默认的进程名根本区分不出来谁是谁给每个脚本起个有业务含义的名字排障时一眼就能认出来。Java应用也常用这招启动脚本的最后一行exec -a app_name java -jar xxx.jar比费劲改ps显示的进程名简单得多。还有一套后台运行的组合技需要掌握。nohup command 让命令忽略挂断信号并转入后台运行输出默认写到nohup.out。setsid command更彻底让进程脱离当前会话即使关闭终端也不会被干掉。写脚本部署服务时我用nohup多一些因为它简单直接日志也好找。2.3 history命令详解查得到、记得久、防泄露history是每个用Linux的人天天都在接触但又很少研究透的命令。默认情况下命令历史存到~/.bash_history文件里退出终端时才写入。几个实用参数必须知道history 20 # 查看最近20条历史命令 !1024 # 重新执行编号为1024的历史命令 !! # 重新执行上一条命令 !vim # 执行最近一条以vim开头的命令CtrlR是交互式的历史搜索输入关键词会实时匹配最近执行过的命令。这个操作在操作长命令时是效率神器比如执行过一次很复杂的find下次用到时敲CtrlR再输入find就能把它调出来不用重新敲一遍。很多人遇到的问题是history看不到时间戳。加上环境变量就能解决export HISTTIMEFORMAT%F %T 在~/.bashrc里加上这一行以后history输出的每一行都会显示日期和时间排查“这个命令是谁在什么时间执行的”非常有用。还需要配置两个参数HISTSIZE控制内存中保留多少条历史HISTFILESIZE控制历史文件里保留多少条默认都只有一两千建议调大HISTSIZE10000 HISTFILESIZE20000关于安全还有两个细节。一是HISTCONTROLignorespace可以忽略以空格开头的命令如果有些命令不想被记录在命令前先敲个空格再输入就行。二是生产环境为了审计需要可以把历史命令实时输出到日志文件里通过配置PROMPT_COMMAND把每次执行的命令追加写入指定文件这样即使有人清空了~/.bash_history审计日志里还能找到痕迹。3. 网络排查与配置一条命令定位故障3.1 端口连通性排查telnet不是唯一选择排查网络问题第一步往往是确认端口通不通。很多老教程会告诉你用telnet比如telnet 192.168.1.100 3306如果端口通会看到Connected to 192.168.1.100的提示然后按Ctrl]进入telnet命令模式输入quit退出。如果端口不通一般会显示Connection refused或者卡住超时。做技术面试时我经常拿这个考察候选人对网络排查的理解。但现在很多系统默认不装telnet因为它本身是明文协议出于安全考虑被逐渐淘汰。替代方案有好几个实际使用中我按场景选择nc -zv -w 3 192.168.1.100 3306 # z表示扫描模式v显示详细信息w超时3秒 timeout 3 bash -c echo /dev/tcp/192.168.1.100/3306 echo open || echo closed第二条用到了Bash内置的/dev/tcp特性不需要额外安装任何工具在任何Linux系统上都能用。timeout给探测加一个3秒超时限制避免卡住整个终端。平时写脚本批量检查多台机器的端口时我用这个方式最多。ss是查看本机端口监听状态的现代工具替代老旧的netstat。格式上ss -lntp的意思是-l只看监听中的端口-n不做域名解析-t只看TCP-p显示占用进程。输出里如果某个端口对应进程显示为-通常是权限不够加个sudo再试。检查一个端口有没有服务在监听首选就是ss -lntp | grep :8080比netstat快且输出更清晰。3.2 网络状态与路由排查从细节里找答案端口通了不代表网络没问题。ping用ICMP协议探测主机可达性-c指定发送次数、-W指定超时时间ping -c 4 -W 2 192.168.1.100输出里的time就是往返延迟单位毫秒。如果丢包率不是0说明网络有抖动需要继续往下查。但要注意很多服务器会屏蔽ICMPping不通不代表端口不通还是要用TCP层的探测来确认。traceroute -n可以查看数据包从本机到目标主机的每一跳路径-n不做反向DNS解析速度更快。如果某一跳显示* * *通常是那台路由器不响应ICMP或者有防火墙策略并不能直接判断断点就在那里。相比之下mtr是把ping和traceroute结合起来持续探测输出更直观是判断网络路径质量的好工具。排查DNS问题最常用的是digdig short example.com能直接看到解析结果。如果解析不到再查系统配置cat /etc/resolv.conf确认DNS服务器地址是否正确。curl -v则是排查HTTP接口的利器-v显示完整的请求头和响应头-I只发HEAD请求看响应头加上-o /dev/null丢弃响应体curl -I -v -o /dev/null -w connect:%{time_connect} total:%{time_total}\n https://example.com这里的-w自定义输出能打印出TCP建连时间和总耗时。如果time_connect很大而time_total不大往往是网络路径问题如果time_connect很小但time_total很大问题多半在应用层服务处理请求太慢。3.3 本机网络配置ip与nmcli的现代用法配置本机IP这件事老一代的ifconfig和编辑配置文件的方式现在逐渐被ip命令和nmcli取代了。查看地址和路由用ip addr show ip route showip命令的输出比ifconfig更清晰地址、掩码、状态一目了然。临时启停网卡用ip link set eth0 up/down但要注意这个操作会断开当前SSH连接执行后如果网卡起不来就麻烦了生产环境操作前一定要确认有带外管理渠道。nmcli是NetworkManager的命令行管理工具在Rocky、CentOS、Fedora这些发行版上是配置网络的推荐方式。查看当前网络状态nmcli device status nmcli connection show给一块网卡配置静态IP核心命令是nmcli connection modify几个关键参数nmcli connection modify eth0 \ ipv4.method manual \ ipv4.addresses 192.168.1.100/24 \ ipv4.gateway 192.168.1.1 \ ipv4.dns 223.5.5.5 8.8.8.8 nmcli connection up eth0ipv4.method manual表示使用手动配置的静态地址ipv4.addresses里包含了IP和前缀长度。修改完用nmcli connection up eth0让配置生效然后用ip addr show eth0验证是否正确。这套操作比手工编辑网络配置文件的方式更不容易出错而且改了之后NetworkManager会自动处理连接状态。4. 磁盘与存储管理空间告警时的生存指南4.1 空间排查第一课df看趋势du查细节磁盘告警是运维值班的家常便饭。处理的第一步是df -h看整体情况-h参数把容量、已用、可用都显示成人类可读的G和Mdf -h输出里有Filesystem、Size、Used、Avail、Use%、Mounted on这几列。大多数时候是某个挂载点使用率到90%以上了接下来就用du一层一层往下查。du -sh查看当前目录下每个子目录各自占用了多少空间-s不显示子目录里的明细-h人类可读du -sh /var/* 2/dev/null | sort -rh | head -202/dev/null把没有权限的目录报错信息丢弃掉sort -rh按大小从大到小排列然后取前20个。这套组合拳能迅速找到“哪个目录占了大头”然后再往这个目录深入一层继续查直到定位到具体的日志文件或者临时文件。还有一个必须掌握的坑inode耗尽。df -h显示还有几十G空间但创建文件时报No space left on device这种情况极可能是inode用完了。确认方法df -iIUsed和IFree两列能看到inode使用情况。inode是文件系统用来记录文件元信息的索引节点每个文件或目录都要占用一个。如果机器上存在海量小文件比如邮件队列、临时文件、Docker容器产生的垃圾文件几十万个文件就能把inode耗尽。解决办法是找到这些文件并清理配合find /opt -type f | wc -l统计文件数量基本能定位问题目录。4.2 挂载NAS存储NFS与SMB里最常用的几行挂载网络存储是运维里很常见的需求需求最多的就是NFS和SMB/CIFS两种协议。挂载NFS之前确保装了客户端工具CentOS/Rocky系用yum install -y nfs-utilsDebian/Ubuntu用apt install -y nfs-common。然后执行mount -t nfs -o vers4,soft,timeo50,retry1 192.168.1.10:/data /mnt/nas-o后面几个参数值得展开说。vers4指定NFS协议版本NFSv3在某些场景下有文件锁问题指定v4更省心。soft表示软挂载访问超时后返回错误而不是一直卡住。timeo50是超时时间设置为5秒单位是0.1秒retry1是重试一次。这里强烈建议使用soft而不是默认的hard模式hard挂载在NAS宕机时会让访问该目录的进程卡死在不可中断的D状态连kill -9都杀不掉只能重启机器。我踩过这个坑后生产环境的NFS挂载一律用soft并明确超时参数。卸载时如果提示target is busy说明还有进程在用这个目录用lsof d /mnt/nas找出占用进程处理完再umount /mnt/nas。实在不行可以用umount -l做懒惰卸载但那是无奈之举。开机自动挂载要写在/etc/fstab里NFS的条目格式类似192.168.1.10:/data /mnt/nas nfs _netdev,vers4,soft,timeo50 0 0_netdev很重要它告诉系统这个挂载点依赖网络开机时在网络就绪之后再挂载。如果不加系统启动时网络还没起来就尝试挂载NFS可能会卡住启动流程。写完fstab后用mount -a验证语法是否正确确认无误再重启。SMB/CIFS挂载Windows共享也是类似思路需要先装cifs-utilsmount -t cifs -o usernameshareuser,passwordxxxx,vers3.0 //192.168.1.10/share /mnt/win注意vers3.0老版本SMB1在安全性上有较多争议Windows默认也禁用了指定3.0以上版本更稳妥。4.3 日志与缓存清理容量告警后的快速止血定位到大目录之后下一步就是清理。日志文件是最常见的“空间杀手”journald系统日志默认最多能占几十G。查看和压缩清理方式journalctl --disk-usage # 查看日志占多少空间 journalctl --vacuum-size200M # 清理日志保留最新200M journalctl --vacuum-time7d # 清理7天前的日志这两个--vacuum参数非常实用执行完立刻释放空间比手动删除/var/log/journal/*安全得多journald会自己管理索引。应用自己的日志可以用logrotate做轮转配置文件在/etc/logrotate.d/下。一个典型的配置是这样的/opt/app/logs/*.log { daily rotate 7 compress missingok notifempty copytruncate }含义是每天轮转一次、保留7份、压缩旧日志、缺失不报错、空文件不轮转、用copytruncate复制后清空原文件。这里copytruncate对应用来说是侵入最小的方案不需要重启进程就能轮转日志。清理包管理器的缓存也能腾出空间yum clean all dnf clean all最后还要检查一种隐蔽情况文件被删除但进程还占用着。df -h空间一直不见少但du -sh *加总起来远小于df显示的已用量大概率是某个进程仍然持有已删除文件的句柄。用lsof L1列出这类文件就能定位到对应的进程重启这个进程后空间就释放了。5. 命令行效率提升编辑、版本控制与脚本三板斧5.1 vim只记这十几个操作就够日常用很多新手对vim的第一印象是“进去就出不来”说到底是用错了方法。vim的核心是模式切换默认在命令模式按键不输入内容而是执行操作按i进入插入模式打字按Esc回命令模式。日常用到的操作没那么多下面这张表是我自己整理的高频操作操作按键场景保存退出:wq编辑完成不保存退出:q!改坏了或误打开跳到指定行:50快速定位日志第50行搜索/error然后n/N在文件里找关键词全局替换:%s/old/new/g把所有old替换成new删除一行dd删掉当前行撤销u误操作回退复制粘贴行yy然后p快速复制一行跳到文件头/尾gg和G翻看大文件首尾显示行号:set nu对照日志行号排障取消搜索高亮:noh搜索完恢复界面搜索之后界面上所有匹配项都亮着看着很碍眼:noh关闭高亮。全局替换里的s是substitute替换的缩写g表示对每一行中的所有匹配都替换不加g只替换每行第一个匹配。新手上手建议先运行一下vimtutor这是系统自带的教学程序二十分钟能过一遍基础操作。不需要去记那些高级的Ex命令先把表里这十几个操作练熟日常编辑配置文件就完全够用了。5.2 git高频命令覆盖日常开发与运维场景Git不只是程序员的事运维脚本、配置文件、文档都需要版本管理。最基础也最常用的流程是这几条git init # 在目录里初始化仓库 git status # 看当前改动状态 git add . # 把所有变动加入暂存区 git commit -m update config # 提交本次改动 git log --oneline -10 # 查看最近10次提交改错了要回滚这里要分清git reset的两种模式。git reset --soft HEAD~1把最后一次提交撤销但改动保留在工作区git reset --hard HEAD~1则把改动彻底丢弃。日常编辑配置时我更推荐在提交前用git diff看清楚自己要提交了什么确认改动合理再commit。如果只是某个文件改坏了想恢复到最近一次提交的状态git checkout -- nginx.conf这条命令会用仓库里的版本覆盖当前文件等于一键还原。分支操作在多人协作场景常用git branch -a # 查看所有分支 git checkout -b feature/2025 # 新建并切换到新分支 git merge feature/2025 # 把新分支合并到当前分支在服务器上直接部署代码的场景里我会先git stash把本地未提交的改动暂存起来拉取最新代码再git stash pop恢复自己的改动。这样既能保持本地补丁不丢又能跟上远端更新。5.3 别名与shell脚本让常用命令一步到位效率提升最快的方式是给高频命令设置别名。alias的格式很简单alias llls -lh --colorauto alias grepgrep --colorauto alias dfdf -h alias freefree -m但要注意alias命令只在当前终端有效退出就没了。要永久生效把这些行写进~/.bashrc然后source ~/.bashrc加载。很多人问为什么自己设置的别名重启后不见了多半就是没写进~/.bashrc。写shell脚本是运维的必备技能。一个脚本的结构很固定开头指定解释器主体就是一系列命令。开发一个批量检查端口连通性的小脚本#!/bin/bash for ip in 192.168.1.10 192.168.1.11 192.168.1.12; do if timeout 2 bash -c echo /dev/tcp/$ip/22 2/dev/null; then echo $ip:22 open else echo $ip:22 closed fi done给脚本执行权限后就能运行chmod x check_port.sh ./check_port.sh。脚本里的$ip是循环变量if判断命令是否执行成功。这套模板可以举一反三换成不同的IP和端口或者从文件里读取IP列表就是一个实用的巡检工具。变量赋值的细节容易踩坑。ip192.168.1.10是正确的等号两边不能有空格否则会被当成命令。取变量结果用$(命令)比如today$(date %F)在日志文件名里自动带日期。6. 高频问题与排障技巧速查日常遇到的问题往往是命令没写错而是环境、权限、依赖这些外部因素在捣乱。下面这张速查表是我根据高频故障场景整理的现象定位思路关键命令命令找不到检查PATH路径和是否安装对应软件包echo $PATH、which 命令、yum list installed 包名文件删不掉查看文件权限、不可变属性、占用进程ls -l、lsattr、lsof 文件job无法运行查看后台日志、资源限制、磁盘空间nohup.out、ulimit -a、df -h端口不通按层次排查本机监听、防火墙、网络路径ss -lntp、firewall-cmd --list-all、traceroute -nhistory没记录检查HISTFILE是否生效、是否用了空格前缀echo $HISTFILE、echo $HISTSIZE挂载失败查看内核日志、检查挂载点和协议版本dmesg磁盘有空间但写不进查inode使用率、进程占用已删文件df -i、lsof L1sudo无法使用检查sudoers配置、用户是否在wheel组sudo -l、groups 用户名遇到不熟悉的报错信息第一反应是读报错本身而不是直接搜大而全的命令。比如挂载失败时dmesg | tail能直接看到内核给出的原因是协议不匹配还是认证失败这比盲目换挂载参数更高效。再分享两个排障习惯。第一生产环境的操作前要留后路修改配置前先备份原文件删除文件前先移动到临时目录而不是直接清掉。第二一条命令执行失败了先把输出重定向到文件再仔细看不要在屏幕上匆匆扫一眼就略过。命令 /tmp/debug.log 21这个习惯能帮你少踩很多坑。排查慢问题时还可以用time命令测量实际耗时比如time curl -I https://example.com对比不同环境下的表现差距。最后说点我自己的体会。Linux命令这块我的建议是“先懂原理再用参数”——不要死记ss -lntp几个字母而是知道l是listen、n是不要解析域名、t是TCP、p是进程这样遇到新命令也能举一反三。真不确定的陌生命令先man再动手宁可在测试环境多试几遍也不要直接在生产上赌一把。把常用命令按场景整理成自己的速查笔记比收藏几十篇大而全的文章更有实际价值。