Linux实用排查指南:从文件权限到日志分析的命令思维

发布时间:2026/10/13 13:08:54
Linux实用排查指南:从文件权限到日志分析的命令思维 你打开任何一本Linux书都会先看到一段历史上个世纪七十年代某个芬兰大学生写了一个操作系统内核然后全世界的极客开始往里面添砖加瓦。这段历史确实很酷但说实话它和你能不能把一个服务跑起来、能不能把一个线上故障查清楚关系真不大。我更愿意把你直接拉到终端面前先敲起来再说。这篇东西不打算给你列一张“必背命令大全”。那玩意儿网上到处都是你收藏了也不会看第二遍。我想做的是帮你建立一套Linux下的思维方式拿到一台机器、遇到一个问题你该先看哪儿、再查哪儿、最后怎么收尾。文章覆盖了文件权限、系统状态查看、进程与日志排查、文本处理、常见故障处理这几个最常被问到的主战场。适合两类人——刚接触Linux想找一条正路的新手以及用了几周还是见到报错就发懵、只会到处复制粘贴命令的初学者。你不需要一次性读完收藏起来遇到问题按着索引来找就行。1. 别急着背命令先想清楚你学Linux到底要干什么1.1 拆开Linux这层壳所谓系统其实就三样东西很多人一提到Linux就联想到“黑客敲代码”的画面其实日常使用中你接触的只是很小一个面。抛开内核那些复杂机制你真正要面对的无非三样文件系统、进程、权限模型。文件系统不玄乎它就是一棵倒挂的树。所有东西都挂在/下面/etc放配置/var放日志/home放用户数据/tmp放临时文件。这套目录结构在哪个发行版上都基本一致搞懂它你就不会出现“文件明明存在但不知道它在哪”的困惑。进程就是你机器上跑着的程序是那个占CPU、占内存的东西。你在任意一台Linux机器上敲ps aux会看到一长串列表那就是这台机器此刻的“活物”。很多所谓“系统坏了”本质上是某个进程出了问题比如CPU被打满、内存被吃光、端口被独占。权限模型决定了谁能碰谁的东西。Linux是一个多用户系统不像个人电脑只有一个主人。它靠一套“谁对哪个文件有什么权利”的规则来维持秩序。你以后报错十有八九逃不开Permission denied就是这套规则在起作用。理解三层之后Linux在你眼里就不再是一团乱麻而是一家运转的公司文件是资产进程是员工权限是门禁卡。排查问题就是去看哪个员工不干活了、哪个门禁卡失效了。1.2 按使用目标选择学习深度别一开始就想着啃内核很多新手学Linux半途而废最大的原因是目标定错了。有人连命令都没敲熟就跑去读内核源码、看内存管理。这不是努力这是给自己挖坑。我建议你先按目标分类确定自己属于哪条路线路线方向你需要掌握的核心内容需要深入的程度把Linux当日常桌面用文件管理、软件安装、网络配置、界面操作会点命令行更好但不用深究运维/后端开发方向命令行、脚本、进程管理、日志分析、网络排查必须熟练掌握这是吃饭的家伙开发环境日常使用Git操作、编辑器、编译构建、服务起停至少能在这个环境里写代码跑项目内核/驱动/嵌入式方向系统调用、内核编译、驱动开发、调试工具需要长期深入但不适合零基础起步选定方向后你的精力分配完全不同。如果你只是想日常用一用那不必背那些花哨的管道组合命令但如果你指望靠Linux吃饭文本处理、日志排查、性能分析这些躲都躲不掉。我见过太多开发新人一上来就装了个Arch Linux折腾了两周桌面环境最后连grep都不熟。工具永远是服务于目标的先定方向再谈学习。1.3 实验环境本地虚拟机、WSL还是云服务器选实验环境也是劝退重灾区。有人听说“Linux是服务器系统”直接买了一台云服务器结果连SSH都不明白在网页终端里瞎操作心态秒崩。新手我首先推荐本地虚拟机。装一个VirtualBox或VMware Workstation在里面跑一个Ubuntu Desktop或Linux Mint操作错了拍了个快照一键回滚没有任何损失。虚拟机的好处是你可以毫无心理负担地乱搞乱搞才是学习Linux的正确姿势。如果你主力机是WindowsWSLWindows Subsystem for Linux也是个不错的选择。它启动快、资源占用小日常命令行体验和真机几乎一致。但WSL缺少完整的系统初始化流程systemd、内核模块这些在WSL里体验不完整跑服务做实验还是差点意思。如果你已经有点基础了想学服务器运维那再咬牙买一台云服务器不迟。选配置的时候别贪便宜选最低配1核2G是底线否则跑两个服务就卡到怀疑人生。发行版的选择上新手从Debian或Ubuntu系入手最踏实。CentOS/Rocky系更适合以后走企业运维路线的人不过CentOS已经停止维护了现在更多推荐Rocky Linux或AlmaLinux。Arch属于进阶玩具不建议零基础碰。提示学习Linux最重要的前提不是环境多好而是你有一个“搞坏了不心疼”的实验场。没有这个前提你永远不敢动手不敢动手就永远学不会。2. 文件与权限操作上手的第一个主战场2.1 路径、目录结构与常用查看命令先学会“找东西”我见过不少新手的第一个迷茫点明明文件就在服务器上但他不知道自己在哪个目录也找不到文件在哪个目录。先记住两句话。一是pwd永远能告诉你当前在哪二是绝对路径以斜杠开头相对路径不以斜杠开头。cd /var/log是从根目录定位不管你人在哪都能到cd ../nginx是相对于当前目录上跳一级再进去。这两者的区别用导航类比最好懂绝对路径是“你在北京市朝阳区某街道某号”相对路径是“从你现在站的位置向前走50米右转”。日常看文件ls是基础。ls -l能看权限、属主、大小、修改时间ls -lh则是以人类友好格式显示大小能看到K、M、G而不是一串字节数。我习惯ls -lh你也会慢慢形成自己的习惯。查磁盘占用是运维里特别高频的操作。df -h看的是整个分区还剩多少空间du -sh看的是当前目录总共多大。有个实用技巧想知道“到底谁把磁盘吃满了”去根目录执行sudo du -sh --max-depth1 /* 2/dev/null | sort -h一行命令就能按大小排序列出各目录占用一眼定位元凶。这个命令我实战用过不下十次值得你抄下来。cat看小文件还行看大日志就别用它了一屏被刷得全是字节。此时用less进去之后按/搜索关键字、按q退出。我一直觉得学会用less才算脱离了“Windows思维”。2.2 权限模型没那么复杂rwx数字一推就懂“Permission denied”应该是Linux新手遇到最多的报错。这一切要从权限模型的三个角色说起。每个文件有三个权限位组属主、属组、其他人。每组用三个字母表示r可读、w可写、x可执行。数字表示法只是把这三组字母压成三个数字r4、w2、x1相加得出一个数字。比如rwxr-xr-x就是属主是4217属组是4015其他是4015合成755。这串推理不用背用多了自然记得。常用权限值就几个755是可执行文件的标准配置644是普通文件的默认配置600是私密文件配置777是“人人可读写执行”的危险配置给执行权限时你应该下意识警惕。改权限用chmodchmod 755 script.sh是直接指定chmod x script.sh是在原有基础上加执行权限。改属主用chown比如把目录交给某个用户chown -R www:www /var/www。-R表示递归不改的话只影响目录本身里面文件不变这个细节坑过不少人。我遇到过一个真实场景某同事写了个部署脚本直接chmod -R 777 /想给所有文件加权限结果整个服务器所有文件都可写差点造成严重安全问题。所以记住-R要慎用777更要慎用。2.3 用find精准定位文件别再一层层cd翻目录你不会想知道我是花了多少个下午才彻底抛弃了一层层cd进目录找文件的习惯。学会find之后找文件效率提升一个量级。基础用法是find /指定目录 -name 文件名。-name支持通配符比如find /home -name *.log找出所有日志文件。-type可以限定类型find / -type d -name nginx只找目录find / -type f -size 100M找大于100MB的文件。几个很实用的组合find /data -mtime -7七天内改动过的文件。排查“到底谁动过系统”时好用。find / -type f -perm -4000找所有带SUID高危位的文件安全体检常用。find . -name *.log -mtime 30 -delete把30天前的日志删掉。这条要非常谨慎-delete一旦加上就没有后悔药。这里必须强调一个坑find直接配-exec批量处理很多人会写错。正确写法是find . -name *.tmp -exec rm {} \;分号和花括号不能漏。但更稳妥的做法是先不加任何处理操作只用-name等条件把结果列出来确认无误之后再加删除或移动避免一个路径写错把重要文件误删。3. 系统状态、进程与日志从上手到能救火3.1 先用三句话描述一台机器的现状负载、内存、磁盘拿到一台新服务器或者线上机器出问题了第一个念头不应该是“重启”而应该是“看状态”。状态怎么看先搞三件事负载、内存、磁盘。负载用uptime看。它会输出一段话最后三个数字分别是1分钟、5分钟、15分钟的平均负载。新手容易误以为负载超过1就危险其实负载是相对CPU核数而言的4核机器负载4和单核机器负载4含义完全不同。如果15分钟负载一直比核数高说明机器已经持续过载了。内存再看free -h。重点不是看used那一栏而是看available这才是系统真正可用的内存。Linux喜欢把空闲内存拿去做缓存cache所以在top里看内存占用80%不代表内存不够只要available充足就别慌。磁盘则是df -h看根分区是否告急。再加一句df -h显示的是分区使用率du -sh看的是目录实际占用。两者配合才能定位“哪个分区满了”和“什么东西占满了”。这三板斧看完你对机器的健康状况就有了七成把握。往上进阶就是vmstat、iostat、sar这些工具但新手先把这三个命令用熟已经能处理九成的日常问题。3.2 ps和kill找到、理解、结束那个“不听话的进程”ps是进程查看的神器top是它的动态版。日常排查我几乎都用ps aux它列出所有进程同时输出CPU、内存占用率、进程状态、启动命令信息很全。想找某个具体进程就接管道ps aux | grep nginx一刻钟就能找到目标。拿到PID之后下一步往往是“干掉它”。kill PID默认发的是SIGTERM相当于礼貌地问进程“你能不能自己收拾一下退出”有些进程不响应就得kill -9 PID发SIGKILL内核直接把它带走。理解这两者的差别比背多少个信号值都重要。但我更想强调的一点是不要看见进程就杀。排查思路应该先问“它是什么”再看“它该不该存在”。有一次我帮别人查一台机器负载飙高top里看到一个叫 kswapd0 的进程占了很多CPU他以为是挖矿程序想杀掉。其实 kswapd0 是内核的交换进程它忙是因为内存严重不足在疯狂换页。根本原因是内存不够而不是这个进程有问题。你把进程杀了系统该崩还是崩。先看根因再对进程下手。检查端口也是高频操作。现在系统多推荐ss而不是netstatss -lntp能列出所有监听中的端口和对应的进程名。-l只显示监听状态、-n不做域名解析、-t只看TCP、-p显示进程信息。新手八成的端口冲突问题这一条命令都能查出来。3.3 日志是你最重要的“案发现场”很多新手出事之后的第一反应是去网上搜报错却忘了最有效的第一手信息就在自己机器上。Linux的日志体系就是为排查设计的。传统路径集中在/var/logsyslog或messages是系统全量日志secure或auth.log记登录和认证dmesg记内核日志。新系统普遍用journalctl这套统一收集体系journalctl -u nginx只看nginx服务自己的日志journalctl -f像tail -f一样实时追踪journalctl --since 1 hour ago只看最近一小时。日志排查有个关键思路先看时间。报错发生在几点日志就在那个时间点附近。别从文件开头慢慢读直接tail -n 100或grep -i error聚焦到具体时段效率完全不一样。我分享一个真实案例。某台机器上有个服务经常半夜挂掉大家一开始怀疑是某个脚本的问题查了半天没头绪。后来打开journalctl -k看内核日志发现凌晨三点出现了OOMOut Of Memory记录系统把它给杀了。真正的根因是另一个常驻进程内存泄漏把内存吃光系统迫不得已选了“祭天”。如果只看服务日志你永远找不到这个原因。日志系统性排查是运维成长的分水岭。4. 文本处理三剑客把日志分析的活交给命令去干4.1 grep搜索界的瑞士军刀但别滥用如果Linux只能留下一条命令我大概率会留grep。它就是文本搜索grep error app.log把包含error的行全部打出来。参数就那几个但组合起来千变万化grep -r 关键字 /etc递归搜索整个目录找配置特别方便。grep -i忽略大小写搜root时能连ROOT、Root一起命中。grep -n显示行号让你知道匹配在第几行写脚本改文件时很关键。grep -C 3把匹配行的前3行和后3行一起打出来看上下文用。管道是grep的灵魂ps aux | grep java、cat access.log | grep 404 | head前一个命令的输出成为后一个的输入组合出无限可能性。但用多了会发现grep也有坑。第首位就是在日志目录里直接grep -r xx .会把日志文件当成普通文本读一遍文件很大时机器直接卡死。更专业的做法是用zgrep直接查压缩过的日志.gz或者先用find限定文件范围再grep。还有一个脚本层面常常踩的坑grep没有匹配到内容时返回码是1不是0。初学者在shell脚本里写if grep -q xxx file; then倒是对的但如果不加-q且忘了处理退出码脚本的逻辑就会错乱。记住一件事任何命令都有退出码0表示成功非0表示失败管道永远只看最后一个命令的退出码。4.2 sed做替换前先让它“打印一遍”给你看grep是找行sed是改行。很多人觉得sed难其实日常就三个场景替换、删除、打印。替换是sed的老本行经典格式是sed s/旧内容/新内容/。默认只替换每一行的第一个匹配项想全部换就加后缀sed s/old/new/g。这时要注意内容里如果有斜杠你得换分隔符比如路径替换可以写sed s#/usr/local#/opt#g用井号替代斜杠可读性立刻提升。实战里最常用的场景是批量改配置把一批文件里的某个IP都换成新IP。比如sed -i s/192.168.1.10/192.168.1.20/g config/*.conf。-i是直接写回原文件危险就在这。我给一条铁律任何带-i的sed第一次执行时一定先去掉-i跑一遍确认输出是对的再正式执行。或者执行时带上备份后缀sed -i.bak s/old/new/g file这样原文件会备份成 file.bak。我吃过亏——有一次写错正则一条命令把几百行配置文件全改乱了最后靠着 .bak 救了回来。这个习惯能保命。sed还能按行号操作sed -n 20,40p file只打印20到40行sed 10d file删除第10行sed 5,15d删一批。掌握这三个用法去网上搜任何sed教程你都不会太吃亏。4.3 awk按列思考几个常用模式就够了awk是三剑客里最“重”的一个很多人一看到这种言行就退却了。其实日常运维你并不需要成为一个awk专家只需要会按列提取、条件判断、简单统计。awk默认按空白符空格或Tab把一行拆成多个字段$1是第一列$2是第二列$0是整行。最简单的用法awk {print $1}取每行第一列。配合管道它就是处理命令输出格式的神器。举一个典型的例子df -h | awk {print $5}直接打印出每个分区的使用率百分比。ps aux | grep java | awk {print $2}提取出相关进程的PID。这样“把一大坨输出变成一行数字”的能力写脚本时特别好使。awk还有条件过滤功能awk {if ($5 80) print $0}只打印使用率超过80%的行这在监控脚本里太常用了。awk的终极神器是数组awk {count[$1]} END {for (k in count) print k, count[k]}按第一列分组去重统计次数。这是日志分析里“统计访问量最高的IP”的经典写法不需要写一行程序一条命令搞定。4.4 综合练习一条命令组合完成Nginx日志分析到这里我们可以把三剑客串起来做一个完整的实战。假设你有一份Nginx访问日志access.log每行格式大致是IP地址 - - [时间] 请求 状态码 响应字节数。你想知道访问量最高的前5个IP。命令是这样的awk {print $1} access.log | sort | uniq -c | sort -rn | head -5拆开看就很好懂了awk取出第一列的IPsort把相同IP排到一起uniq -c对相邻重复行计数sort -rn按计数值逆序排列head -5取前五。一行命令不做任何二次加工。想进一步看状态码分布用awk {print $9} access.log | sort | uniq -c | sort -rn这样能一眼看出200、404、500各占多少判断服务健康程度。还可以统计接口响应时间最慢的有些日志里请求时间就藏在列里假设最后一列是响应毫秒数awk {if ($NF 3000) print $7, $NF}能把响应超时超过3秒的请求路径和耗时打出来。$NF是awk内建变量代表最后一个字段。这套组合拳是很多监控系统背后的原理初探。你不需要做出商业监控平台的效果但这些命令能帮你在一分钟内从海量日志里获得一个足够支撑判断的结论。很多时候一个专业运维和普通新手的差距不在于会不会用某个高级工具而在于会不会把几个简单命令组合出煤气的效果。5. 真正踩过坑才记得住高频故障排查速查5.1 磁盘没空间但删了文件还是没用可能是inode或进程占用“磁盘满了”是最常见、也最迷惑的故障。常规流程先df -h确认再用du找出大文件删除但删完发现df依然显示100%——那就该考虑两个冷门原因。第一个是inode耗尽。inode可以理解为文件的“索引编号”每个文件都要占一个。当磁盘上文件数量极多哪怕总大小没满inode也可能先用完。此时用df -i查看如果用了100%就用find / -xdev -type f | wc -l数一下文件总量再find / -xdev -size ${某个极小值} -type f -delete清掉海量小文件。日志碎片、临时文件、邮件队列是重灾区。第二个原因是文件已被进程打开但标记为删除。这在Linux里叫“deleted文件”你删了它但只要进程还持有句柄空间就不释放。最典型的是日志文件被写进程一直打开直接rm删了无效。查它用lsof | grep deleted拿到PID后重启或让线程换出日志文件空间会真正释放。我之前遇到过一次应用日志滚了三天删了也没用磁盘依然是98%最后发现是Java进程还在把旧日志当标准输出去写重启进程之后空间回来了。知道这个机制以后就不会在“删了没释放”的问题上空耗了。5.2 端口被占用到底是谁占的“端口被占用”是启动服务时的高频报错。报错信息面模糊只提示 address already in use就是不说谁占的。查它标准路径有两条。第一条是用ssss -lntp | grep :8080能看到占用进程的PID和名称。如果ss的输出没有进程名多半是你权限不够加上sudo再跑。第二条是用lsof有些最小化系统默认没装需要自己装lsof -i :8080输出里能看到进程PID、用户和命令名。这两条任选一条基本都能精准定位。定位之后一般两种处理思路。如果你确定这是残留的僵尸进程直接kill掉再启动。如果这是系统里必须存在的服务比如端口被 nginx 占着你想启动另一个程序还想用同一端口那正确的做法不是杀 nginx而是修改配置让新服务改用一个未被使用的端口。网上常见的错误教学是在这里让你直接杀掉 nginx这是根治不了问题还容易把事情搞大的。5.3 中文乱码、编码问题locale和文件编码是两码事中文乱码是个经典Bug型问题。它分两类一类是终端显示乱码另一类是文件内容本身就是乱码。两类病因完全不同。终端显示乱码原因是locale环境不对。比如系统默认LANG不是UTF-8终端里中文显示成“方块”或“问号”。排查用locale如果显示LANGC或LANGen_US.ISO-8859-1就有问题。临时解决export LANGzh_CN.UTF-8永久解决则写到~/.bashrc或/etc/profile里。需要注意系统里得先能生成zh_CN.UTF-8这个locale用locale -a确认没有就按发行版文档单独装。文件内容本来就是乱码则是编码问题。用file -i 文件名查看如果是GB2312或GBK编码而你的终端是UTF-8显示自然乱。转换用iconviconv -f GBK -t UTF-8 原文件.txt 新文件.txt一条命令把编码换成UTF-8然后新文件就正常了。这个场景在Windows上传文件到Linux上时尤其常见养成“先file -i确认编码、再iconv转换”的习惯就不会乱。5.4 PATH被改坏、命令全失效时别急着重装系统还有一种让新手魂飞魄散的场景某天你在终端里敲ls系统提示command not found接着发现cat、vim全没了。十有八九是PATH环境变量被改坏了。PATH决定了系统去哪些目录找可执行文件。如果你在~/.bashrc或/etc/profile里写错了变量导致系统找不到/usr/bin、/bin这些基础路径所有命令就都“消失”了。这时候别慌。命令不是没了只是shell找不到它们。还有两条活路。第一条用绝对路径调用。/usr/bin/ls依然能执行/bin/vi依然能改文件。只要你能打开文件就能修复环境变量配置。第二条如果你连文件都免闹得没权限改那就用export PATH/usr/bin:/bin:/usr/sbin:/sbin先恢复基础路径再去修复配置文件。把错误的那一行比如多写的冒号、写错的目录路径删掉重新source ~/.bashrc即可。我见过一些新手遇到这问题会直接重装系统其实没必要。Linux系统再怎么说也是一个只会按配置运行的程序你把配置改对它就恢复如初。这也是为什么我反复强调动环境变量之前先备份一份或者在配置里写好注释。真到实际操作里你会发现故障远不止这几种但排查思路永远是同一个套路先看状态、再看日志、再定位进程、最后才动手改。我在一台机器上反复踩过坑之后慢慢明白Linux学习其实不是知识量的积累而是心智模型的转变——你开始知道一个报错背后可能牵涉多个环节开始习惯用管道把小事串成大事开始享受“把一件事彻底查清楚”的掌控感。这套感觉一旦建立后面的路就顺了。你遇到问题别硬撑把报错、日志、现场信息先收集全很多所谓“灵异事件”查到最后都只是某个配置少了一个字母而已。

关于本文作者

来自尧图内容编辑团队

尧图内容编辑团队 内容团队

尧图内容编辑团队

本文由尧图网络内容编辑团队执笔。团队由资深项目经理、前端工程师与设计师组成,所有内容均来自亲手交付的真实项目,先讲清问题、再给出可落地的解法。尧图深耕北京网站建设十年,服务过京华建材集团、智造科技等各行业客户,把一线经验沉淀为可复用的行业观察。

  • 十年建站经验,覆盖建材、制造、服务、文创等
  • 项目经理把关选题与事实准确性
  • 工程师与设计师联合撰写专业细节
  • 统一编辑规范,保证文风与排版一致
  • 每月复盘转化数据,迭代选题方向

延伸阅读

相关资讯与近期热门内容

深度阅读推荐

建站决策前值得细读的三篇

网站改版的5个关键决策
2024-08-12

网站改版的5个关键决策

什么时候该改版、改到什么程度、如何避免流量掉光,京华建材集团改版复盘给出答案。

获取专属建站方案

看完文章,把您的行业与预算告诉我们,免费获取一份量身定制的官网建设方案与报价。

立即免费咨询