首页 / 资讯中心 / 文章详情

Linux命令实战:从场景驱动到排障反射,告别死记硬背

Linux命令实战:从场景驱动到排障反射,告别死记硬背 ★ FEATURED ARTICLE
1. 为什么“命令大全”背了也白背从死记硬背到场景驱动刚入行那会儿我也干过把man手册打印出来贴墙上的事。结果呢真到了线上服务器 CPU 飙到 100%、磁盘写满、服务起不来的时候脑子里只剩一片空白能想起来的只有ls和cd。后来带过几个新人发现大家踩的是同一个坑把 Linux 命令当成英语单词表来背而不是当成工具箱里的扳手来用。这篇东西不打算给你罗列几百条命令让你收藏吃灰。我想干的是另一件事——把日常运维、开发、排障中最常撞见的场景拆开告诉你每个场景下该用哪把扳手、为什么用这把、以及拧的时候手该使多大劲。关键词里的linux常用命令大全运维、top命令详解、linux删除文件夹命令、iptables命令详解这些我都会揉进具体场景里讲而不是单独列个表。适合谁看如果你是刚接触 Linux 的开发者被Permission denied和No space left on device搞得头大这篇能帮你建立一套排查反射如果你是有几年经验的运维可以看看有没有哪个参数是你一直用默认值、但其实可以调优的。我尽量说人话但该严谨的地方不含糊。先立个规矩命令不是背出来的是查出来的但查之前你得知道该查什么。下面所有内容都围绕这个逻辑展开。2. 文件与目录操作那些你以为会了、其实一直在用错姿势的命令2.1ls和cd的隐藏参数为什么你总在反复敲pwd大部分人用ls就是ls用cd就是cd。但线上排障时你经常需要在几十层深的目录里跳来跳去。我见过有人为了回到上一个目录硬生生敲了五遍cd ../../../../..然后还敲错一层。cd -这个命令作用是回到上一次所在的目录。就这一个减号能省掉你大量pwd加肉眼比对的时间。实测下来在/etc/nginx/conf.d和/var/log/nginx之间来回切换时cd -比任何路径补全都快。ls这边ls -lht是我个人最常用的组合。-l长格式、-h人类可读的文件大小、-t按修改时间倒序。查日志目录时一眼就能看到最新写入的文件是哪个、多大。比ls -l然后自己找时间戳高效得多。再加个--colorauto目录和可执行文件会有颜色区分视觉扫描速度快一倍。注意ls -t在文件数量巨大的目录比如几十万个 session 文件下会明显变慢因为它要读取所有文件的元数据再排序。这种场景改用find . -maxdepth 1 -mmin -10更合适。2.2rm删目录的三种姿势以及为什么rm -rf不是唯一答案linux删除文件夹命令是热搜词说明很多人在这上面栽过跟头。删目录有三个层次rmdir只能删空目录。安全但基本没用因为你要删的目录通常不空。rm -r递归删除会逐个询问确认如果目录文件多问到你想砸键盘。rm -rf递归强制删除不问。这是核弹按钮。我的经验是永远不要在生产环境直接敲rm -rf后面跟一个手打的路径。正确姿势是先用ls或find确认目标再用rm -rf加 Tab 补全。Tab 补全能避免手滑打错路径比如把/data/logs打成/data/log。更稳的做法是用find配合-deletefind /data/logs -type f -name *.log -mtime 30 -delete这条命令只删 30 天前的.log文件不碰目录结构也不碰其他文件。比rm -rf /data/logs/*精确得多。-mtime 30表示修改时间在 30 天以前-type f限定只处理普通文件。删之前把-delete换成-print跑一遍确认输出列表没问题再真删。2.3cp和mv在跨文件系统时的坑mv在同一个文件系统内是改指针瞬间完成。但跨文件系统比如从/home移到/data两者挂载在不同分区时mv实际执行的是“复制 删除”大文件会卡很久而且中途中断可能导致数据半死不活。判断方法df -h /home /data看两者是否在同一个Filesystem列。如果不是大文件迁移用rsync -avP --remove-source-files更稳。-P显示进度并支持断点续传--remove-source-files在传输成功后删除源文件。这样即使中断重跑一遍也不会重复传已完成的文件。cp这边cp -a保留权限、时间戳、符号链接等所有属性适合备份目录。cp -u只复制源比目标新的文件适合增量同步小批量文件。但大批量同步还是交给rsynccp在文件数量上万时性能下降明显。3. 进程与资源排查top只是入口真正的功夫在解读3.1top命令详解那几行数字到底在说什么top命令详解是热词但很多人只看了个热闹。top第一行load average的三个数字分别代表过去 1 分钟、5 分钟、15 分钟的平均负载。关键不是绝对值而是趋势。如果 1 分钟值远高于 15 分钟值说明负载正在快速上升可能是突发流量或某个进程失控。第二行Tasks里的zombie数量要盯住。僵尸进程本身不占 CPU 和内存但它占 PID 表项。如果僵尸数持续增长说明有父进程没有正确wait子进程迟早把 PID 耗尽。第三行Cpu(s)里us是用户态 CPU 时间sy是内核态wa是等待 I/O 的时间。wa高才是真凶——它意味着 CPU 在等磁盘或网络而不是在算东西。这时候你加 CPU 没用得去查磁盘iostat或网络。top交互模式下按1展开每个 CPU 核心的利用率按P按 CPU 排序按M按内存排序按c显示完整命令行。这几个键组合起来定位问题进程的速度比ps aux | grep快得多。3.2ps和pgrep找到那个“看不见”的进程ps aux输出太长ps -ef又记不住。我的习惯是ps aux --sort-%mem | head -20直接看内存占用前 20 的进程。--sort-%mem的减号表示降序。但有时候进程名被截断了ps看不全。用pgrep -af 关键词更直接。-a显示完整命令行-f匹配整个命令行而不只是进程名。比如pgrep -af java能列出所有命令行里带java的进程包括那些启动脚本包装过的。如果进程卡死但kill不掉先别急着kill -9。kill -9是最后手段因为它不给进程清理资源的机会可能导致共享内存段、锁文件残留。正确顺序是kill -15SIGTERM礼貌请求退出→ 等 5 秒 →kill -9SIGKILL强制杀。kill -15给进程机会关闭文件描述符、释放数据库连接。3.3lsof和ss谁占着端口不放服务起不来报Address already in use说明端口被占了。netstat已经过时现在用ss -tlnp。-tTCP-l监听状态-n不解析服务名快-p显示进程。输出里直接能看到pid和进程名。但ss看不到进程打开的文件。lsof -i :8080能列出所有使用 8080 端口的进程包括那些已经建立连接但没在监听的。lsof D /data能列出某个目录下所有被打开的文件排查“文件被删了但磁盘没释放”时特别有用——lsof | grep deleted找到那些句柄还开着的已删除文件重启对应进程才能释放空间。4. 网络与远程连接从telnet到iptables的实战链路4.1telnet ip 端口 命令怎么看通不通热搜词里telnet ip 端口 命令怎么看通不通问得很具体。telnet 192.168.1.100 3306如果显示Connected说明 TCP 三次握手成功端口通。如果卡住然后Connection refused说明目标端口没服务监听。如果一直卡住不返回通常是防火墙 DROP 了包。但telnet本身不安全很多系统默认不装。替代方案是nc -zv 192.168.1.100 3306。-z只扫描不发送数据-v显示详细信息。或者用curl -v telnet://192.168.1.100:3306curl基本所有系统都有。更专业的做法是用nmap -p 3306 192.168.1.100但nmap需要额外安装且扫描行为可能触发安全告警。日常排障nc足够了。4.2iptables命令详解规则顺序比规则本身更重要iptables命令详解是热词但很多人只记住了-A追加和-I插入没搞懂-A和-I的区别。iptables -A INPUT -p tcp --dport 80 -j ACCEPT是把规则加到链尾-I INPUT 1是插到链首。iptables 是从上往下匹配匹配到就执行动作不再往下看。所以如果你先-A了一条DROP all后面再加ACCEPT 80是没用的因为包在DROP那行就被拦了。查看规则用iptables -L -n -v --line-numbers。-n不解析 IP 和端口快-v显示包计数和字节计数--line-numbers显示行号。行号在删除规则时有用iptables -D INPUT 3删除 INPUT 链第 3 条。保存规则iptables-save /etc/iptables/rules.v4恢复用iptables-restore /etc/iptables/rules.v4。但注意iptables规则重启后会丢失必须配置开机自动恢复否则重启后防火墙形同虚设。注意在远程服务器上操作iptables时永远先加一条允许当前 SSH 端口的规则再改默认策略。我见过有人直接iptables -P INPUT DROP然后 SSH 断线只能去机房接显示器。4.3ssh免密登录和scp传文件ssh-keygen -t ed25519生成密钥对比默认的rsa更短更安全。然后把公钥~/.ssh/id_ed25519.pub内容追加到目标机器的~/.ssh/authorized_keys。用ssh-copy-id userhost一条命令搞定不用手动复制粘贴。scp传文件scp -r /local/dir userhost:/remote/dir。-r递归传目录。但scp在传大量小文件时慢因为每个文件都要单独握手。改用rsync -avz -e ssh /local/dir/ userhost:/remote/dir/-z压缩传输-a保留属性-v显示进度。注意源路径末尾的斜杠/local/dir/表示传目录内容/local/dir表示传目录本身。5. 包管理与系统服务systemctl和docker的日常5.1systemctl的五个核心动作systemctl start/stop/restart/status/enable这五个够用 90% 的场景。enable是设置开机自启disable取消。systemctl status nginx看服务状态输出里Active: active (running)表示正常failed表示挂了。journalctl -u nginx -n 50看该服务最近 50 行日志比翻/var/log快。systemctl daemon-reload在修改了 unit 文件后必须执行否则systemctl读的还是旧配置。这个坑我踩过改了nginx.service的LimitNOFILE重启服务没生效折腾半小时才发现忘了daemon-reload。5.2docker和containerd命令的对应关系linux安装docker和containerd命令是热词。docker底层就是containerd所以docker ps对应ctr containers listdocker images对应ctr images list。但ctr默认命名空间是default而docker用的是moby所以ctr -n moby containers list才能看到docker创建的容器。日常还是用docker命令更顺手。docker ps -a看所有容器包括已停止的docker logs -f --tail 100 容器名实时看日志docker exec -it 容器名 /bin/bash进容器。docker system prune -a清理所有未使用的镜像和容器但这条命令会删掉所有停止的容器执行前确认没有需要保留的。docker stats看容器资源占用类似top但针对容器。docker inspect 容器名看容器详细配置输出是 JSON配合jq过滤docker inspect 容器名 | jq .[0].NetworkSettings.IPAddress直接拿 IP。6. 文本处理三剑客grep、awk、sed的实战切片6.1grep的-r和-l组合grep -r 关键词 /path递归搜索目录下所有文件。但输出会带文件名和行号如果只想看哪些文件包含关键词用grep -rl 关键词 /path。-l只输出文件名不输出匹配行。这个在“哪个配置文件里写了这个参数”的场景下特别高效。grep -v是反向匹配排除包含某关键词的行。ps aux | grep -v grep | grep nginx排除grep自身进程这是经典用法。但更简洁的是pgrep -af nginx前面提过。6.2awk按列提取和条件过滤awk {print $1, $3}打印第一和第三列。$0是整行NF是列数NR是行号。awk -F: {print $1} /etc/passwd用冒号做分隔符打印用户名。条件过滤awk $3 100 {print $1, $3}打印第三列大于 100 的行。df -h | awk $50 80 {print $6, $5}找出磁盘使用率超过 80% 的挂载点。$50把80%转成数字 80 再比较因为awk默认按字符串比较9% 80%会返回真加 0 强制转数字。6.3sed替换和删除sed -i s/old/new/g file全局替换。-i直接改文件不加-i只输出到屏幕。用-i前先不加-i跑一遍确认替换结果这是保命习惯。sed -i /^#/d file删除所有以#开头的行注释行。sed -n 10,20p file打印第 10 到 20 行-n抑制默认输出p打印指定行。sed处理大文件比vim快因为它是流式处理不加载整个文件到内存。7. 权限与用户管理chmod、chown和sudo的边界7.1chmod数字模式和符号模式的选择chmod 755 file是数字模式7421读写执行541读执行。chmod ux file是符号模式给所有者加执行权限。数字模式适合批量设置固定权限符号模式适合微调。chmod -R 755 /data递归改权限。但不要对/或/usr执行chmod -R会把系统文件权限改乱导致系统无法启动。我见过有人chmod -R 777 /然后整台机器报废。7.2chown和chgrp的区别chown user:group file同时改所有者和组。chown -R user:group /data递归改。chgrp group file只改组。chown需要 root 权限普通用户只能改自己拥有的文件的组且必须是该用户所属的组。linux新建用户用useradd -m -s /bin/bash username。-m创建家目录-s指定 shell。然后passwd username设密码。usermod -aG sudo username把用户加入sudo组-aG是追加组不加-a会覆盖原有组。7.3sudo和su的安全差异su切换到 root 需要 root 密码sudo执行单条命令需要当前用户密码。sudo更安全因为不需要把 root 密码告诉所有人而且sudo操作会记录到/var/log/auth.log可审计。sudo -i切换到 root 的交互式 shellsudo -s类似但不加载 root 的环境变量。sudo -u user command以指定用户身份执行命令。配置sudo权限编辑/etc/sudoers用visudo它会在保存时检查语法避免写错导致所有sudo失效。8. 磁盘与文件系统df、du和mount的排查组合8.1df -h和du -sh的差异df -h看文件系统级别的使用率du -sh /path看目录实际占用。两者经常对不上原因通常是有进程打开了已删除的文件lsof | grep deleted或者文件系统预留了空间给 rootdf显示Use%但du算不出来。排查磁盘满的标准链路df -h找到使用率 100% 的挂载点 →du -sh /*逐层定位大目录 → 找到具体文件 → 确认是否可删。如果du和df差异巨大用lsof L1找那些链接数为 0 但句柄还开着的文件。8.2mount和umount的注意事项mount /dev/sdb1 /mnt/data挂载。umount /mnt/data卸载。卸载前确保没有进程在使用该目录否则报device is busy。用lsof D /mnt/data或fuser -m /mnt/data找到占用进程。mount -o remount,rw /重新挂载为读写。系统进入紧急模式时常用。mount -a挂载/etc/fstab里所有未挂载的条目修改fstab后用这个测试避免重启后挂载失败导致系统起不来。注意修改/etc/fstab后先mount -a验证确认无报错再重启。fstab写错会导致系统启动卡在 emergency mode。9. 我的排障反射清单和几个保命习惯上面这些命令单独看都不难。难的是出问题时能条件反射地想到该用哪个。我自己的反射链路是这样的服务起不来 →systemctl status看状态 →journalctl -u看日志 →ss -tlnp看端口 →lsof -i看占用。机器变慢 →top看负载和 CPU →iostat -x 1看磁盘 →free -h看内存 →ss -s看连接数。磁盘满 →df -h定位分区 →du -sh逐层找 →lsof L1查已删除文件。网络不通 →ping看连通性 →nc -zv看端口 →iptables -L -n看规则 →traceroute看路径。几个保命习惯都是踩坑换来的改配置前先备份cp nginx.conf nginx.conf.bak.$(date %Y%m%d)。日期后缀避免覆盖旧备份。rm前先ls把要删的路径先ls一遍确认输出符合预期再把ls换成rm。iptables改远程机器先放行 SSH在-P INPUT DROP之前先-I INPUT 1 -p tcp --dport 22 -j ACCEPT。chmod -R和chown -R不对系统目录用只对自己创建的目录用系统目录权限是发行版精心设计的。kill -9是最后手段先kill -15等 5 秒再kill -9。linux常用100个命令这种列表网上到处都是但真正让你在凌晨三点不慌的是这套场景化的反射。命令是死的场景是活的。把上面这些链路跑熟比背一百条命令管用。
阅读完成 · 觉得有帮助?
咨询建站