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

Linux常用命令实战指南:从Shell原理到服务器运维排查

Linux常用命令实战指南:从Shell原理到服务器运维排查 ★ FEATURED ARTICLE
刚接触Linux那会儿我在终端里敲下第一条ls的时候完全没意识到后面几年吃饭的本事几乎都押在这些看似零散的指令上了。做运维、写脚本、排查线上故障几乎每一天都在跟Linux指令打交道。这篇文章不打算把man手册抄一遍给你而是把日常使用频率最高、踩坑最多、面试也常问的那批常用指令按真实的工作场景重新梳理一遍。适合刚开始用Linux的开发者也适合准备运维面试、或者工作中经常要上服务器操作的同事拿来对照参考。能动手敲的别只看能记到脑子里的别靠搜索——这是我想在这篇里传递的第一件事。1. 先补三个底层概念指令是什么、去哪找、坏了怎么查很多人一上手就在背命令背了很多却不知道怎么组合遇到报错更是一头雾水。我的建议是先花三分钟搞清楚指令运行的底层逻辑后面学什么都快。1.1 指令的本质和Shell的工作方式Linux里的所谓“指令”严格来说分两类。一类是Shell自带的内部命令比如cd、echo、export另一类是存放在/bin、/usr/bin、/usr/local/bin等目录下的独立可执行程序比如ls、grep、tar。你在终端输入的命令实际上是由Shell这个解释程序接收然后去PATH变量定义的路径里逐个查找匹配的可执行文件找到就运行找不到就报“command not found”。这就解释了为什么有时候你明明安装了某个软件却敲不了它的命令——大概率是安装路径没加进PATH。我排查过不少类似问题最后都指向同一句话先看看echo $PATH输出什么。用which或type可以快速确认命令的真实位置例如which nginx它会把/usr/sbin/nginx这种完整路径给你打出来。搞懂了这一层以后遇到任何“找不到”的问题第一反应就不会是瞎重装而是先检查路径。1.2 指令帮助体系的正确打开方式很多新手上来就问“这个命令怎么用”其实Linux自带一套完整的帮助体系。最常用的是man比如man ls会打开ls的完整手册其次是info内容更详细但结构更复杂第三是大多数命令都支持的--help参数适合快速扫一眼常用选项。我的习惯是拿不准某个参数时先--help想了解原理和细节再看man。这里有个小技巧man手册打开后按/可以搜索关键词按q退出。很多面试题喜欢考“某个参数的含义”其实在man页里都能找到原话关键是你要养成查文档的习惯。还有一种场景是老手也会遇到的——同一个命令在不同发行版上选项有差异。比如ps aux和ps -ef输出的字段风格就不一样这跟POSIX规范和BSD风格有关没必要争谁对谁错跟着你手头系统的man走就对了。2. 文件与目录操作每天用量最高的那批指令文件操作是Linux的日常基本功也是各类面试题里出镜率最高的部分。这部分我不打算只罗列参数我想把“什么场景用什么组合”讲明白。2.1 目录切换与状态确认pwd、cd、lspwd打印当前工作目录cd切换目录ls列出目录内容。这三个看起来简单组合起来却有很多讲究。cd -可以快速回到上一次所在目录我经常在A目录和B目录之间来回切换排查问题靠的就是这一下cd ~回到当前用户的家目录cd ..回到上一级。ls的几个常用变体要形成肌肉记忆ls -l看详细属性ls -a显示隐藏文件ls -lh把文件大小变成人类易读的K、M、Gls -lt按修改时间排序方便找最新改过的文件。ls -l输出的第一列是文件类型和权限类似drwxr-xr-x。第一个字符d代表目录-代表普通文件l代表软链接。后面九个字符每三个一组分别对应属主、属组、其他人的权限。这个知识在后面的权限管理还会展开但你在看文件列表的时候就要开始有意识地读这一列而不是只看文件名。2.2 文件复制、移动与删除的高危操作意识cp复制文件mv移动或重命名文件rm删除文件。我在实际工作中见过太多因为这三个命令翻车的案例所以必须单独拎出来说。cp -r复制目录时记得加递归参数cp -p保留原文件的权限和时间戳这在备份配置文件的时候特别有用。mv在同文件系统内基本是瞬间完成的因为只是改了个目录项指针跨文件系统移动才会真正复制再删除耗时完全不同这个原理值得记一下。rm是最危险的指令之一尤其是rm -rf组合网络上各种段子基本都源于此。我的实操原则是删除之前先ls确认当前路径能用相对路径就不用绝对路径关键操作前先tar打包备份。另外别小看rm -i的交互提示它在批量删除时能救命。还有一个真实教训路径末尾多打一个空格再加*匹配范围可能完全不同这种低级错误一旦发生就是灾难。2.3 文件查看与内容过滤cat、tail、find、grep查看文件内容cat适合看完整小文件less适合分页阅读大文件head看前几行tail看后几行tail -f则能实时跟踪日志输出排查线上问题时我几乎天天用它盯着应用日志。grep是文本过滤的神器grep keyword /path/to/file直接打印匹配行grep -r递归搜索目录grep -i忽略大小写grep -v反向匹配。find是文件查找的终极方案但很多人用不熟。我常用的思路是按名字找find /data -name *.log按大小找find / -size 500M按时间找find /tmp -mtime -3三天内修改过的文件。再进阶一点find还能直接接-exec执行后续命令比如批量清理三天前的日志find /var/log -name *.log -mtime 3 -exec rm {} \;。这个语法第一次看会懵但其实{}就是find找到的每个文件名\;表示命令结束。能理解并安全使用这条命令你的效率会明显提升。3. 权限与用户管理理解Linux安全模型的钥匙3.1 权限位、数字法与常见权限组合Linux的权限模型其实不复杂每个文件有三个身份维度属主、属组、其他人每个维度有三种权限读r、写w、执行x。数字法是对这三类权限的二进制编码r4w2x1。chmod 755等于给属主rwx、属组rx、其他人rxchmod 644等于属主rw、属组r、其他人r。我给了个生活化类比权限就像一套公寓的门禁卡。属主是房东有全套权限属组是合租室友能开门能住但不能改变房屋结构其他人是访客只能看看。理解这个之后你看到-rwxr-xr-x就不会再觉得是乱码。需要加执行权限时用chmod x script.sh要给整个目录及内部所有文件统一改权限用chmod -R。但要注意-R会递归修改所有子文件生产环境慎用因为有些程序文件对权限极其敏感改错可能导致服务起不来。3.2 用户创建、密码与身份切换的实际操作用户管理相关的指令在面试里经常一起考。useradd创建用户passwd设置密码usermod修改用户属性userdel删除用户。创建用户时我习惯这样写useradd -m -s /bin/bash zhangsan-m自动创建家目录-s指定登录Shell。如果不加-m很多发行版不会自动建家目录用户登录后落在根目录各种配置写不进去很容易被误认为“系统坏了”。创建之后立刻passwd zhangsan设置密码。查看用户信息用id zhangsan能看到uid、gid和所属组列表排查权限问题时这个命令非常关键。多用户环境里临时切换身份用su普通用户提权执行单条命令用sudo。区别在于su -会完全切换到另一个用户的登录环境需要知道目标用户的密码sudo是当前用户用自己的密码以root权限执行命令。生产服务器上我推荐尽量用sudo因为sudo的每一条执行记录都会写进日志出了事能追溯。sudo权限配置在/etc/sudoers文件里修改它必须用visudo命令因为visudo会做语法校验防止你写错把sudo搞挂。3.3 别滥用root权限边界是最好的保护刚接触Linux的人喜欢干什么都用root图省事。但生产环境的规矩恰恰相反能用普通用户做的操作绝不用root能用sudo完成的绝不直接登录root。原因很简单root的权限没有任何限制一个误操作比如rm -rf /虽然现在很多系统有保护或者写错配置文件可能直接导致整台服务器不可用。我踩过一次印象深刻的坑在一个业务目录里用root执行了一个chown -R把目录属主改错了结果业务进程因为无法写日志直接崩溃。从那之后我给自己定了几条铁律登录服务器用普通用户需要特权时用sudo执行批量修改之前先ls -l看清楚对象涉及属主属组的操作先用--dry-run或test -e验证路径存在。权限不是阻碍效率的枷锁它是你操作的最后一道保险栓。4. 进程、服务与系统资源运维排查的主战场4.1 查看进程的黄金组合ps、topps是进程查看指令最常用的组合是ps aux和ps -ef。ps aux输出的列包括USER、PID、CPU%、MEM%、STAT、COMMAND等。这里的STAT字段值得关注S表示休眠R表示运行Z表示僵尸进程。如果系统里出现大量Z进程说明父进程没有正确回收子进程通常需要排查父进程的逻辑或者直接重启相关服务。top是动态刷新版的进程查看器按CPU或内存排序能快速找出资源占用大户。进入top后按P按CPU排序按M按内存排序按q退出。我排查应用卡顿问题时第一步就是top看整体负载第二步ps aux --sort-%cpu | head -20看具体是哪个进程在吃资源。4.2 kill、进程信号与“杀不死”的进程kill通过发送信号来控制进程默认发的是SIGTERM编号15相当于礼貌地请求进程自行退出。如果进程不响应再用kill -9发SIGKILL强制终止。经验之谈别一上来就-9。-9是最后手段因为它不给进程任何清理资源的机会可能导致数据丢失、端口未释放、临时文件残留。我建议的顺序是kill pid等几秒看进程还在不在实在不行再kill -9 pid。还有一种常见面试题端口被占用了怎么办。通常先ss -tlnp | grep 端口号或lsof -i :端口号找到占用进程的PID然后按上面的方式处理。这里要注意lsof在某些精简系统里没预装需要先yum install lsof或apt install lsof而ss是iproute2自带的一般都有。4.3 systemctl现代Linux的服务管理标准现在的主流发行版基本都用systemd管理服务systemctl就是它的客户端。常用命令有systemctl start nginx启动服务systemctl stop nginx停止systemctl restart nginx重启systemctl enable nginx设置开机自启systemctl status nginx查看运行状态。status输出里会包含进程PID、最近日志、以及Active状态是running还是failed排查服务起不来时第一件事就是看它。服务配置文件存放在/etc/systemd/system和/usr/lib/systemd/system目录下修改后要执行systemctl daemon-reload重新加载。还有一个经常考的场景systemctl list-units --typeservice可以列出所有已加载的服务单元systemctl list-units --failed能直接看到启动失败的服务。这条命令在服务器批量迁移后特别有用能快速发现哪些服务没起来。5. 网络与端口排障从连通性到监听状态5.1 ping、ip、ss网络问题三板斧网络排查的第一步永远是确认基础连通性。ping能测IP层的通断ip addr查看本机IP地址和网卡状态ip route查看路由表。这些指令的输出虽然枯燥但每一个字段都对应一个网络环节IP地址是否配置对、默认网关是否存在、DNS是否可达。第二步是看端口监听状态。ss -tlnp是查看TCP监听端口的首选-t只看TCP-l只看监听状态的端口-n用数字显示地址和端口不做反向解析速度快-p显示对应的进程信息。我想强调一下ss已经取代了老的netstat在新系统上用netstat可能提示未安装直接用ss就好。把ss -tlnp练熟比背一堆netstat参数更实用。5.2 连通、端口、防火墙、DNS的排查顺序我处理过不少“网页打不开”的工单总结了一套固定排查顺序。第一ping目标IP如果ping不通检查本机IP和网关第二telnet 目标IP 端口或用curl -v测试端口连通性连不上就查防火墙和安全组第三systemctl status firewalld看本机防火墙是否拦截第四nslookup 域名排查DNS解析是否正常第五ss -tlnp确认服务进程有没有在监听正确的端口。这套顺序看起来简单却解决了我至少80%的网络问题。有个容易忽略的点云服务器上除了操作系统防火墙还有云平台安全组两边都放行了才算真正放行。凡遇到端口不通先别急着改防火墙把整个链路过一遍再动手往往能省下不少无用功。6. 打包压缩、管道与脚本从单条指令走向自动化6.1 tar打包和压缩一套搞定tar是Linux最核心的归档工具。常用组合tar -czvf app.tar.gz /opt/app把目录打包并用gzip压缩tar -xzvf app.tar.gz解压tar -tzvf app.tar.gz不解压只查看内容。参数含义c创建归档x解包z启用gzip压缩v显示过程f指定归档文件名。f必须放在最后因为它后面紧跟文件名这个顺序很多人记混过。解压到指定目录用-Ctar -xzvf app.tar.gz -C /opt/deploy。这个选项在部署发布时太常用了。再补充一个实用的tar -czvf backup_$(date %F).tar.gz /var/lib/mysql——用命令替换把当天日期拼进备份文件名配合cron定时任务就能实现每天自动备份。日期格式%F是%Y-%m-%d的简写运维脚本里出现频率极高。6.2 管道、重定向与tee指令之间的“接线”管道符|是把前一条命令的标准输出作为后一条命令的标准输入。比如ps aux | grep nginx就是在全部进程输出里筛出nginx相关行。grep还能过滤掉grep自身进程ps aux | grep nginx | grep -v grep虽然用pgrep更专业但面试和临时排查中管道写法更普及。重定向符号也有讲究覆盖写追加写2把错误输出重定向到文件21把标准错误合并到标准输出。tail -f /var/log/app.log | grep ERROR是我盯日志最常用的姿势等于实时过滤只看错误行。还有一个好东西teeecho hello | tee test.txt能在把内容写到文件的同时打印到终端部署脚本里要“既留档又可见”时很顺手。初学者最容易懵的是21的位置我提供一个简单的记忆方式把1想成正常出口2想成报错出口21就是让报错走正常出口的路这样|和才能接住报错信息。6.3 第一个实用脚本从手动操作到一键执行把多条指令写进一个以.sh结尾的文件再加执行权限就得到最简单的自动化脚本。开头的#!/bin/bash叫shebang用来告诉系统用哪个解释器执行。举个例子一个日志清理脚本。#!/bin/bash LOG_DIR/var/log/myapp DAYS7 find $LOG_DIR -name *.log -mtime $DAYS -exec rm {} \; echo $(date): 已清理 $LOG_DIR 下超过 $DAYS 天的日志 /var/log/cleanup.log执行前先chmod x clean_logs.sh然后./clean_logs.sh。脚本里建议加上变量定义别把路径直接写死在命令里这样换环境只要改顶部的变量就行。配合crontab定时执行crontab -e 0 2 * * * /root/clean_logs.sh表示每天凌晨两点执行一次。写脚本时有个原则我强调过很多次所有命令尽量写绝对路径因为cron运行时的环境变量和你手动登录终端时不一样PATH可能不完整用相对路径或裸命令经常导致脚本在cron里静默失败。7. 常见问题速查与避坑实录7.1 高频报错的排查套路Linux指令用多了会发现报错翻来覆去就那么几类。第一类是command not found先确认命令是否安装which 命令或type 命令没有输出就安装对应软件包比如yum install -y vim。第二类是Permission denied要么文件没有执行权限要么当前用户对目录没有写权限用ls -l和id对照着看必要时chmod或sudo。第三类是No such file or directory可能是路径拼写错也可能是脚本里的解释器路径写错了比如在脚本里写#!/usr/bin/python但系统实际安装在/usr/local/bin/python。第四类是磁盘满了df -h看挂载点使用率再用du -sh /var/log/*排查具体目录。很大概率是某个日志文件疯狂增长常见处理是 /var/log/app.log直接清空而非rm因为进程还在写这个文件删了以后空间也可能不释放这是很多新手踩过的坑。7.2 几个容易“看起来很对”但实际很危险的操作第一个是rm -rf /以及rm -rf /*这种带通配符的写法虽然部分系统有保护但不要在关键机器上赌这个概率。第二个是chmod -R 777它会开放所有用户的所有权限等于把安全门拆了正常场景给755或644就够了。第三个是kill -9无差别解决一切进程问题实际上可能留下半写状态的临时文件导致下次启动失败。第四个是在生产环境直接编辑正在运行的脚本文件而不备份一旦语法写错定时任务会在下次执行时报错可能引发连锁问题。7.3 我的几条实操铁律长期跟Linux打交道我给自己定了几条铁律也推荐给你参考。第一执行任何删除、覆盖、批量修改之前先ls确认对象第二改配置前先cp备份并且编号保存比如nginx.conf.bak20250101第三使用sudo前先history看看自己刚才敲了什么防止上下文错乱导致误操作第四写脚本时变量加引号例如$LOG_DIR防止路径里有空格时命令被拆断。这里再补充两个让我效率提高不少的小习惯。一个是alias比如在~/.bashrc里写alias llls -lh、alias gvgrep -v grep下次登录直接用短别名。另一个是history先history查看历史指令再用!编号快速复用某条历史命令配合CtrlR反向搜索能省下大量重复输入。我在实际使用中发现把这些指令练成本能反应比背下所有参数更重要——因为真正的排查场景根本不会给你查文档的从容时间靠的是平时积累和肌肉记忆。
阅读完成 · 觉得有帮助?
咨询建站