ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

Linux基础命令实战:核心用法与系统排查思路

Linux基础命令实战:核心用法与系统排查思路 刚接触Linux那会儿我也有过对着黑乎乎的终端屏幕一脸茫然的阶段。哪怕现在玩了十几年Linux偶尔碰到新环境、新发行版还是得靠基础命令一步步摸清系统底细。市面上的“Linux命令大全”很多但大多像字典一样罗列几百个命令——能查但不好学。真正干活的时候你会发现高频用到的其实就三五十条关键是把它们串起来形成一套“遇到问题怎么拆解”的思路。这篇东西不打算做成字典我想按实际使用的场景和逻辑把最常用、最核心的Linux基础命令捋一遍顺带说说每个命令背后的原理和我在真实环境里踩过的坑希望能帮新手少走点弯路也能给老手当一份速查手册。1. Shell是怎么把命令跑起来的理解命令查找与执行机制1.1 PATH变量为什么有时候输入命令提示command not found很多新手都会遇到一个诡异的现象明明软件装好了输入命令却提示command not found。这背后的核心机制就是PATH变量。Shell在执行命令时会按照PATH环境变量中记录的目录顺序逐个查找可执行文件。找到第一个匹配的就执行找不到就报错。你可以用echo $PATH查看当前的搜寻路径。如果安装的软件位于/usr/local/mysql/bin这种不在PATH里的目录直接输命令当然找不到。解决办法也很直接要么用绝对路径调用要么把目录追加进PATH。我个人比较推荐前者因为修改PATH虽然方便但改坏了会影响整个Shell环境而且不同发行版的PATH配置文件/etc/profile、~/.bashrc、/etc/environment加载逻辑还不一样排错起来挺折腾的。提示临时把目录加入PATH可以用export PATH$PATH:/your/path只在当前Shell会话内有效。永久生效要写进配置文件的末尾具体写哪个文件取决于你的Shell类型和发行版。另外还有个细节值得注意Shell找到命令之后会把命令执行结果的状态码存进$?变量0代表成功非0代表失败。写脚本时判断上一条命令是否执行成功靠的就是它。很多人在脚本里忽略这个状态码等出问题时才发现排查特别痛苦——这是我最想强调的一个基础习惯命令跑完先看一眼退出码再决定下一步。1.2 绝对路径与相对路径别在小细节上栽跟头路径是Linux操作里最基础也最容易出错的概念之一。绝对路径是从根目录/开始写的完整路径比如/etc/nginx/nginx.conf任何环境下都指向同一个文件。相对路径是相对于当前工作目录的路径比如../data/logs/app.log表示上一层目录下的data目录里的logs文件。实际操作中我见过太多事故是因为相对路径惹的祸写脚本时用相对路径结果被cron任务调用时工作目录一变脚本就找不到文件了。这在运维场景里是非常经典的“测试时好好的一上线就报错”的诱因。我的建议是交互式环境下用相对路径没问题写进脚本、定时任务、systemd服务里的路径一律用绝对路径或者脚本开头先cd到固定目录。用pwd可以随时确认当前工作目录用cd -能快速在最近两次目录之间切换用cd ~回到当前用户家目录。这三个小命令看着不起眼却是日常操作中使用频率极高的基础技能。2. 文件与目录操作最常用命令的完整拆解2.1 ls命令的“三看”思路文件列表还能这样读ls是Linux里使用频率几乎最高的命令但很多人始终只会用ls或者ls -l。我的习惯是把它分成“三看”一看文件名和目录结构用ls或ls -l二看文件类型和权限细节用ls -lh把文件大小自动转成人类可读的K、M、G单位三看隐藏文件用ls -la。三个组合起来文件系统的全貌基本就清楚了。ls -lt是按修改时间排序配合head可以快速找出最近改动的几个文件这在排查问题、确认日志是否在刷新时非常好用。ls -l输出里的第一个字符代表文件类型-是普通文件d是目录l是软链接b与c分别表示块设备和字符设备。后面九个字符是权限位代表属主、属组、其他人的读(r)写(w)执行(x)权限。2.2 cp、mv、rm的底层逻辑先理解inode再动手拷贝cp、移动mv、删除rm这三个命令背后隐藏着一个重要概念——inode。每个文件在磁盘上都有对应的inode它记录了文件的元数据权限、属主、大小、时间戳和数据块指针。cp是创建一个新的inode指向新数据块mv如果目标在同一个文件系统内只是修改目录项指向的inode编号数据本身没有移动所以速度快如果跨文件系统mv会退化成“拷贝删除”。rm则是删掉目录项释放inode和数据块。理解了这层机制很多操作就有了依据。比如cp -a能完整保留权限、时间戳这些属性rm -i删除前逐个确认这个参数我强烈建议所有新手加上mv在同分区移动大文件时瞬间完成不要太惊讶它根本没搬数据。还有一个实用技巧cp file{,.bak}会在同目录快速生成file.bak备份这是Bash花括号展开的一种用法写命令时能省不少事。注意rm删除的文件在绝大多数情况下无法直接恢复尤其是普通分区没有回收站机制。重要数据务必提前用tar或rsync做备份。我见过太多人对着rm -rf删除后的目录发呆这真不是开玩笑的事删除命令一定要停下来确认两秒再回车。2.3 mkdir与touch建立目录和空文件的标准姿势mkdir -p /a/b/c是递归创建目录的标准命令-p的核心作用有两个一是如果父目录不存在则自动创建二是在目录已存在时不报错。这个参数在脚本里非常实用不用前置判断目录是否存在一行命令直接搞定。touch命令有两层作用一是创建空文件这是最常见的用法二是更新已有文件的时间戳。我在排查“文件为什么不生效”时经常用这招——改完配置跑touch更新一下时间然后确认服务是否真的重新加载。养成“修改文件后确认时间戳变化”的习惯能少掉进很多莫名其妙的坑里。2.4 find命令是查找文件的终极方案find命令的威力远超多数新手的想象它是Linux下最强大的文件查找工具没有之一。基本用法是find [搜索路径] [匹配条件] [处理动作]。举个例子find /var/log -name *.log -mtime 7表示在/var/log目录下查找名字以.log结尾、且修改时间在7天之前的文件。-mtime 7表示超过7天没有修改-mtime -1表示最近24小时内修改过。-size 100M能找出大于100M的“大文件”这在排查磁盘空间耗尽时是救命命令。-type f与-type d分别限定文件和目录。更高级的用法是结合-exec直接对查找结果执行后续命令比如find /tmp -name *.tmp -exec rm {} \;其中{}是占位符代表每个查找到的文件。我还习惯用find . -maxdepth 2 -name *.conf来限制搜索深度避免在大目录树里层层扫描导致速度过慢。注意find在权限不足的目录里会输出一堆Permission denied的报错可以加2/dev/null屏蔽掉错误输出让结果看起来更清爽。2.5 ln软链接比快捷方式更强的存在ln -s /path/to/source /path/to/link创建软链接这是Linux世界里的“快捷方式”但它比Windows快捷方式强的地方在于软链接对绝大多数应用是透明的程序访问链接就像访问原文件一样。软链接的实际应用场景非常多——比如把程序版本目录ln -s /opt/app-2.0 /opt/app-current升级时只需重建链接业务代码里的路径不用改一行再比如把日志文件软链到磁盘空间更大的分区。软链接的静态属性可以通过ls -l看到你会看到lrwxrwxrwx这样的权限位以及-指向的真实文件。需要特别注意的是创建软链接时路径写相对路径还是绝对路径行为差异很大。相对路径的软链接如果移动了位置就失效了所以我统一用绝对路径创建软链接宁多敲几个字不给自己埋雷。3. 权限与用户管理为什么命令前面老要加sudo3.1 权限位、属主与属组rwx到底怎么读Linux的权限模型用9个字符表示前三个是属主u、中间三个是属组g、最后三个是其他人o的权限。每组里r读数字4、w写数字2、x执行数字1。chmod 750 file的含义是属主可读可写可执行7421属组可读可执行541其他人无任何权限0。数字权限的本质就是二进制位相加理解了这个任何权限组合都能心算出来不需要背表格。目录的“执行权限”语义是“能否进入该目录”读权限是“能否列出目录内容”写权限是“能否在目录内创建或删除文件”。这也是一个常见的理解误区一个目录如果只有r权限没有x权限你能ls看到文件名但无法cd进入也无法访问里面文件的详细属性。这种情况下命令报错时会让人一头雾水理解了原理就好办了。日常给目录授权建议3和5组合如755、750给文件授权用4和6组合如644、640尽量少用777尽管顺手但意味着任何用户都可以改安全隐患很大。3.2 chown调整属主与属组的实际场景chown user:group file同时修改属主和属组这是部署应用时最常见的操作。典型场景你以root身份把代码解压到/var/wwwWeb服务以www-data用户运行如果不把代码的属主改成www-data服务就可能没有权限读取文件表现出来就是网站404、500或者干脆白屏。修改目录及其内部所有文件的属主要加-R参数chown -R www-data:www-data /var/www。这个R代表递归作用范围是目录本身及所有子内容。这里提醒一点-R用在生产环境大目录上要格外谨慎我曾经因为没注意命令范围把系统目录的属主整个改错了最后花了大半天才恢复。大范围变更类操作执行前先用ls、find看清楚目标范围再动手也不迟。3.3 用户管理与sudo逻辑root权限的正确使用方式useradd创建用户、passwd设置密码、usermod修改用户属性这组命令是Linux用户管理的核心。最常用的组合是useradd -m -s /bin/bash username-m创建家目录-s指定登录Shell。没有-m参数用户就没有家目录运行部分程序时会有奇怪的行为这算一个比较常见的坑。sudo机制解决的问题是不需要把root密码交给所有人但允许特定用户执行特权命令。它的配置文件是/etc/sudoers修改时务必用visudo命令打开——这个命令会在保存前做语法检查防止你写错配置导致sudo直接崩溃。经常有人直接手改sudoers文件改坏了之后sudo就废了这是典型的低级灾难。给用户sudo权限的常见写法是把用户加入wheel或sudo组usermod -aG wheel username。注意这里一定要加-aappend如果不加G参数是“覆盖用户的附属组列表”有可能直接把用户从其他组里剔除影响他的正常权限。这个-a细节是我踩过的坑值得记住。4. 进程管理找、看、杀、控的四步法4.1 进程与服务的区别先搞清楚在找什么进程是运行中的程序实例服务通常指持续运行的后台进程。排查问题时第一步要搞清楚对象是找进程还是找服务找进程用ps、pgrep、top找服务用systemctl在现代systemd发行版上。这两套逻辑不能混着用否则会越查越乱。ps -ef是全面列出当前系统所有进程的标准姿势其中PID是进程号PPID是父进程号CMD是启动命令。另一个等价命令是ps aux输出里还有个CPU和内存占用百分比方便快速看“谁在吃资源”。这两个命令输出一个用标准格式一个用BSD格式本质信息差不多按习惯选一个就行。4.2 top与htop实时监控里隐藏的信息top是Linux系统资源实时监控的老牌工具按q退出。第一行显示系统运行时长、登录用户数、负载平均值——这个负载值如果长期大于CPU核数基本可以断定过载了。第二行是进程总数和状态。第三四行是CPU和内存使用率汇总。下面按资源占用排序的是进程明细默认按CPU排序按M键切换成按内存排序按P键切回CPU排序。htop是top的增强版支持彩色显示、鼠标操作、直接按F9杀掉进程对于新手友好很多。不过生产环境一般不自带需要额外安装。在服务器上如果不想装用top也完全够了关键是看懂那几个指标的含义——特别是load average的三个数它代表过去1分钟、5分钟、15分钟的平均负载如果持续高于CPU核数说明有进程在排队等待CPU系统负载偏高。4.3 kill为什么杀不掉进程信号机制的本质很多新手遇到“kill杀不掉进程”都挺困惑其实kill命令的本质是向进程发送信号而不是直接“杀掉”它。kill PID默认发送SIGTERM信号15请求进程自行退出kill -9 PID发送SIGKILL信号强制内核终止进程。前者是“礼貌地请它走”后者是“不讲道理地直接踢走”。为什么不推荐一上来就用kill -9因为进程收不到清理资源、保存状态的机会可能留下损坏的临时文件、不完整的写入数据。正常的处理顺序是先kill PID或pkill -f 进程名等几秒看进程是否退出确实没反应再用kill -9兜底。定位进程号时可以用pgrep -l 名称能直接列出匹配进程名和PID比ps -ef | grep 名称少绕一层。pkill按进程名批量匹配省去多次kill的麻烦。需要注意它匹配的是进程名不是命令行参数用pkill -f则匹配完整命令行。pkill -f在脚本里挺方便但匹配范围宽容易误杀所以写进自动化脚本前务必反复确认匹配规则。4.4 后台运行与systemd别再用奇怪的方式跑守护进程新手经常用nohup command 让程序在后台运行然后关闭终端程序能继续跑。nohup的作用是让命令忽略SIGHUP挂断信号是把进程放入后台。这招临时调试可以生产环境不推荐——进程一旦崩了没人拉起来重启后也不会自动恢复。真正的常驻服务应该交给systemd来管。写一个/etc/systemd/system/myapp.service配置文件定义ExecStart、Restart策略然后systemctl daemon-reload重载配置systemctl enable --now myapp启用并立即启动。这样能开机自启、崩溃自动重启、统一用systemctl管理日志。运行中的服务可以随时保存状态管理方式也规范很多。生产部署里我基本不用裸nohup进程跑服务这也是项目稳定性的一个重要保障。5. 文本处理三板斧grep、sed、awk的实战用法5.1 grep不只是过滤还能反向匹配与递归搜索grep是日志排查和日常过滤里用的最多的命令。基本用法grep 关键词 文件会输出包含关键词的行。它真正的价值在于组合参数grep -i忽略大小写grep -n显示行号grep -v反向匹配即输出不含关键词的行grep -c只统计匹配行数。查看nginx访问日志时grep -c 404 access.log一条命令就能数出一共有多少条404这是非常高频的统计场景。排查整个项目日志和配置时grep -r 关键字 /etc/nginx/递归搜索目录下所有文件--include*.conf可以限定只看conf后缀的文件高效且不容易被无关文件干扰。管道搭配更是基本操作ps -ef | grep nginx过滤进程列表后面习惯性加| grep -v grep把grep自身那行过滤掉也可以用pgrep替代省去这一步。提示写grep的关键词时尽量用单引号包裹防止Shell把特殊字符展开。比如grep error.*timeout里的*如果不用引号包住容易被Shell通配符吃掉执行结果就不受控了。5.2 sed流式编辑器的核心套路sed全称stream editor流式编辑器它的核心能力是按行处理文本。最常用的两个操作是替换和删除sed s/旧/新/g 文件全局替换在每行中把所有匹配“旧”的字符串替换成“新”sed 3,5d 文件输出时删除第3到第5行。日常使用sed -i s/old/new/g 配置文件直接修改文件内容-i表示原地编辑。这里我强烈建议习惯性加备份后缀sed -i.bak s/old/new/g 文件会在原地生成一个文件.bak备份文件。这个习惯能救命——批量替换后发现问题一条mv命令就能还原不用重新部署。我在生产环境批量改配置时都会保留七天左右的备份确认无误再清理。sed依赖正则表达式做匹配如果要匹配包含/的路径可以用#作分隔符避免转义地狱sed -i s#/var/log#/data/log#g 文件。这个细节虽然不是大知识但在实操里能省下大量转义字符。5.3 awk按列处理文本的利器学会就回不去了awk默认把每行按空格或Tab分割成多个字段往后的字段用$1、$2、$3表示。经典用法是在ps aux输出里提取PID列ps -ef | awk {print $2}。更实用的场景是按条件过滤列比如awk $3 500 {print $1, $3} file.txt表示第三列数值大于500才输出第一列和第三列。awk的冒号、逗号等自定义分隔符可以通过-F参数指定awk -F: {print $1} /etc/passwd。这在处理CSV文件、日志文件时极其常见。awk还支持内置变量NF当前行字段数和NR当前行号比如awk -F: NR1 {print $0}只输出第一行——当然这只是一种玩法实际取第一行用head -1更直接。grep、sed、awk三者在文本处理里经常配合使用grep快速定位含关键词的行sed批量替换内容awk提取指定列做统计分析。三招组合下来日常工作里绝大多数的文本处理需求基本都能覆盖不需要装什么额外的分析工具。6. 网络排查与文件传输从ping到scp的一站式方案6.1 连通性测试的不止ping还有telnet和nc排查网络问题时ping能测通不代表目标服务就能访问因为ping走的是ICMP协议而网站服务大多走TCP协议。一个服务能不能连接需要测TCP端口。telnet IP 端口一测便知——能连上会进入空界面Ctrl] 然后quit退出连不上直接报Connection refused或超时。ncnetcat功能类似nc -vz IP 端口用 -v显示详细信息、-z只探测端口不发送数据。我平时用nc比telnet多因为nc还能做端口扫描、文件传输、简单的网络调试而且很多发行版默认安装。这个探测习惯值得养成一句话的连通性确认能少走很多弯路。6.2 ip、ss与curl新一代惯用指令组合传统的ifconfig和netstat在很多新发行版上已经不再默认安装或输出格式变动官方推荐是用ip和ss替代。ip addr查看网卡和IP信息ip route查看路由表最重要的一条ip a其实是ip addr的简写看IP地址基本就靠它。ss -tlnp列出所有处于监听状态的TCP端口以及对应的进程——这是排查端口占用时最高频的命令。它的精髓在于-t只看TCP-l只看监听状态-n不解析服务名直接显示端口号-p显示进程信息。四参数组合一条命令解决八成的端口排查问题。curl则是测试HTTP服务的神器curl -I 网址只看响应头能快速确认服务版本、状态码curl -v 网址显示详细交互过程排查接口问题时比浏览器方便得多。6.3 文件传输组合拳scp、rsync和tar服务器之间搬运文件scp 文件 用户名目标IP:目标路径是最快的入门方案本质上是基于SSH的加密传输。需要传目录加-r需要保留权限和时间戳加-p。步嫌麻烦就用rsync它的增量同步特性在反复部署时优势巨大rsync -avz 本地目录/ 目标IP:目标目录/其中-a归档模式保留属性-v显示过程-z传输时压缩。rsync断点续传能力强中断后重跑一遍只传剩余部分效率远高于scp全量重传。远程打包再拉取也是常见的场景tar czvf backup.tar.gz /data打包压缩然后scp backup.tar.gz 目标IP:/backup/传走在目标机器tar xzvf backup.tar.gz解压。tar的z参数是调用gzip压缩J参数是xz压缩压缩率更高但更慢。建议存备份用j临时传文件用z平衡速度和体积。6.4 wget与curl下载文件的正确姿势wget 网址是最直接的下载命令默认下载到当前目录。常用参数包括-O 文件名自定义保存名-c断点续传-r递归下载整个网站爬站时用-q安静模式。curl则更偏接口测试但下载文件同样顺手curl -o 文件名 -L 网址其中的-L参数能自动跟随重定向这个参数经常被忽略但下载文件时特别重要不加大概率只拿到一个空的或错误的重定向页面。tar包下载后还要顺手校验一下完整性用md5sum 文件算个校验值跟官方对比一下虽然简单但在公网下载场景里能挡住不少坏包。别嫌这步多余我遇到过下载一半网络断了文件大小看起来正常但解压时各种报错最后定位就是下载损坏。7. 磁盘空间与日志处理服务器最能吃紧的两个方向7.1 df与du磁盘占用排查的标准姿势df -h查看文件系统整体占用情况-h参数把容量转换成G、M这些人类可读的单位。输出里重点关注Use%接近100%的挂载点。du -sh 目录查看目录总大小-s只显示汇总、-h人类可读。磁盘满了不知道谁占的就用du -h --max-depth1 /看到第一层目录的大小排行再逐层往深查很快就能揪出罪魁祸首。网上常看到“du和df显示的容量不一致”的问题常见原因是有文件被删除但进程还持有文件句柄空间没有真正释放。用lsof | grep deleted能找出这些“幽灵”文件把对应进程重启或杀掉后空间就回来了。这个坑在清理大日志、更新程序版本时经常遇到值得记进排查清单。7.2 清空日志文件的两个原则别rm别暴力日志文件处理是我见过最多错误操作的地方。有人图省事直接rm -rf /var/log/nginx/access.log然后发现nginx老报错——因为日志文件被删了但nginx还握着旧的inode不放不会自动创建新文件。正确做法是 日志文件或者truncate -s 0 日志文件把文件内容清空但保留inode和文件句柄服务完全感知不到变化。第二个原则是先备份再清理。日志有时候是排查问题的唯一线索不分青红皂白清空等于销毁线索。正规做法是先cp access.log access.log.$(date %Y%m%d)按日期归档归档后用上面的方式清空原日志保留一段时间再删除压缩包。配合logrotate自动轮转更省心但手动清空日志时记住这两条原则基本不会出大问题。7.3 dmesg与journalctl系统日志的正确打开方式dmesg查看内核环形缓冲区消息主要用来排查硬件、驱动层面的问题。比如突然发现某个网卡掉线dmesg | tail -50能看到内核记录的网络链路状态变化磁盘报IO错误也会有记录。普通用户看dmesg可能提示权限不足需要sudo执行。systemd发行版的日志统一由journald管理用journalctl查看。journalctl -u nginx只看nginx服务日志journalctl -u nginx --since 1 hour ago只看最近一小时journalctl -f实时跟踪日志输出类似tail -f的效果。我以前排错习惯直接翻/var/log下的文件现在优先journalctl因为更集中、过滤更方便而且能看到系统重启前后的完整时序。8. 综合实战一个排查思路演示这三个场景怎么串起来8.1 场景一网站访问变慢从头怎么查假设业务反馈网站很慢登录服务器第一件事uptime看负载如果发现load average明显高于CPU核数说明系统资源吃紧。接着top看哪个进程CPU占用率高——如果是Java进程用top -Hp PID查看线程级别的消耗如果是数据库进程可能需要进一步看SQL慢查询。这中间用free -h检查内存是否不足df -h确认磁盘有没有满。如果系统资源都正常再怀疑网络链路ping测连通性、ss -tlnp确认服务端口在监听、curl -I http://localhost/验证本机访问是否正常。本机正常、外部慢那就是网络设备和链路的问题可以从服务端入口开始一层层往上追。整套排查过程就像剥洋葱一层层缩小范围基础命令的使用就在这里体现出价值。8.2 场景二磁盘报警的处理流水线收到磁盘使用率超90%的告警先df -h确认哪个分区满了——根分区满和业务数据分区满的处理思路不同。然后du -h --max-depth1 /路径逐层定位大目录。过程中如果空间已经满到命令都写不进日志就先ls看有没有明显的大文件比如意外生成的core dump文件或超大日志直接按前面说的方式清掉最占空间的。清理时要特别小心大日志文件的处理按“先归档、后清空”的原则来。如果清完发现空间还是没回来执行lsof | grep deleted找被杀却还占着空间的进程该重启的重启。整个流水线下来一般不超过十分钟靠的全是基础命令的组合运用。8.3 场景三确认服务是否正常的三连检查确认一台服务器上的Web服务是否正常我习惯用三条命令快速验证ss -tlnp | grep 80确认端口在监听systemctl status nginx确认服务状态是activecurl -I localhost确认本地能正常返回HTTP响应。三条都通过再看外部访问是否正常外部不行就从防火墙规则开始查。这套三连检查在平时排查问题、发布验证时都很好用十几秒内就能给服务状态下一个清晰判断。很多问题其实是层层嵌套的基础命令的价值就是在每个环节给你一个明确的、无歧义的结论帮你在最短时间内锁定真正的瓶颈。9. 关于命令记忆与进阶路径的几点心得写到最后想分享的是Linux命令不是背出来的是用出来的思路。刚开始记不住很正常我早期也是靠“用到哪查到哪”慢慢形成肌肉记忆。真正支撑记忆的其实是理解概念——理解了PATH是查找路径、权限位是三个三位二进制、inode是文件唯一标识、信号是进程通信手段很多命令行为就能推导出来不需要死记参数。进阶路径上建议分三步走先把这篇提到的命令用熟做到输出一个需求就能知道该用什么命令然后刻意练习Shell脚本把命令组合起来完成自动化任务比如定时备份、日志归档、服务健康检查最后结合Python或Ansible这类工具做更复杂的运维管理。每一步都以前一步为基础但都不难跨过去。一个额外建议是准备一个自己的命令笔记随时把踩过的坑、好用的小技巧记下来。很多年后回头看那才是真正属于自己的“Linux基础命令大全”。
返回列表