尧图精选

理解Linux基础命令设计逻辑,掌握文件、进程与网络排查实战

🕒 发布时间:2026/10/1 9:27:08 📁 来源:尧图网络
1. 先理解Linux命令的底层设计再谈记忆命令很多刚接触Linux的朋友包括我当年刚入职做运维的时候都走入过一个误区把Linux命令当成单词表去背。ls是列目录cd是切换目录cp是复制mv是移动背得滚瓜烂熟可真到了服务器上报障的时候对着满屏输出完全不知道下一步该敲什么。后来我才慢慢意识到Linux基础命令真正值钱的地方不在于你记住了多少条命令而在于你理不理解命令背后那套设计逻辑。只要你理解了这套逻辑哪怕你只认识二十条命令也能排列组合出非常强大的功能。1.1 一切皆文件理解Linux的抽象哲学Linux里有一句很经典的话一切皆文件。你键盘的输入是一个文件屏幕的输出是一个文件网卡的数据收发是一个文件甚至进程之间的通信管道也是一个文件。这个设计哲学带来的直接好处是你不需要为每一个设备发明一套新命令只需要学会读写文件的那几个工具就能操作几乎所有东西。举个例子你想查看CPU信息不需要装什么专门的硬件检测软件直接读文件就行cat /proc/cpuinfo你想看系统已经加载了哪些模块同样是读文件cat /proc/modules甚至你写了一个脚本想让它开机自动执行本质上也是往特定的文件里追加一行内容。理解了一切皆文件你就理解了为什么Linux下管理配置大多是改文本文件而不是去点击图形界面里的复选框。这也是为什么很多老运维说Linux的配置就是文本编辑艺术。1.2 管道把小命令拼成大能力管道符号|是我认为Linux基础命令里性价比最高的一个设计。它的作用很简单把左边命令的输出作为右边命令的输入。可一旦你习惯了这种组合方式你会发现自己解决问题的能力瞬间提升一个档次。比如说你想看当前系统里有没有某个进程在跑单独用ps aux会刷出密密麻麻一大屏你根本看不清。但配合管道和grep一句话就搞定ps aux | grep nginx再比如说你想统计日志里某个接口被请求了多少次用管道组合上wc -lgrep /api/login access.log | wc -l这种组合思路和编程里的函数式编程很像每一条命令只做一件小事情但通过管道把它们的输出串联起来就能完成一个复杂的任务。我经常跟带的新人说别急着背几十条命令先把grep、awk、sort、uniq、wc这五个过滤统计类的命令练熟配合管道用已经能覆盖日常排查的八成场景了。1.3 权限模型决定你能做什么、不能做什么Linux基础命令里ls -l输出的一长串字符比如-rw-r--r--新手往往直接跳过不看。但这一串字符恰恰是整个Linux安全模型的基石。它分为四段文件类型、所有者权限、所属组权限、其他人权限。每组权限用r读、w写、x执行来表示。我见过不少同事在排查问题的时候明明命令敲得没问题却报Permission denied然后一脸茫然。其实这时候你看一下这个文件的权限位再确认一下当前用户是谁问题基本就水落石出了。这一块我在后面讲用户管理的时候会展开细说这里先埋个伏笔权限位读懂了你在系统上干活才有底气。所以我建议所有准备学Linux基础命令的朋友别把精力花在背命令上而是先花点时间理解这三个设计思想。地基打牢了后面的所有操作都是水到渠成的事。2. 文件、目录与磁盘操作最常用也最容易出错的一组命令文件操作是Linux里最基础的操作但越是基础的东西越容易在一些细节上踩坑。这一节我把日常工作中最高频的几个操作场景拆开讲重点说清楚那些文档里不会写明白的细节。2.1 查找文件find的-exec比你想的更强大定位文件是每个Linux用户都绕不开的需求。find命令的基本用法很简单find /etc -name *.conf但我发现很多人用find只停留在-name参数碰到找出所有大于100M的文件找出三天内修改过的日志这类需求就卡壳了。其实find的关键参数就那几个组合起来非常灵活-size 100M大于100MB的文件-mtime 3超过三天没修改过的文件-type f只查普通文件排除目录-exec对查到的每个结果执行后续命令举个例子你现在磁盘快满了想找出/var目录下所有超过500MB的文件并且把它列出来看大小find /var -type f -size 500M -exec ls -lh {} \;这句命令里{}代表find找到的每一个文件\;表示-exec命令的结束。我最早用的时候老忘记转义分号结果每次都报语法错误。你记住一个口诀括号代表每个文件分号代表命令结束必须带反斜杠。这条命令在面试里也常被问到属于典型的看着简单、一写就错的考点。2.2 df与du别再傻傻分不清谁的磁盘满了df和du这对兄弟命令一个是看文件系统的整体占用一个是看目录的占用情况。很多新手搞混是因为在脑子里没把它们和挂载点这个概念联系起来。df -h看到的是每个挂载点所在分区用了多少空间它回答的问题是磁盘是不是满了。du -sh *看到的是当前目录下每个子目录和文件的实际大小它回答的问题是空间到底被谁吃掉了。实际排查磁盘告警时的标准操作是先用df -h确认哪个挂载点空间告急再进到对应目录用du -sh *按大小排序一层层往下定位大文件du -sh /var/log/* | sort -rh | head -20这里sort -rh的作用是按数值大小倒序排列head -20取前20条。我自己每次排查完都会顺手把这几条命令串成一个别名省得每次敲一长串。还有个小坑必须提醒当你发现df显示空间已经满了但du统计下来却没那么大时大概率是有文件被进程删除了但没释放句柄。这种时候你du是看不出问题的得用lsof | grep deleted找出还在占用已删除文件的进程重启那个进程或服务才能真正释放空间。2.3 ln、tar与rsync软链接、压缩和同步的高频细节ln -s创建软链接这个命令本身不复杂但我见过大量因为软链接配错而引发的线上事故。最典型的一种是在一个已经存在的目录里创建软链接结果链接实际指向了目录内部导致路径越拼越长。你创建软链接的时候务必确认目标路径写的是绝对路径并且先在目标机上验证一下ls -l显示的指向是否正确。tar命令的用法大家都会但我想强调一个比较少人注意的细节打包压缩时尽量用相对路径不要用绝对路径。比如在/home/user目录下执行tar czf backup.tar.gz ./data解包出来就是./data结构干净整洁。如果你手滑写成tar czf backup.tar.gz /home/user/data解包的时候绝对路径目录树会原样展开很容易覆盖到意想不到的位置非常危险。rsync是我向所有人强烈推荐的同步工具特别是配合-avz参数做服务器间的文件同步比scp强大得多。它支持断点续传支持增量同步同步大目录时效率远高于重新拷贝。日常最常用的写法rsync -avz --progress /data/ userremote:/data/注意源目录末尾的斜杠很有讲究带斜杠表示同步目录内部的内容不带斜杠表示把目录本身也同步过去。这个细节我当年搞混过好几次每次都能多传输一整层目录后来干脆每次写完命令都先在测试目录上跑一遍-n参数做干跑演练确认无误再去掉-n正式执行。3. 进程管理与系统状态查看从ps到systemd的完整路径你在服务器上部署了一个服务过一会儿它没响应了你是先看日志还是先看进程我的习惯是先看进程在不在再看它状态正不正常最后才翻日志。这一节就按这个排查路径把进程相关的命令讲透。3.1 ps aux输出里的状态列读懂STAT才叫会看进程ps aux几乎是每个Linux教程都会提到的命令但大部分教程只讲了用来看进程没有解释输出结果每一列的含义。实际排查问题的时候最有价值的是STAT状态列它直接告诉你这个进程现在到底在干嘛。常见的状态有这么几个Rrunning进程正在运行或排队运行。如果你的进程长期处于R状态且CPU占用很高说明它在跑计算任务也说明它可能真的在忙。Ssleeping进程在等待某事件绝大多数服务进程都长这样。看到S不要慌这是正常状态。Duninterruptible sleep不可中断睡眠。这个状态要警惕通常表示进程在等磁盘I/O。如果你发现有很多D状态的进程大概率是磁盘出了问题比如磁盘阵列降级、网络存储断连。Zzombie僵尸进程进程已经结束但父进程没回收它的资源。一两个僵尸进程不用管多了就得检查父进程是不是有bug了。另外还有一个参数我建议养成习惯带上ps aux不区分进程的所有者所有用户的进程都会打出来。如果你想只看自己的进程用ps -u $(whoami)更清爽。不过日常排查全系统问题还是aux看得全。3.2 top命令的正确打开方式别只盯着那一堆数字top命令输出里最显眼的就是那一堆CPU和内存的百分比数字但我发现很多人盯着数字看半天也不知道下一步干嘛。其实top的正确用法是交互式的进去之后按P按CPU排序按M按内存排序按1展开每个CPU核心的使用率按c显示完整的命令行。这里有个非常实用的组合技巧。你发现某个进程CPU占用异常高先按P找到它的PID然后按c看看这个进程究竟执行的是什么命令。很多时候你会发现它根本不是你以为的那个服务而是一些被入侵后植入的挖矿进程命令行里带着奇怪的URL。这种场景下top就是你的第一道防线。退出top按q不是按CtrlC这个小习惯也顺便说一下免得你在终端里糊里糊涂把整个会话都断了。3.3 kill信号kill -9救急但别一上来就用它kill命令是很多人处理问题的默认手段但我必须说kill -9用得太随意是运维大忌。kill -9发送的是强杀信号等于让内核直接终止进程进程完全没有机会做善后工作。对于那些有持久化状态的服务比如数据库、消息队列强杀可能导致数据不一致。正确的姿势是先用kill不带参数默认发送SIGTERM信号让进程自己处理收尾退出。如果等了几秒进程还没退出再考虑kill -9。顺序应该是kill 12345 sleep 3 ps -p 12345 -o pid,stat,cmd kill -9 12345这里用ps -p 12345精确查看某个PID还在不在比用ps aux | grep过滤要干净得多还不会匹配到grep进程本身算是个很实用的小技巧。还有kill -HUP这个信号很多老运维用来让进程重新加载配置文件而不中断服务比如kill -HUP $(cat /var/run/nginx.pid)就能让Nginx平滑重载配置。这个技巧在面试里问得特别多没事建议自己搭个环境试一下。3.4 systemctl和journalctl现代Linux服务管理的基本功现在主流的Linux发行版都使用systemd来管理系统服务所以systemctl是绕不开的命令。日常操作就那么几条systemctl start启用服务systemctl enable设置开机自启systemctl status查看服务状态systemctl restart重启服务。我想重点讲一个排查思路用systemctl status看服务状态的时候如果服务反复启动失败输出末尾会附带最近几条日志记录。很多人忽略这个信息直接去翻庞大的日志文件。其实systemctl status追加的这几条日志往往已经能定位问题了比如端口被占用、配置文件语法错误、依赖的服务没起来基本上看一眼就有方向。真正需要翻详细日志的时候用journalctl -u 服务名 -n 50 --no-pager查看该服务最近50条日志-f参数则是实时跟踪日志输出调试脚本时非常有用。我调试服务的时候习惯开两个终端窗口一个跑服务一个用journalctl -f盯日志改动配置后马上能看到报错效率高很多。4. 用户、权限与sudo日常系统管理的基础必修课Linux是一个多用户系统用户和权限管理是系统管理里最基础也最重要的部分。刚接手服务器的时候第一件事就是先把用户和权限搞清楚不然很容易把自己的系统锁在门外。4.1 useradd与usermod创建用户别只用一个命令创建用户的命令有好几个useradd、adduser、usermod。很多教程把它们混在一起讲新手很容易懵。这里我先帮大家理清一个最常踩的坑useradd和adduser在Debian/Ubuntu系和Red Hat系的行为不太一样前者加了-m参数才会创建家目录后者则和你交互式地一步步设置密码和用户信息。我的习惯是创建用户时明确指定参数不依赖发行版的默认行为useradd -m -s /bin/bash -c Deploy User deploy passwd deploy-m表示创建家目录-s指定默认Shell-c是用户说明。这几项都指定之后就很少会出现我明明加了用户为什么su切换过去没有家目录这类问题。usermod则是对已有用户做调整的利器。最常用的两个场景是加组和改Shellusermod -aG docker deploy把用户追加到docker组这样该用户就能直接执行docker命令而不需要sudo了。这里有个必须强调的细节-aG的-a代表append也就是追加到组。如果不带-a用户会被移出其他所有组只保留这一个组副作用非常大直接影响用户对很多文件的访问权限。4.2 chmod与chown把权限和所有权分开理解文件权限操作翻来覆去就是chmod和chown两件事但两条命令的职责完全不同chown管的是文件属于谁chmod管的是谁能对它做什么。chmod的数值写法chmod 755 file里每一位数字代表一个身份级别的权限和4是读2是写1是执行。第一位的7421就是所有者拥有读、写、执行权限第二位的541是组成员有读和执行权限第三位的5是其他用户有读和执行权限。这样拆开理解之后755、644这些数字也就不难记了。日常运维里用chmod最多的地方是给脚本加上可执行权限chmod x /usr/local/bin/deploy.sh而chown我提醒一个容易忽视的场景你从别处拷来的文件所有权还挂着别人的名字这时起服务跑不起来。正确的做法是同时变更所有者和所属组chown deploy:deploy /opt/myapp/config.inideploy:deploy前面是所有者后面是所属组中间用冒号隔开。这个语法和rsync里的路径分隔符一样属于细节但很容易搞混。4.3 sudo配置不要随便给ALL权限sudo是赋予普通用户管理员权限的通道但配置不当就会变成安全漏洞。编辑/etc/sudoers必须用visudo命令它会在保存前做语法检查避免你写错导致整个sudo功能失效。我建议遵循最小权限原则给用户只授权他真正需要的命令而不是直接给ALL。比如一个用户只需要重启某个服务可以这样配deploy ALL(ALL) NOPASSWD: /usr/bin/systemctl restart nginx这么写的好处是这个用户执行该命令时不需要输入密码也不需要使用其他管理员权限出问题的面就小很多。如果担心时间久了忘记配置了哪些权限sudo -l可以查看当前用户被授权的命令列表这个命令在面试时也常用来考对方了不了解sudo机制。4.4 密码策略与账户有效期chage命令的妙用之前看到有人问Linux密码过期提醒怎么设置其实答案就是chage命令。它管理的是账户密码的有效期策略比如设置一个测试账号90天后密码过期过期前7天开始提醒chage -M 90 -W 7 testuser查看某个用户的完整密码策略用chage -l testuser输出里能看到上次修改日期、密码过期时间、两次修改的最小间隔等信息。这个命令在日常工作中用得不算多但一旦涉及等保审计、账号定期更换密码的合规要求它就是标准答案。我建议所有系统管理员至少掌握chage -l和chage -M这两条有备无患。5. 网络排查与存储挂载两个高频但总有人搞不清楚的方向我面试过不少自称熟悉Linux的候选人基础的ls、cd、vim都答得上来但一问到网络排查和存储挂载就暴露出明显短板。这两块恰恰是服务器日常运维中真正拉开经验差距的地方。5.1 ip与ss新时代的网络排查组合拳老一代教程还在教ifconfig和netstat但新版本的Linux发行版都已经用ip和ss替代了它们。虽然很多系统还兼容旧命令我强烈建议直接学习新命令毕竟部分发行版下一步就要彻底移除了。查看IP地址ip addr show查看路由表ip route show查看所有监听端口和对应进程ss -tlnpss -tlnp是我排查端口占用问题时的第一反应命令。-t是TCP连接-l是监听状态的端口-n不要解析主机名-p显示占用端口的进程名和PID。有一次线上服务起不来我执行这条命令不到两秒就定位到是上一个没杀干净的进程还在占着端口比开一堆窗口看日志快太多了。连接数异常飙升的时候ss -s可以快速看系统整体连接统计配合ss state established count这种方式做聚合统计也能很快判断出是不是有异常来源的流量。5.2 从应用层往下逐层排查ping、telnet与curl分工明确遇到网站打不开这类问题我有一套固定的排查链路按从下到上的顺序来效率非常高。第一步先确认网络通不通ping目标地址不通就是物理链路或DNS解析没配置好。第二步确认端口通不通用telnet 目标IP 目标端口能连上就说明网络层没问题。第三步用curl -v直接访问看完整请求响应过程验证应用层是否正常。这里有个细节我多次强调ping不通不代表服务不可用很多云厂商的安全组默认禁ICMP协议telnet端口不通也不一定是服务挂了有可能是防火墙没放行。所以排查时这几条命令要结合起来看修好一层再测下一层。写配置的时候curl是最常用的接口调试工具。加-I只查看响应头-o /dev/null丢弃响应体只关心返回码配合-w %{http_code}可以直接输出HTTP状态码curl -I -o /dev/null -w %{http_code} http://localhost:8080/api/health把它写进监控脚本里每30秒检查一次服务健康状态是很多轻量级自愈脚本的基础。5.3 挂载NAS存储与开机自动挂载别在fstab上翻车现在很多公司的数据都存放在NAS上Linux服务器通过NFS或CIFS协议挂载是很常见的需求。挂载本身不难把命令敲对就行难点在于让它在每次重启后自动挂载而不是每次手动敲一遍。手动挂载NFS的标准写法mount -t nfs 192.168.10.20:/data/nfs /mnt/nfs_data确认挂载成功后把它写进/etc/fstab192.168.10.20:/data/nfs /mnt/nfs_data nfs defaults,_netdev 0 0这里的关键参数是_netdev它告诉系统这个挂载依赖网络设备从而在启动时等网络就绪后再挂载。如果不加这个参数系统启动时网络还没起来就尝试挂载NFS很容易失败导致开机卡住。别问我怎么知道的我当年就吃过这个亏服务器重启后硬生生等了两分钟超时才进入系统。配置完fstab之后强烈建议先执行mount -a测试一下配置是否正确确认没问题再重启。这个先验证再重启的做事习惯能帮你避免一大半因为配置错误导致的启动故障。5.4 Rocky Linux网卡配置文件排查思路有朋友问到Rocky Linux网卡配置文件的路径问题这里一并说一下。Rocky Linux和CentOS系一样网卡配置文件通常存放在/etc/NetworkManager/system-connections/目录下文件名一般是网卡名加.nmconnection后缀。老的/etc/sysconfig/network-scripts/目录虽然还被兼容但新版本已经逐步不再推荐了。不少人在新版本系统上改了配置文件发现不生效大概率是NetworkManager在管着网络但不读那个老目录。正确的操作顺序是要么编辑.nmconnection文件后用nmcli connection reload加载要么直接使用命令配置nmcli connection modify eth0 ipv4.addresses 192.168.1.100/24 ipv4.gateway 192.168.1.1 ipv4.method manual nmcli connection up eth0这套命令比改文件更不容易出错配置完立刻生效状态也清晰可见我是越来越习惯用nmcli做网络调整了。6. 把基础命令串起来几个贴近真实工作的组合场景前面几个章节讲的是单个命令的用法这一节我把它串起来看一套完整的排查和运维流程是怎样的。这也是我从会敲命令到会干活那个阶段收获最大的一部分。6.1 实战场景一磁盘告警的完整排查链路服务器监控弹出一条磁盘使用率超90%的告警很多新人的第一反应是去删日志但删之前至少要搞清楚是什么占满了磁盘不然删完第二天告警又会弹回来。我推荐的完整链路是这样先用df -h确认是哪个挂载点告警。进入对应目录用du -sh * | sort -rh | head -10快速锁定大目录。如果是/var/log大概率是某个服务的日志一直没有轮转。找到最大的那个日志文件后用tail -n 20看一下近期内容判断来源。用find /var/log -type f -size 500M -exec ls -lh {} \;把所有超过500MB的日志文件一次列出来。确认能删的日志用truncate -s 0 日志文件清空而不是直接rm。直接删文件在生产环境有隐患有些进程还在往那个文件写入删了之后空间不会释放反而需要重启进程。我记得自己第一次完整走完这套流程只用了五分钟定位到一个写了12GB日志的Java服务禁用了它的冗余日志输出之后磁盘空间立刻稳定下来了。这比盲目删文件要靠谱得多也更能让团队信任你的排查能力。6.2 实战场景二查看目标进程的最新日志和负载情况排查一个进程状态时我习惯在一串命令里把这几个信息一次拿到# 找到进程PID pgrep -f myapp.jar # 查看这个进程的CPU/内存占用 top -p 12345 -b -n 1 # 实时跟踪它写入的日志假设日志路径已知 tail -f /opt/myapp/logs/app.logpgrep -f是ps aux | grep的替代品它直接按完整命令行匹配进程输出PID。把PID交给top -p就能只看这个进程的资源占用比在全量输出里翻找高效得多。另外watch命令也值得学会它可以每隔几秒自动刷新执行某条命令watch -n 2 ps aux | sort -rk 3 | head -5这条命令每两秒刷新一次CPU占用最高的五个进程是我监测突发负载时的常用手段。你不需要在终端里手工一遍遍执行命令了挂一个watch就能持续观察变化。6.3 实战场景三脚本化思维写一条定时任务的完整过程crontab是Linux里做定时任务的标配。很多人的需求是每天凌晨清理一次临时文件每小时检查一次服务状态这类需求其实用一条命令就能搞定根本不用装复杂的工具。先说怎么编辑定时任务crontab -e格式是五个时间字段加要执行的命令从左到右分别是分、时、日、月、周。比如每天凌晨2点30分执行清理脚本30 2 * * * /usr/local/bin/cleanup.sh /dev/null 21这里/dev/null 21的作用是把标准输出和错误输出都丢弃因为定时任务执行时没有终端如果脚本有输出且不重定向系统会通过邮件发送输出很多时候你会收到一堆莫名其妙的系统邮件。但有一点我要提醒直接在crontab里写很长的一串命令是反模式可读性极差出错了也没法调试。我建议先在命令行里把要执行的命令完整跑通确认无误后再把它写进一个.sh脚本文件然后chmod x赋予执行权限最后才在crontab里引用这个脚本。一个规范的脚本骨架大致是这样的#!/bin/bash # 清理超过7天的临时文件 LOG/var/log/cleanup.log echo $(date): 开始清理 $LOG find /tmp/myapp -type f -mtime 7 -delete echo $(date): 清理完成 $LOG脚本输出日志到固定文件这样每次执行的结果有据可查echo时间戳方便追溯是哪一次执行产生了异常。这套模板虽然简单但已经能覆盖绝大多数定时任务的场景了。6.4 面试和工作中常被问到的几个命令考点最后聊一下面试。很多公司招Linux运维或后端开发面试题里都绕不开基础命令。我结合自己面试别人的经验总结几个高频考点大家自查一下能不能不看键盘写出来ps aux输出的各列含义特别是STAT状态列。如何统计一个日志文件里某个关键字出现的次数答案是grep -c或grep | wc -l顺便再想想-c和| wc -l有什么区别。如何查看某个端口被哪个进程占用答案是ss -tlnp。如何给一个用户添加sudo权限但不允许执行所有命令。crontab五个时间字段的顺序和取值范围。df和du的区别这个被问到的频率高得离谱。进程起不来你的排查步骤是什么这里考察的是思路不是具体命令。这些问题看起来都很基础但实际上能把思路讲得清晰、有条理的人并不多。很多人是用过但没想过一旦被追问为什么就答不上来了。所以我在这篇文章里反复强调理解设计逻辑和排查思路因为它们才是在面试和真实工作中真正拉开差距的东西。最后再分享一个我个人操作习惯上的体会Linux基础命令不用刻意去背但你要保证自己有肌肉记忆级别的熟练度。我见过太多人在生产环境敲命令时还对着手机查参数这种场景下别说效率了出错的概率都高得吓人。花一个周末的时间把上面提到的这些命令在虚拟机里全部跑一遍把每个输出都看懂比你在收藏夹里存100篇教程有用得多。等你把这些基础操作练到条件反射的程度后面学Shell脚本、学Ansible、学容器编排都会顺得很。
上一篇/下一篇内容由系统自动关联 返回资讯列表 →