ARTICLE DETAIL

资讯详情

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

Linux常用命令详解:从文件操作到网络排查的实战指南

Linux常用命令详解:从文件操作到网络排查的实战指南 1. 为什么Linux命令值得花时间死磕我最早接触Linux的时候和你一样对着黑乎乎的终端发怵。鼠标点来点去的图形界面突然没了连个文件夹都打不开那种挫败感我记得很清楚。但工作几年后回头看Linux命令行恰恰是这个系统最值钱的东西——它不只是能用而是让你真正说了算。平时被问得最多的就是Linux常用命令到底要学哪些。这个问题背后其实藏着两个层面的需求刚入门的同学想要一张安全的地图知道从哪儿开始不至于迷路干运维和开发的老手则希望查漏补缺看看有没有什么命令能提升效率、少踩坑。这篇内容就是冲着这两个需求来的我会从文件操作、文本处理、进程管理、用户权限、网络排查这些最核心的板块入手把每个命令讲透——命令是什么、参数怎么选、踩过的坑有哪些尽量做到拿过去就能用。先说个我的观点学习Linux命令不要试图背下所有东西。命令有上千个参数更是多到离谱没人能全记住。你要掌握的是那几十个高频命令的常用参数再加上一套查手册的方法。遇到没见过的命令man一下、--help一下大多数问题都能解决。关键是把这些命令的使用逻辑内化——理解了Linux一切皆文件、命令加参数的设计思路你学新命令的速度会快很多。2. 目录与文件操作的底子功夫2.1 ls、cd、pwd每天重复最多的三个命令ls、cd、pwd这三个命令绝对是每一个Linux用户最先接触的。但越是基础的东西越容易漏掉好用的参数。每次看到有人光秃秃地敲一个ls我都想提醒他试试ls -lh——-l展示详细信息-h把文件大小换算成人话K、M、G不然你看到的是一串让人头晕的字节数。还有一个参数是ls -a显示隐藏文件。Linux里以点开头的文件默认不显示比如.bashrc、.gitconfig这些往往是配置的关键。排查环境变量不对、命令不生效的问题经常要靠ls -a才能发现端倪。至于cd除了常见的路径切换cd -可以回到上一次所在目录cd ~回到用户主目录这两个快捷操作能省不少事。pwd这个命令很多人觉得多余当前路径不是都在命令行提示符里有吗话是这么说但当你写脚本的时候脚本里需要获取当前绝对路径pwd就是标准答案。顺带一提pwd的物理路径和逻辑路径有时候不一致——比如通过符号链接进入目录时默认显示的是逻辑路径加-P参数才显示真实物理路径。这细节平时用不上排查问题时可能就救命了。2.2 cp、mv、rm别把数据搭进去cp和mv是日常拷贝、移动文件的工具但有几个参数你必须记住。cp -r递归复制目录漏了这个参数会直接报错omitting directorycp -p保留文件属性包括权限、时间戳备份配置文件的场景特别好用。mv在同一文件系统内是改名跨文件系统才会真正复制再删除理解这个差异有助于预估操作耗时。至于rm我要单独拎出来说一句rm -rf是Linux世界最危险的命令之一没有之一。网上各种段子——删库跑路、rm -rf /——都不是玩笑生产环境出事的基本都是它。我的习惯是高危操作前先看一眼当前目录pwd确认自己在哪儿删除前用ls看清楚目标实在没把握就先mv到一个临时目录而不是直接删观察一段时间没问题再清掉。这算是脏活干多了总结出来的经验别嫌麻烦。另外rm -i可以开启交互确认虽然每次都要敲y有点烦但总比误删强。2.3 find、tar查找与打包组合拳文件多了之后记不住放哪很正常。这时候find就派上用场了。find /path -name *.log按文件名找find /path -type f -size 100M按大小找超过100MB的文件find /path -mtime -7找最近7天内修改过的文件——清理磁盘空间、排查日志增长这些是最高频的场景。还有tar打包压缩的标准工具。tar -czvf archive.tar.gz /path是打包并压缩-xzvf是解包解压。参数里c是创建、x是提取、z是gzip压缩、v是显示过程、f指定文件名。这个组合看一遍就能记住但有个细节要注意f必须是最后一个参数因为-f后面要紧跟文件名。写成tar -cvfz是会报错的。打包解包的另一个坑是路径问题。在A目录用tar -czf /tmp/test.tar.gz ./conf打包的相对路径解包时会还原为./conf结构如果用的是绝对路径解包时会有覆盖系统文件的隐患。所以打包前尽量先cd到目标目录的父级用相对路径操作。2.4 文件查看cat、less、tail的取舍cat适合查看小文件直接输出全部内容简单粗暴。文件一大刷屏不说还容易看得眼花。less是分页查看的王者支持上下翻页、按/搜索关键字、按q退出看日志、看长配置文件基本都用它。tail则专注尾部tail -f可以持续跟踪文件新增内容——排查实时日志的首选命令CtrlC退出跟踪就行。这里给个实用建议日志文件的查看优先用tail -fn配合一个数字比如tail -fn 100 app.log意思是一直跟踪app.log并且先显示最后100行。刚起服务的时候这句命令几乎成了肌肉记忆。要注意的是tail -f对文件被rotate轮转切割的情况跟踪会断开这时候用tail -F大写会在文件被重建后自动重新跟随这个细节能省不少麻烦。3. 文本处理三剑客grep、sed、awk3.1 grep最被低估的搜索工具grep的江湖地位可以说仅次于ls。它做的是在文本里按模式搜索并输出匹配行。最常用的参数包括-i忽略大小写-v反向匹配排除某些行-r递归搜索目录-n显示行号--color高亮匹配内容。实际工作中grep经常和管道配合使用。比如ps -ef | grep java找出Java相关进程cat error.log | grep -i timeout在日志里搜超时信息。再进阶一点grep -E启用扩展正则grep error|fail log这种写法可以一次匹配多个关键词。搜索代码的时候grep -rn functionName src/能快速定位函数在哪个文件里出现过。一个我经常踩的坑grep搜出来的结果里有时会包含grep本身那条进程。比如ps -ef | grep ssh结果里会出现一条grep ssh的进程行这其实是ps命令执行完、grep在管道里运行时进程列表已经包含它的快照导致的。解决办法是用grep ssh | grep -v grep或者用更规范的方式pgrep -f ssh——这是后话。3.2 sed流式文本编辑sed是做文本替换、插入、删除的利器它逐行读取内容、处理、再输出所以叫流编辑器。最常见的用法是替换sed -i s/old/new/g file.txt把文件里所有old替换为new-i表示直接修改原文件g表示全局替换不加的话只替换每行第一个匹配。这里必须警告一句不要轻易对重要配置文件使用sed -i更不要随手敲错替换表达式。我曾经把线上配置里的true替换成false一条命令下去服务全部异常。如果一定要用先跑一遍不加-i的命令看输出是否符合预期确认没问题再真正执行。或者给原文件先做个备份cp file.txt file.txt.bak。高级场景里sed还能按行号操作。sed -n 10,20p file打印第10到20行sed 5d file删除第5行。日志提取、配置文件批量修改sed的效率和灵活性远超手动编辑。3.3 awk按列处理的瑞士军刀如果说grep按行筛选、sed按行编辑那awk就是按列做结构化处理的神器。awk {print $1, $3}打印每行的第1列和第3列默认按空白分隔。查看磁盘空间时df -h | awk {print $5}可以单独把使用率列拎出来再配合排序就能很快找到磁盘快满的分区。awk还支持条件判断和统计。awk $3 100 {print $1}找出第三列大于100的行awk {sum $1} END {print sum}对第一列求和。日志分析的场景统计某段时间的请求量、计算平均响应时间awk基本就是标准答案。我理解awk最核心的思路它把每一行想象成一条记录每一列想象成一个字段然后你可以定义当某字段满足条件时对这条记录做什么。思路一旦通了awk就不再是背语法而是你处理文本时的思维方式。3.4 管道与重定向的威力把文本处理命令串联起来的是管道符|和重定向、、。管道的作用是把前一个命令的输出作为后一个命令的输入。cat access.log | awk {print $1} | sort | uniq -c | sort -rn这条经典的命令组合可以快速统计日志里访问次数最多的IP——先取出第一列IP排序去重并计数再按计数降序排列。重定向则负责把输出写到文件里。command file覆盖写入command file追加写入2处理错误输出。比如后台任务日志收集nohup ./start.sh startup.log 21 ——这句命令里的21意思是把标准错误也送到标准输出去统一写进日志文件。不加它的话程序报错信息会丢失排查时一脸懵。一个实用小技巧临时想把命令输出存下来再慢慢看可以用command | tee output.txttee会同时把内容显示在屏幕并写入文件很是方便。4. 进程与系统状态管理4.1 ps、top、htop看清系统在忙什么进程管理是运维排查的第一站。ps -ef查看所有进程的详细信息ps aux以另一种格式展示CPU、内存占用。两者用哪个习惯问题ps -ef在脚本里更好解析ps aux人眼更友好。但很多时候它们配合grep才是完整用法比如ps aux | grep -i nginx看Nginx进程状态。top是实时监控的利器每两三秒刷新一次显示CPU、内存、负载还能按占用排序。负载高的时候第一件事就是top看是哪个进程在吃资源。按下P键按CPU排序按下M键按内存排序这两个快捷键比盯着一屏数据干瞪眼高效得多。htop是top的增强版可以滚动、鼠标操作界面更友好但很多最小化安装的系统默认没装需要自己装一下。内存这块还有一个命令容易被忽略free -h。free按G、M的单位显示内存使用情况重点看available那一列——它才是真正可用的内存量而不是简单地用total - used去算。Linux的内存管理机制会尽量利用空闲内存做缓存所以used看着很高别慌available才是判断内存是否紧张的关键指标。4.2 kill、systemctl、nohup管理进程的生命周期kill命令的名声不太好因为它常和杀进程绑定。其实kill的本质是向进程发送信号默认发送SIGTERM15号信号请求进程优雅退出。进程不听话的时候才需要kill -9SIGKILL直接强制终止——这是最后手段因为进程可能来不及保存状态、清理资源。kill -9常用在什么场景进程卡死、无法响应正常退出请求时。但要注意强制杀掉数据库、消息队列这类有状态服务可能导致数据不一致所以能用SIGTERM就让进程自己收拾再退出尽量不要上来就-9。查看进程占用端口时lsof -i :8080能告诉你谁在监听8080端口netstat -tunlp | grep 8080也是同样的效果这对定位端口冲突是必不可少的工具。现代Linux系统的服务管理一般通过systemctl完成。systemctl start/stop/restart nginx控制服务启停systemctl enable nginx设置开机自启systemctl status nginx查看服务状态。刚部署完一个服务一定记得systemctl daemon-reload让systemd重新加载配置否则改动可能不生效。后台运行则常需要nohup。nohup command 让命令忽略挂断信号、放到后台跑输出默认写到nohup.out。服务器上跑个长任务、脚本不想因为CtrlC或断开会话导致中断nohup就是简单可靠的方案。4.3 df、du、uptime磁盘、负载快速体检磁盘空间告急时df -h看各分区使用情况哪一行Use%接近100%基本就是它了。定位到具体目录后用du -sh *查看当前目录下各个子目录占了多少空间逐层深入最多两三分钟就能找到大文件藏身之处。我处理过一次磁盘告警du -sh /var/log/*发现/var/log/journal占了20多G清掉过期日志后空间立刻释放了。系统负载高不高uptime一眼就能看明白。它显示系统运行时长以及1分钟、5分钟、15分钟的负载均值。负载值超过CPU核心数说明有过载——如果4核机器负载干到8甚至12那基本就是有进程在疯狂吃CPU或者大量任务排队。配合top看具体进程定位问题很快。这几条命令组合起来就是一套标准的体检流程uptime看负载、free -h看内存、df -h看磁盘、top看进程。我处理线上问题的习惯就是先跑这套基本能快速判断是哪一类问题再决定往哪个方向深入。5. 用户、权限与网络基础5.1 用户管理和权限模型Linux是一个多用户系统用户和权限管理是安全的基础。useradd新建用户passwd设置密码usermod -aG group user把用户加入某个组——这三个命令构成了日常用户管理的核心。新手容易忽略的是-aG一定要带-a它表示追加不加的话会把用户从原来的组里移除造成权限变化这个坑我见过不止一次。权限本身通过chmod管理比如chmod 755 file设置文件权限为所有者可读写执行组和其他人可读可执行chmod x script.sh给脚本加上执行权限。理解权限数字的含义很有用rwx对应4、2、1三组权限分别指所有者、所属组、其他人组合起来就是755、644、700这些常用值。chown负责改所属用户和组比如chown -R www:www /var/www/html把网站目录归属给www用户这是部署web服务的常见操作。一个容易踩的坑Nginx或PHP-FPM读取文件时报权限拒绝80%的情况不是文件权限本身不对而是运行用户的身份和文件属主不匹配。比如文件归属于root但服务以www用户运行这时候就要么改文件属主要么把服务用户调整一下而不是盲目chmod 777。chmod 777确实能解决权限问题但它让任何人都能改你的文件安全风险极高最好永远不要在生产环境这么干。5.2 网络基础命令ping、curl、telnet排查网络问题最常用的工具是ping、curl、telnet。ping验证主机是否可达、延迟如何curl发HTTP请求调试接口、验证服务端返回curl -I只看响应头、curl -v输出详细交互过程排错的时候-v几乎是必开参数。telnet ip port则用来验证某个端口是否开放比如telnet 192.168.1.10 3306快速确认MySQL端口通不通。端口和连接状态的排查netstat和ss是两个主命令。netstat -tunlp列出所有监听端口和对应进程ss -tuln更轻量快速。ss -lnt查看所有处于监听状态的TCP端口配合grep可以精确过滤。连接数统计可以用ss -s看系统级连接汇总快速判断是否有大量连接堆积。线上连接数突增时ss的统计信息比netstat直观得多这也是为什么我建议新接触Linux的同学直接学ss。curl还有一个隐藏用法——测延迟。curl -w time_total: %{time_total}s\n -o /dev/null http://example.com可以精确测出请求总耗时time_connect和time_starttransfer分别表示TCP建连时间和开始传输时间用来判断性能瓶颈在连接阶段还是传输阶段很有效。5.3 系统信息uname、hostname、lscpu想快速了解这是一台什么机器uname -a输出内核版本、主机名、架构hostnamectl显示更详细的操作系统版本信息lscpu查看CPU型号、核心数lsblk查看磁盘设备树。排查兼容性问题、确认架构x86_64还是aarch64时这几条命令就是标准动作。比如下载安装包的时候先确认架构再选择下载版本可以避免装到一半发现不匹配。还有一条比较隐蔽但实用的命令cat /etc/os-release可以查看发行版的具体版本号比如Ubuntu 20.04还是22.04。不同发行版、不同大版本的包管理方式和默认配置差异很大很多坑都是版本差异造成的。所以拿到一个陌生环境我第一件事就是cat /etc/os-release心里有个底再操作。6. 常见问题与排查技巧实录6.1 命令找不到多半是PATH的问题刚执行一个命令系统提示command not found第一反应不应该是命令没装而是看看这个命令是不是在PATH变量覆盖的目录里。echo $PATH查看当前PATHwhich command看命令实际路径。如果命令装在/usr/local/bin而PATH里没有这个目录系统自然找不到。解决办法是把路径加进PATHexport PATH$PATH:/usr/local/bin需要永久生效就写进~/.bashrc或~/.profile。另一个常见场景是明明装了软件命令却找不到。这通常是因为安装到非标准目录了。比如手动编译安装的软件默认可能在/usr/local下而你的PATH没有包含它。这时候不是重装而是调整PATH或者用软链接ln -s /usr/local/xxx/bin/xxx /usr/bin/xxx把命令链接到系统标准目录。6.2 文件删除不了权限和占用两头查rm: cannot remove file: Permission denied先看文件属主和当前用户身份——ls -l确认属主id确认当前用户如果文件属于别人且没有写权限就需要提权或切换到对应用户操作。还有一种更隐蔽的情况文件被进程占用。Linux下文件被打开后即使删除了磁盘空间也不会立刻释放因为进程还持有句柄。如果不重启进程磁盘空间就会一直占着。排查占用时lsof | grep deleted能列出已删除但仍被占用的文件。找到对应PID后让进程释放句柄或重启服务空间才会真正回收到磁盘。这个坑在解决磁盘总是满但找不到大文件的问题时很关键——du看不到它因为文件在文件系统里已经被删除了但空间还没释放。6.3 磁盘空间明明删了文件却还是满的接上面说的删了文件空间没释放几乎都是进程占用导致的。日志文件被tail -f或应用进程打开着删除后进程继续往已经被删除的inode写内容空间一直涨。定位手段就是lsof | grep deleted找出占用的进程重启或让应用重新打开日志文件。日常预防的办法日志切割用logrotate按天/大小自动轮转并且压缩旧日志避免单个日志无限增长应用日志文件不要直接删除而是用 file.log清空这样进程持有的文件句柄不受影响空间也能释放。6.4 端口被占用找到并解决冲突启动服务报Address already in use基本就是端口冲突。ss -lntp | grep 8080能看到8080端口被哪个进程占用然后决定是杀掉占用进程还是换一个端口。线上环境我一般倾向于换端口——杀进程影响面不可控改配置重载服务更平稳。端口检查要区分TCP和UDPss -lutnp同时查看两类另外注意IPv4和IPv6的差异有些服务只监听在::IPv6任意地址但数据显示可能让人困惑。实在查不到问题tcpdump抓包是终极手段但那是另一个话题了普通排查用到ss基本足够。6.5 面试常问的高频命令综合场景结合面试场景说说面试官问Linux常用命令其实不是考你背了几条命令而是看你怎么用它解决实际问题。比较经典的面试题包括查看系统负载用什么命令uptime、top查找并杀死某个进程ps aux | grep xxx配合kill统计日志里出现次数最多的IPawk、sort、uniq管道组合查看端口占用ss -lntp实时查看日志tail -f。还有一道我经常见到的如何快速清空一个大文件但又不删除文件本身cat /dev/null access.log或者 access.log都能把文件内容清空而保留文件。这道题看起来简单但考察的是对文件系统、进程占用、重定向的理解深度。7. 让命令真正长在手上的几个习惯最后分享几个我自己一直坚持的习惯不算什么高深理论但确实让命令的掌握变得扎实。第一个习惯是别背要用。命令光看教程记不住真正记牢的场景都是在处理问题时——磁盘满了去查、服务起不来去查、日志刷屏去筛查过一次就不会忘。我建议准备一个环境哪怕是虚拟机把常用的命令逐个过一遍制造一些故障来练习排查比对着文档抄一百遍都管用。第二个习惯是先看手册再动手。遇到不熟悉的命令先man 命令或者命令 --help看选项不要凭感觉猜。很多人觉得看英文帮助文档痛苦但那些帮助信息写得其实很清楚每个选项都有说明。碰到不理解的地方配合一个专门的搜索基本都能解决。第三个习惯是写脚本要敢于用组合命令。单条命令能力有限管道一组合威力就出来了。平时多积累一些命令片段——比如清理过期日志、统计接口响应时间、备份配置文件——用的时候能直接拿出来改改就上效率会高很多。说白了Linux命令不是知识是手艺。多敲、多查、多踩坑手上自然就有感觉了。希望这篇整理能帮你少走点弯路有没说清的地方欢迎在评论区继续交流。
返回列表