尧图网站设计 尧图网站设计YAOTU DESIGN
ARTICLE DETAIL

资讯详情

深耕网站设计与一线实操的经验洞察。

超全Linux命令笔记:系统学习与运维排查必备指南

超全Linux命令笔记:系统学习与运维排查必备指南 刚接触Linux那会儿我对着一屏幕命令行完全是懵的。很多同学以为Linux难在“背命令”真正上手之后才发现难的是不知道在哪个场景下用哪条命令以及命令参数为什么要这么写。这份Linux常用命令笔记最初是我跟完尚硅谷的Linux课程之后陆续整理出来的后来在实际环境和工作中反复补充最后变成了一本超过2万字的Linux命令速查笔记既能跟着系统学一遍也能在遇到具体问题时随时搜索定位。如果你正在学Linux、准备运维岗位的面试或者在工作中经常要碰服务器这份笔记的思路和命令细节都值得你花点时间刷一遍。1. 整体设计思路为什么要把命令整理成“超全笔记”1.1 一份命令笔记的核心价值在哪很多人觉得Linux命令网上搜一搜就有没必要自己整理。但真到用的时候就会发现搜索引擎给的结果碎片化严重同一个命令在不同发行版、不同版本里可能有细微差别评论区还经常吵架。自己整理一份笔记最大的好处是把“知识”变成“自己的索引”——你知道自己写过什么、为什么要这么写、踩过哪些坑。我做这份笔记时有三个明确目标系统性不是命令的堆砌而是按照使用场景分门别类学的时候能顺着一条线走下来。实用性每条命令都配上具体案例和常用参数保证看了就能用而不是只给一个干巴巴的语法。检索性建立索引机制CtrlR搜索历史、grep笔记内容、按功能分区跳转快速定位命令。至于为什么是“2w字”其实不是刻意追求篇幅而是把每个命令的“为什么这么用”也写进去了。比如rm -rf很多教程只说“强制删除”我还会写上“慎用没有回收站删错就是永久丢”。这种细节才是笔记真正值钱的地方。1.2 按功能分区、按场景检索而不是按字母表我刚整理笔记时习惯用A-Z排序后来发现完全行不通。你遇到问题时脑子里想的不是“以r开头的删除命令叫什么”而是“我要删一个目录得用哪个命令”。按字母排序的命令表只适合查缺补漏不适合解决实际问题。所以我最终把笔记分成几个大块文件和目录操作、文本处理、用户权限、网络端口、进程服务、系统磁盘、文件传输、软件包管理等。每个大块下面再列具体命令。这样的好处是你在“看日志”这个场景下直接去文本处理那块找tail、grep、less在“部署服务”场景下去进程管理那块找systemctl、nohup。同时加了一个“速查索引”把所有命令和对应的功能写在一起比如命令功能笔记章节ls -lh人性化显示文件大小文件与目录grep -E扩展正则匹配文本处理ss -lntp查看监听端口网络排查df -h查看磁盘占用系统磁盘这样两种检索方式都有场景驱动时按章节翻精确查询时看索引。1.3 整理笔记时我用到的几个技巧我用的工具是Markdown Obsidian纯文本格式方便搜索、方便同步也不会被某个软件绑死。每条命令我基本按这个格式记录命令是什么一句话功能说明。常用参数挑真正常用的几个不写全量参数。实例直接粘一个我跑过的命令和输出。坑记录我踩过的坑和注意事项。举个我自己笔记里的例子command -v nginx这条命令用来判断一个程序是否已安装。它比which更通用因为which在某些精简环境中可能不存在而command -v是shell内置的功能兼容性更好。我在笔记里特意标注了这一点。这种“从实际对比中得来的经验”才是笔记和其它文档拉开差距的地方。2. 常用命令核心分类详解2.1 文件与目录操作最常用也是最容易出事的一类文件操作是整个Linux操作体系的底座。这部分我建议新手不要光背参数而是每个命令都到虚拟机里敲一遍尤其要理解ls -l输出里每一列的含义——文件类型、权限、硬链接数、属主、属组、大小、修改时间、文件名。我整理时重点保留了这些ls-l列表、-a显示隐藏、-lh人类可读、-t按时间排序。cdcd -返回上一次目录这个在长路径切换时非常好用。pwd查看当前完整路径。mkdir-p递归创建目录例如mkdir -p /data/logs/nginx。cp复制文件用cp -r复制目录加-i会在覆盖前提醒。mv移动文件或重命名平时用得非常多。rm删除文件rm -rf删除目录但千万慎用。lnln -s创建软链接类似Windows的快捷方式。举一个我经常用的例子备份Nginx配置时我会这样操作cp /etc/nginx/nginx.conf /etc/nginx/nginx.conf.bak_$(date %F)$(date %F)会自动替换成当天日期这样每天备份的文件名是唯一的不会互相覆盖。这种写法在很多运维脚本里都能看到理解了它你就明白为什么Shell脚本里需要命令替换这个能力。关于ln很多人搞不清软链接和硬链接。我打一个比方软链接像快捷方式指向的是路径原文件删了它也跟着失效硬链接像给同一个文件起了个别名两个名字指向同一个数据块删掉其中一个另一个还能正常访问。日常使用中软链接是绝对的主流比如/usr/bin/python3可能就是一个软链接指向实际安装的Python版本目录。2.2 文本查看与处理Linux下排查问题的基本功服务器上出了任何问题最终几乎都要落到日志排查上而日志就是文本。所以文本命令熟练程度直接决定你排查问题的速度。日志查看三件套less、tail、grep。less分页查看大文件按/搜索关键字按n跳到下一个匹配项。查看几百MB的日志时它也不会卡死。tail看文件尾部tail -f实时跟踪日志输出部署完服务一般都会用它盯着启动日志。grep按关键字过滤grep -E支持扩展正则grep -v排除匹配行grep -c只统计数量grep -n显示行号。普通查看小文件用cat就行但大文件千万别用cat它会一次性把内容全打到屏幕上既费内存又伤眼睛。文本处理还有两个很强大的命令sed和awk。很多新手看到这两个命令就发怵其实只需要掌握最常见的用法就够了# 查看第5行到第10行 sed -n 5,10p /etc/passwd # 把文件里的旧的IP替换成新的IP sed -i s/192.168.1.10/192.168.1.20/g /etc/nginx/conf.d/test.conf # 打印第一列 awk {print $1} /tmp/access.logsed -i是直接修改文件操作前一定备份我见过太多同事手滑把线上配置改坏。awk默认按空格或Tab分割字段$1就是第一列$0是整行。处理表格样式的文本时这招非常管用。组合起来威力更大。比如查看访问日志里访问量排前十的IPawk {print $1} /tmp/access.log | sort | uniq -c | sort -rn | head -10这行命令用管道把四个命令串起来第一个命令取第一列IP第二个排序第三个统计出现次数第四个按次数倒序排列最后取前10行。理解了管道和文本命令的组合你就能开始干很多“高级”活。2.3 用户与权限管理搞懂权限数字就不慌Linux是多用户系统权限管理是所有操作的基础。权限出问题最典型的报错就是Permission denied刚入门的人碰到基本都会懵一下。权限可以用符号表示也可以用数字表示。数字的规则其实很简单读是4写是2执行是1。把它们相加得到权限值。rwx是7rw-是6r--是4。chmod 755 file就是文件所有者有rwx同组和其他人有r-x。权限的三个位置分别对应“所有者”“所属组”“其他人”在ls -l里看到的一条记录比如-rw-r--r--第一个字符是文件类型-文件、d目录、l链接后面三组就是权限。常用的用户管理命令useradd -m -s /bin/bash zhangsan创建用户-m自动建家目录-s指定shell。passwd zhangsan设置或修改密码。usermod -aG wheel zhangsan把用户加到wheel组让它有sudo权限。userdel -r zhangsan删除用户并删除家目录。su - zhangsan切换用户带-会加载目标用户的环境变量。sudo临时提权执行管理命令。修改文件归属的命令是chown和chgrp。比如把/data/app的属主改成nginx属组也改成nginxchown -R nginx:nginx /data/app-R是递归对目录及其内部所有文件生效这个参数也极容易被漏掉。关于sudo建议不要直接去改/etc/sudoers文件而是用visudo命令打开编辑。visudo会做语法检查万一写错不会直接锁掉整个sudo系统。这是个非常关键的实操细节。2.4 网络与端口排查服务起不来先看这一块服务器上部署应用最常遇到的场景就是“服务起不来”或者“别人访问不到”。这种时候90%的排查工作都在网络和端口上。先看基础网络配置# 查看IP地址新命令 ip addr # 查看路由 ip route老派的ifconfig现在很多系统不预装了新环境我更推荐ip命令。如果只想确认IP有时候会用ip addr show | grep inet过滤但在脚本里我更喜欢直接配合awk去取IP。端口监听状态是排查重点。看某个端口的监听情况ss -lntp | grep 8080参数含义-l只看监听的端口-n不做域名解析显示IP而不是主机名速度快-t只看TCP-p显示对应的进程PID和名称。这比老的netstat更高效而且很多新系统已经默认不装netstat。ss看到端口监听之后还要确认能不能连通。本机测一下curl -I http://127.0.0.1:8080-I只取响应头如果返回HTTP/1.1 200 OK说明服务本身正常。这时候别人访问不了问题大概率在防火墙或云平台安全组。检查防火墙firewall-cmd --list-all如果端口没放行就加上firewall-cmd --add-port8080/tcp --permanent firewall-cmd --reload这一套流程下来80%的“端口不通”问题都能定位。初学阶段不建议碰太复杂的iptables先把ss和firewall-cmd用熟。2.5 进程与服务管理看懂进程就掌握了系统状态Linux的进程管理核心是“看”和“杀”。查看进程最常用的是ps -ef | grep javaps -ef会列出当前所有进程然后通过grep过滤出包含java的进程。这里有个小坑grep java会把grep自己这个进程也匹配出来。为了避免这个可以用ps -ef | grep java | grep -v grep或者用pgrep、ps -ef | grep [j]ava这种技巧。搜索里带上中括号grep自己就不会匹配到因为命令行里的模式是[j]ava不包含java这些连续字符。动态查看系统负载和进程状态用top。按P按CPU排序按M按内存排序按q退出。我一般进场先看top里的load average三个值如果三个值都接近或超过CPU核数说明系统负载偏高再结合进程列表找是谁在消耗资源。“杀”进程用killkill -15 进程PID # 优雅退出给程序处理善后的机会 kill -9 进程PID # 强制杀掉慎用-15是默认信号让应用有机会释放资源、写日志、关连接-9是强制发SIGKILL系统直接终止进程会造成数据不完整。很多人习惯一上来就kill -9其实非常不推荐除非程序真的卡死了。服务管理这块绝大多数新系统都用systemctlsystemctl start nginx # 启动服务 systemctl stop nginx # 停止服务 systemctl restart nginx # 重启服务 systemctl status nginx # 查看服务状态 systemctl enable nginx # 设置开机自启 systemctl disable nginx # 取消开机自启 systemctl daemon-reload # 重载systemd配置对于没有systemd的老系统才会用service nginx start这种命令。现在装机基本都是CentOS 7、Rocky、Ubuntu 18.04systemctl是绝对的主流。还有一个容易被忽略的后台任务管理nohup。用nohup java -jar app.jar app.log 21 让程序在后台运行即使关掉终端也不退出。21把标准错误重定向到标准输出这样日志和报错都会写进同一个文件。这个写法几乎每个Java服务部署脚本里都会出现。2.6 系统信息、磁盘与文件传输日常巡检必备系统信息和磁盘监控是运维巡检的基本动作。# 系统版本和内核 cat /etc/os-release uname -a # 内存和负载 free -h # 磁盘空间使用 df -h # 目录占用大小 du -sh /var/logfree -h里-h是human-readable会显示G、M等单位。df -h看的是文件系统整体占用适合判断/是不是满了。du -sh /var/log看的是某个目录实际占用适合找谁把磁盘撑爆了。磁盘满是个高频故障。我处理过很多次No space left on device有时不是文件真的有多大而是删除文件后没有释放空间——因为那个文件还被某个进程打开了。排查时需要lsof | grep deleted找到占用已删除文件的进程重启它之后磁盘空间才会真正释放。这个坑相当隐蔽没经验的人会反复删文件却看不到空间变化。文件传输方面最简单的是scp# 从本机推送到服务器 scp /tmp/test.txt user192.168.1.100:/tmp/ # 从服务器拉取到本机 scp user192.168.1.100:/tmp/remote.txt ./local/大数据量或重复同步时我更喜欢用rsync。它只传输变化的部分断点续传配合-avz参数非常可靠。备份项目目录时我会这样写rsync -avz --delete /data/app/ /backup/app/--delete是让备份目录和源目录完全保持一致源端删除的文件备份端也会删除。这个参数很强大但也危险用之前务必确认路径写对了否则会把备份目录里的文件删光。压缩和归档是另一类必备技能# 打包并压缩 tar czvf app.tar.gz /data/app # 解压到指定目录 tar xzvf app.tar.gz -C /optczvf里c是create创建包z是gzip压缩v是显示过程f指定文件名。对应的解压是x而不是c。如果看到tar: 归档文件中未找到之类的报错先检查是不是压缩参数和解压参数用反了。3. 实操过程拿下一台新服务器的命令编排3.1 环境巡检与基础确认接手一台新服务器有个固定的命令组合按照这个顺序走一遍基本能了解这台机器的大致情况# 1. 系统版本 cat /etc/os-release # 2. 内核版本 uname -a # 3. 系统运行时间与负载 uptime # 4. 内存情况 free -h # 5. 磁盘情况 df -h # 6. IP地址 ip addruptime输出里的load average是1分钟、5分钟、15分钟的平均负载后面讲CPU核数时要结合起来看。假设这是一台4核机器load average到了4以上说明负载已经很满需要关注具体是哪个进程在消耗CPU下一步就接top。如果发现磁盘某个分区快满了还要继续查du -sh /* 2/dev/null | sort -rh | head -10这行命令列出根目录下占用前10的目录。2/dev/null是把没有权限的警告丢弃sort -rh按人类可读数字倒序排序。找到大目录后再du -sh /var/* | sort -rh | head逐层往下追直到定位到大文件。这套“由总到分、逐层下钻”的思路比一个个目录进去看效率高得多。3.2 安装配置应用时的标准动作在新服务器上装应用我的标准动作一般是先确认包管理器然后更新源再安装然后配置最后启动并验证。以CentOS系为例# 更新软件源缓存 yum makecache # 安装Nginx yum install -y nginxUbuntu/Debian系则用apt update apt install -y nginx安装完之后先确认安装路径和版本which nginx nginx -vwhich返回的是可执行文件路径一般会在/usr/sbin/nginx或/usr/local/nginx/sbin/nginx取决于安装方式。然后配置服务自启和启动systemctl enable --now nginxenable --now两个动作合在一起设开机自启同时立即启动。接着验证状态systemctl status nginx curl -I http://127.0.0.1/如果返回200基本说明装好了。要是配置了非默认端口经过前面说的防火墙放行后再从外部浏览器验证一次HTTP访问。这一步“从本机验证到外部验证”的完整闭环能避免很多部署一半才发现问题的尴尬。3.3 日志排查的标准操作流程线上服务出问题我第一反应不是看监控面板而是直接进服务器看日志。日志文件的位置一般有规律Nginx在/var/log/nginx/应用自己打的日志通常在应用目录的logs/下systemd管理的服务还可以用journalctl查看。排查流程通常是这样的# 1. 看应用最新日志尾部 tail -n 100 /var/log/app/error.log # 2. 实时跟踪日志输出 tail -f /var/log/app/app.log # 3. 按关键字过滤错误 grep -i error /var/log/app/app.log | tail -20 # 4. 看某一段时间的日志 sed -n /2025-01-10 10:00/,/2025-01-10 10:30/p /var/log/app/app.log对systemd管理的服务查日志更顺手journalctl -u nginx --since 2025-01-10 10:00 --until 2025-01-10 10:30-u指定服务单元--since和--until限定时间范围。这套组合比打开几个G的日志文件人肉翻找高效得多。定位到异常日志后我一般会把关键错误信息复制到笔记里结合时间戳、进程号和报错堆栈再决定下一步排查方向。日志排查的核心不是“看懂每一行”而是“快速锁定异常点和上下文”。4. 常见问题与排查技巧实录4.1 权限拒绝与误删这两类事故占了新手踩坑的一半Permission denied是非常经典的报错。遇到它按这个顺序排查先看当前用户是谁id再看目标文件权限ls -l /path/file再确认父目录权限目录至少要r-x权限才能进入如果目录本身没权限文件权限再高也没用。如果是在SELinux启用状态比如CentOS默认还要用getenforce看一下必要时用chcon或restorecon恢复上下文。rm -rf误删这个老生常谈但永远有人中招。我自己也踩过——在脚本里写rm -rf ${DIR}/如果DIR变量没赋值命令就变成rm -rf /哪怕及时CtrlC可能也已经删掉不少系统目录。我的建议是不在生产环境直接使用rm -rf删除前先ls确认一次。脚本中使用rm -rf时先判断变量是否为空[ -n $DIR ] rm -rf $DIR/。重要数据定期备份误删之后能走备份恢复才是最终保障。也可以用trash-cli这种工具把删除变成“移入回收站”。4.2 命令差异与中文乱码这类“小毛病”其实很耗时间systemctl和service的区别。现在很多服务安装完提示里还写着“Runservice nginx startto start”但实际上一跑就报错。这是因为老脚本没有适配systemd。我的判断准则优先用systemctl如果服务没有systemd单元文件才退回service和/etc/init.d/下的脚本。两者不冲突但机制不同别混着用。解压文件乱码尤其在Windows上压缩的zip包传到Linux下用unzip解压经常出现中文乱码。原因是压缩包里的文件名编码是GBK而Linux默认用UTF-8解码。解决办法很简单unzip -O GBK 文件名.zip-O参数指定解压时使用的字符编码。如果unzip版本不支持-O那就先解压再批量改名或者用Python的zipfile库处理。这个坑我在处理合作方传来的素材包时踩了不止一次现在已经成为标准操作。终端中文显示乱码一般不是文件问题而是环境变量LANG没设置正确。临时解决export LANGzh_CN.UTF-8永久生效就写进/etc/locale.conf或用户的~/.bashrc。4.3 给新手的三点实战建议最后聊几个我在实操中反复体会到的点。第一笔记一定要边学边改。网上现成的命令笔记很多但如果只是收藏或者复制它永远不会变成你的能力。我会在跟完尚硅谷的Linux课程后把自己实验过的命令、报错信息、解决过程都补进笔记里。等到第二遍看到某个命令时能想起“上次我在这里栽过跟头”这份笔记才算真正发挥了作用。第二搭一个自己的练习环境。在虚拟机里装一个带桌面的Linux发行版或者直接在云上开一台按量付费的机器怎么折腾都不心疼。学命令最忌讳只看不敲。权限、软链接、tar压缩这些事上手试一次比读十遍笔记都记得牢。第三养成看文档和搜索历史的好习惯。遇到不确定的命令先man或者命令 --help想找之前敲过的命令按CtrlR输入关键字反向搜索历史想确认一个参数用法再grep一下自己的笔记。这些习惯叠加起来才是真正的“随时搜索”。这套方法我一直在用也确实靠它省下了大量查资料的时间。Linux命令的学习没有太多捷径但用对的工具、记对的笔记、踩过该踩的坑之后你会发现那些曾经让人头大的命令最终都会变成手边最顺手的武器。
返回列表