1. 从桌面切到服务器:命令行为何是运维唯一可靠的入口
我第一次真正面对 Linux 服务器,是在接手一个跑了三年的电商项目之后。前任运维离职,留下一个只有命令行登录入口的云端实例。我习惯性地想在机器上装个图形界面,被当时的 Leader 拦住了:服务器是干活的,不是给你看的。后来我自己带团队带项目,也一直坚持这条原则:能用命令解决的事情,绝不去图形界面里点点点。
为什么说这是服务器运维的第一课?因为生产环境里的 Linux 绝大多数是最小化安装,没有桌面、没有文件管理器、没有图形化监控面板,你唯一的控制入口就是 SSH 终端。这并不代表系统被“阉割”了,而是刻意为之——少一个图形进程,就少一分资源开销和攻击面。一台要承载高并发的机器,CPU 和内存应该花在业务进程上,而不是花在渲染桌面上。
命令行还有两个图形界面永远替代不了的价值:可重复和可审计。你在命令行里做过的每一步操作,都可以变成脚本、定时任务、发布流水线;而你在图形界面里点的每一个按钮,事后很难追溯。很多公司运维规范里有一条不成文的规矩:能脚本化的操作,禁止手工点。这背后不只是效率问题,更是安全和可追溯性问题。
入门 Linux 运维,最先要建立的不是命令记忆,而是一套思维:我用什么命令能看到这台机器的状态?用什么命令能改变这个状态?这个命令的后果是什么?带着这套思维去接触命令,你会发现所有的命令都是围绕“查看—定位—修改—验证”这四个环节展开的。
下面我按自己在生产环境中最常使用、也最容易被问到的顺序,把这些命令和背后的逻辑完整过一遍。包含大量实际踩坑记录,新手可以当入门指南,做过一两年运维的也能顺手查漏补缺。
1.1 Windows 习惯迁移:dir、copy、ipconfig 对应的 Linux 命令
很多人是从 Windows 服务器转过来做 Linux 运维的,第一步就是在两边命令之间做映射。我先给一张常用对照表,减轻刚上手时的陌生感:
| 操作意图 | Windows 习惯 | Linux 对应命令 |
|---|---|---|
| 列出目录文件 | dir | ls -l |
| 切换目录 | cd | cd |
| 复制文件 | copy | cp |
| 移动/重命名 | move | mv |
| 查看文件内容 | type | cat |
| 结束进程 | taskkill | kill |
| 查看进程 | tasklist | ps -ef |
| 查看IP配置 | ipconfig | ip addr 或 ifconfig |
| 测试网络连通 | ping | ping |
| 查看系统信息 | systeminfo | uname -a |
| 清屏 | cls | clear 或 Ctrl+L |
这张表只能帮你起步,绝对不能机械对应。比如ipconfig在 Linux 下更推荐ip addr,它输出更清晰,而且ifconfig在新系统上未必默认安装。再比如 Windows 下结束进程用taskkill /F /PID 1234,Linux 下的kill -9 1234虽然功能类似,但kill的默认信号是TERM(优雅退出),只有加上-9才是强制结束,这个差异在实践中非常容易踩坑。
1.2 常见发行版的差异:命令一样,安装方式要看清楚
Linux 命令分为两部分:一部分是通用的,比如ls、cd、cp、grep、find这些几乎所有发行版都一致;另一部分是和包管理绑定的,比如安装软件,RedHat 系用yum或dnf,Debian 系用apt。现在国产化 Linux 系统在政企机房越来越常见,大多基于这两种体系之一,所以通用命令部分基本可以无缝迁移,区别主要体现在软件源和包管理器上。
我的建议是:先确认机器的“出身”再动手。cat /etc/os-release能看到发行版名称和版本号,比盲目照着网上教程敲命令可靠得多。这个问题在刚开始接触服务器时几乎一定会遇到,早确认早省事。
2. 文件与目录操作:高频中的高频,细节里的坑
文件操作是运维的基本功,但恰恰是这些“看起来很简单”的命令,在生产环境里最容易出事故。ls、cp、mv、rm、find、grep、tar,每一个我都有过记忆深刻的翻车经历。
2.1 ls 的隐藏参数:权限位、大小、时间排序怎么看
很多人对ls的印象就是“列出文件名”,这个认知太浅了。排查问题时我最常用的三个参数是:
ls -lh:人类可读的大小显示,一长串字节数变成 K、M、G,扫一眼就能判断日志文件是不是已经膨胀到不正常;ls -lt:按修改时间倒序排列,想知道“最近哪个文件在更新”,这个命令最高效;ls -la:把隐藏文件也列出来,很多服务的配置和密钥文件都以.开头,漏看隐藏文件等于漏看了一半家底。
ls -l输出的第一列,是十个字符组成的权限信息。这一列信息我后面专门开一节讲,这里先记住一个用途:当应用写日志失败、当目录进不去的时候,第一件事就是看权限位的属主和属组,十有八九问题出在这。
2.2 find 与 grep:一个是按属性找文件,一个是按内容找信息
find 和 grep 被混用的情况太多了。这两个命令分工完全不同:
find按文件属性找文件:文件名、文件类型、修改时间、大小等;grep在文件内容里搜文本:查日志里的关键字、配置文件里的某个参数。
举一个最典型的场景:线上某个接口突然大量报错,你要找是哪个日志文件在疯狂写入。用find按时间缩小范围:
find /var/log -type f -name "*.log" -mtime -1-mtime -1表示“最近 1 天内修改过”。如果要找超过 7 天没动过的旧归档,用-mtime +7。这对清理磁盘非常关键,但使用时先别急着加-delete,我的习惯是先把结果列出来,确认要删的就是这些,再执行真正的删除。
grep则更常用于日志内容提取。比如统计某个接口当天的调用次数:
grep "/api/order" /var/log/nginx/access.log | wc -l这里wc -l统计行数。grep加上-v可以反向过滤,去掉包含指定特征的行;加上-E可以使用正则匹配更灵活的模式。排查日志时,我一直建议用“先缩小范围,再排除噪音,再精确匹配”的步骤,而不是直接梭一个复杂正则进去。
2.3 cp、rm、tar 的实战注意事项
cp -r复制目录、rm -rf删除目录,这是每个运维都绕不开的命令。这里要说两个经常出事的细节:
一是mv命令在同一文件系统内是瞬间完成的,因为它只修改目录项;但跨文件系统移动时,实际执行的是“复制 + 删除”,文件越大耗时越长。如果你在脚本里用mv移动一个大文件到另一个磁盘分区,发现命令迟迟不结束,这就是原因。
二是rm -rf /这类“毁灭级”命令,不需要我多啰嗦它的威力,但我想分享一个习惯:生产环境执行删除命令前,先把命令用 echo 打印出来,或者用ls提前看一眼目标路径。我见过因为变量为空导致rm -rf $DIR变成rm -rf /的案例,排查到最后发现只是脚本里少写了一行判断。这种事故一次就能改变一个人的操作习惯。
归档压缩也是高频操作。打包并压缩用tar -czvf 包名.tar.gz 目录/,解压用tar -xzvf 包名.tar.gz。迁移大量小文件时,我先打包再传输,因为小文件在网络上逐个传输会产生大量小请求,效率远低于传输一个压缩包。几十 GB 的数据,先压缩再传往往能省一半以上的时间。
3. 系统状态排查顺序:负载、内存、磁盘与 inode 的连锁关系
服务器出了问题,最忌讳东看一眼西看一眼。我自己固定在一条链路:先看负载,再看 CPU 和内存,再看磁盘空间和 inode,最后才轮到业务日志。这个顺序不绝对,但它能帮你快速判断问题是系统资源层面还是业务代码层面。
3.1 uptime 和负载:三个数字到底该怎么解读
uptime输出里最关键的是一段负载信息,类似load average: 0.51, 0.37, 0.28。这三个数字分别表示过去 1 分钟、5 分钟、15 分钟的系统平均负载。
很多人看到数字就紧张,其实负载本身没有绝对的好坏,必须结合 CPU 核心数判断。一台 4 核机器,负载长期在 4 左右,说明 CPU 已经被跑满;如果持续超过 8,说明任务已经在排队,系统明显过载。反过来,一台 32 核的机器负载是 4,说明它闲得很。
我更关注的是负载的趋势:1 分钟数字远高于 15 分钟数字,说明有突发任务,比如被攻击、定时任务扎堆执行、或者某个脚本跑死了;1 分钟、5 分钟、15 分钟都高,说明是长期压满,需要扩容或优化。
3.2 top 与 free:内存够不够用,不能只看剩余量
内存排查最简单的命令是free -h,但很多人只看第一行Mem的 used 和 free,得出“内存不够了”的结论。实际上要关注的是available这一列,也就是“可用内存”。Linux 的内存管理很特别,它会把可用的内存尽量用作文件缓存(buffer/cache),这部分缓存内存会在必要时自动释放。所以free -h里显示 cache 占了很多,不代表内存不够用,恰好是 Linux 在高效利用空闲内存。
top打开后默认按 CPU 使用率排序。排查 CPU 飙高时,我习惯先看第一屏里排在最前面的进程是不是异常;按M可以切换到按内存排序,按P回到按 CPU 排序。如果发现某个进程反复出现、PID 一直在变,那基本可以断定它在循环重启,下一步就是ps -ef | grep 进程名查看启动参数和实际运行状态。
这里要区分主进程和 worker 进程。以 Nginx 为例,root 启动的是主进程,负责监听端口和管理 worker;普通用户运行的是 worker 进程,真正处理请求。主进程挂掉整个服务才叫挂掉,某个 worker 异常通常只是部分请求受影响。排查时先看主进程在不在,再看 worker 数量和状态。
3.3 df 与 du:容量之外还有一个 inode 陷阱
磁盘问题有两层:容量满了,或者 inode 满了。
容量用df -h查看,这个简单直接。但有一个非常经典的隐藏故障:df -h显示还有几个 G 空闲,应用却报 “No space left on device”。这时候几乎可以断定是 inode 耗尽。inode 是文件系统里的元数据结构,每个文件或目录都要占用一个,如果文件数量多到 inode 被用光,即使容量还有剩余,也无法创建新文件。用df -i查看 inode 使用率。
这种情况常见于小文件堆积:定时任务每分钟生成一个文件、临时目录从不清理、代码在死循环里不断写空文件。定位是哪个目录占用时,我一般用du -sh *在当前目录下逐项统计,找到最大的那个目录再层层深入。
还有一个隐藏很深的坑:文件被删除但空间不释放。如果某个进程打开了一个文件,后来文件被删了,但进程还持有它的文件描述符,df里空间依然被占着,du却找不到这个文件。解决办法是找到那个“幽灵进程”并让它重新加载:
lsof | grep deleted输出里能看到哪个进程还占着已删除文件,重启或让该进程重新打开文件后,空间才会真正释放。这个命令在排查磁盘满时价值极高,值得记牢。
4. 日志分析四件套:tail、grep、awk、sed 的实战配合
日志是运维工程师最重要的“传感器”。用户反馈系统异常时,我第一件事从来不是重启,而是先翻日志。日常使用最频繁的四个命令是tail、grep、awk、sed,它们组合起来能解决大部分日志分析需求。
4.1 tail 实时跟踪与 grep 关键行提取
tail -f是我开终端后第一个敲的命令。它的作用是持续跟踪文件尾部,新的日志行写入后立刻显示出来。改完配置文件、重启服务,tail -f马上就能告诉你服务有没有正常起来。
如果是多个日志文件需要同时盯,可以一次性传给 tail:
tail -f /var/log/nginx/access.log /var/log/nginx/error.log输出里会带文件名前缀,方便区分是哪份日志。
grep则负责在海量日志里捞关键行。基于实际排障经验,我最常用的几个格式:
# 排除心跳、健康检查等无意义行 grep -v "heartbeat" app.log # 显示匹配行的前后各 5 行,看上下文 grep -B 5 -A 5 "ERROR" app.log # 在指定时间段内匹配关键字(此处为 6 月 1 日至 2 日 10 点到 19 点) grep -E "2025-06-0[1-2]T1[0-9]:" app.log-B是 before,-A是 after,前后文对理解错误发生时机非常关键。只看到零散的 ERROR 行,不知道该时点周围发生了什么,排查起来往往要走弯路。
4.2 awk 与 sed:取字段统计和批量替换
当你是想要从日志中提取数据,而不是单纯找字段时,awk 是最趁手的工具。Nginx 访问日志里的字段通常包含:客户端 IP、时间、请求方法、请求路径、状态码、响应字节数等。做一个按状态码分组的统计,一句话就能搞定:
awk '{print $9}' access.log | sort | uniq -c | sort -rn这里$9是第 9 列字段,按实际日志格式调整。管道把 awk 的输出交给sort | uniq -c去重计数,再按数量倒序排列。这套组合拳——取字段、排序、统计、倒序——是我日常处理访问日志最常用的路数。比如快速看哪些请求路径占比最高、哪些客户端 IP 访问最频繁,都是换成不同字段序号的问题。
sed的核心用途是批量替换,尤其在修改配置时非常高效。例如要把配置文件里的旧 IP 全部换成新 IP:
sed -i 's/192.168.1.100/192.168.2.100/g' nginx.conf-i表示直接修改原文件。这个参数是双刃剑:不加-i时,sed只是把替换结果打到终端,原文件不受影响;加了-i后没有确认环节,改错了就是改错了,没有撤销按钮。我的习惯是先不加 -i 执行一遍,确认输出符合预期,再加 -i 真正修改。改配置文件这种操作,多一行确认,少一次事故。
日志分析还有一个思路层面的建议:不要一开始就执着于用复杂的正则经典解析所有格式。先head -n 5看几行日志,搞清楚格式和分隔符,再用“取字段 + 筛选 + 统计”的组合逐步逼近结果。大部分运维场景要的不是一个完美的通用解析程序,而是一个 5 分钟内能给出结论的命令组合。
5. 网络诊断与远程传输:别把问题都归给“重启试试”
网络故障排查是最容易“瞎折腾”的领域,因为涉及链路、端口、防火墙、应用层等多个环节。我的做法是分成三层依次排查:第一层看链路,第二层看端口,第三层看应用协议。每一层用一个专门的命令,绝不跳过。
5.1 三层排查:ping、ss、curl 各管一层
第一层是网络连通性,用ping。服务器连不上时,先ping 目标IP,看延时和丢包。能 ping 通说明网络层基本没大问题,但这还不能代表业务可用——很多防火墙是放行 ICMP 但不放行业务端口的,所以 ping 通只是第一步。
第二层是端口检查。本机上先用ss -lntp查看监听状态:
ss -lntps是 socket 的缩写,-l只看监听中的端口,-n以数字显示地址和端口,-t只显示 TCP,-p显示对应进程。这个命令比老牌的netstat更快,输出也更紧凑。想快速知道当前机器到底开了哪些端口、每个端口被哪个进程占用,它就是标准答案。
从外部机器测端口是否可达,可以用简单的telnet 目标IP 端口。能连上说明链路和端口放行都没问题;超时或拒绝则说明问题出在防火墙或目标机器的监听配置上。注意“拒绝”和“超时”的差异:拒绝(connection refused)通常意味着目标端口没有进程在监听,超时则更可能是中间链路把包丢了或防火墙丢弃了请求。
第三层是应用协议层,用curl模拟实际请求。比如排查一个 Web 服务响应慢的问题,我会先取响应头验证服务是否存活:
curl -I -m 10 https://example.com-I只获取响应头,适合快速判断;-m 10设置 10 秒超时,避免 curl 长时间无响应拖慢排查节奏。在实际业务中,你还可以用curl -w "%{http_code} %{time_total}"把响应码和总耗时一次打出来,批量测试多个地址时很省事。
5.2 一次端口连不上的完整排查过程复盘
有一次同事反馈:业务方从另一台机器连接我们服务的 3344 端口失败,但服务器看起来一切正常。我按三层法走了一遍:
第一步,在服务器的本机执行ss -lntp | grep 3344,端口确实在监听,进程也在。第二步,从客户端机器telnet 目标IP 3344,结果是超时。第三步,在服务器本机试curl http://127.0.0.1:3344,返回正常。
到这里就出现了一个典型矛盾:本机访问没问题,外部访问超时。剩下的嫌疑就集中在了防火墙或安全组放行规则上。登录云控制台一看,安全组入方向规则里确实没有放行 3344 端口。补上放行规则后,外部 telnet 立即通了。
这个过程给了一个重要教训:服务在监听、服务本身可用、外部能访问,是三件完全不同的事。很多人遇到连不上就重启服务,但其实服务从头到尾都是好的,问题出在链路入口被防火墙挡住了。排查要有层次,而不是条件反射式地重启。
5.3 文件传输:scp 与 rsync 如何选
服务器之间传文件,我按两个维度选择工具:文件量大小和是否要增量同步。
临时传一两个文件,scp最简单:
scp ./backup.sql user@10.0.0.5:/data/backup/传目录加-r,注意如果目标目录不存在,scp 不会自动创建。这个细节经常导致部署脚本报错。
如果是定期同步目录、文件量大、或者要求“只传新增的部分”,rsync是明显更优的选择。它支持增量传输、压缩、断点续传,还可以排除指定目录:
rsync -avz --progress --delete ./webroot/ user@10.0.0.5:/opt/www/-a归档模式保留权限、属主、时间戳等属性;-z传输时压缩;--delete让目标端删除源端已不存在的文件,从而保证两边完全一致。
这里要特别提醒:--delete是双刃剑。如果源目录路径写错,比如写成空目录,rsync 会认为目标端的文件“多余”,全部删除。我第一次用 rsync 时就没意识到这一点,差点把一台上线机器的数据清空。保险做法是先用-n参数干跑:
rsync -avzn --delete ./webroot/ user@10.0.0.5:/opt/www/-n是 dry-run,只列出会执行的操作,不实际改动。看到输出没问题后,再真正执行。一个字:稳。
6. 权限管理:一个字符写错,业务就可能挂半天
权限问题造成的故障,在我接触过的生产事件里占了相当比例。这类问题的尴尬之处在于:它不难,但它隐藏在系统基础设置里,排查路径长。最常见的场景是:应用从 root 用户改成普通用户运行,结果忘了同步代码目录的属主,重启后页面直接 403。
6.1 十个字符的权限串,到底在表达什么
ls -l输出的第一列,例如drwxr-xr--,一共十位。第一位表示文件类型:d是目录,-是普通文件,l是软链接。后面九位分成三组,依次对应属主(user)、属组(group)、其他用户(others),每组三位分别是读(r)、写(w)、执行(x),没有权限就显示-。
有一个容易混淆的点:目录的执行权限(x)和文件完全不同。对目录来说,x 表示“能否进入这个目录”,r 表示“能否列目录内容”,w 表示“能否在目录里创建或删除文件/子目录”。很多新手只给目录加了 r,发现能看列表却进不了目录,就是因为少了 x。
6.2 数字权限:为什么我建议少用 777
数字权限的规则是 r=4、w=2、x=1,三组权限分别相加。chmod 755表示属主可读写执行(4+2+1),属组和其他人可读可执行(4+1)。目录常用的权限是 755,普通文件常用 644,私钥文件必须 600。
新手最爱的chmod -R 777,本质上是在给所有用户打开读写执行的全部权限。它确实能快速解决“权限不足”的问题,但它同时把系统的隔离能力彻底废掉。数据库配置、密钥文件、定时脚本一旦 777,任何一个被入侵的低权限账号都可能读取到敏感内容。等出了安全事故再回头溯源,就会发现当初图省事的 777 是最大的帮凶。
我建议建立一个基本安全基线:目录 755、普通文件 644、私钥 600、可执行命令脚本 700 或 750。更重要的是,要用find定期扫描“越权文件”:
find /var/www -type f -perm 777 -exec ls -l {} \;找到所有 777 文件后逐一整改。批量修正权限时,不要对目录和文件一刀切地-R,建议分别处理——目录需要 x 才能进入,普通文件通常不需要。
6.3 属主与属组、 sudo 的正确使用习惯
修改属主属组用chown,这是最直接的答案。比如把 Web 目录交给www-data用户和组:
chown -R www-data:www-data /var/www/html日常操作中还有一条纪律:不要直接用 root 登录生产环境。普通账号 +sudo才是最稳妥的组合。sudo的优势不仅是权限控制,更重要的是操作审计——命令执行记录被保留下来,事后可以回溯。用sudo -l能查看当前账户被授权执行哪些命令;修改 sudo 配置时用visudo,它自带语法检查,能避免语法错误导致整个 sudo 系统失效的尴尬。
权限和用户管理还有一个高频操作:创建账号、设置密码、查看用户信息。useradd加-m创建用户并生成家目录,passwd 用户名设置密码,id 用户名查看用户 UID、GID 和所属的组。有时需要临时切换身份排查问题,用su - 用户名,而不用重新登录。
7. 容器、数据库与版本协作:现代运维绕不开的扩展命令
如今已经很少有一台生产机器是“裸装业务 + 手工发布”的传统模式了。容器化部署、Redis/MySQL 访问、Git 发布流程,几乎已经成为日常标配。虽然这些不是 Linux 系统本身的基础命令,但搜索指数和实际需求都很高,而且确实容易踩坑。
7.1 Docker:镜像、容器、日志一条线
Docker 日常命令的核心是区分两个概念:镜像是模板,容器是模板运行起来的实例。操作命令也要分开记:
# 查看随容器(a 包含已停止的) docker ps -a # 查看镜像列表 docker images # 进入容器执行命令(it 交互式终端) docker exec -it 容器名 bash # 查看容器日志(f 实时刷新,tail 200 显示最近 200 行) docker logs -f --tail 200 容器名排查容器问题时,顺序很固定:先用docker ps判断容器是否还在运行;如果容器处于 Exited 状态,用docker logs 容器名看退出前的日志;如果容器不断重启,用docker inspect 容器名查看退出码和重启策略。很多容器退出的原因并不复杂:配置文件里路径写错了、环境变量没传、镜像里缺了某个依赖,日志里都有明确报错。不要上来就删容器重建,先看日志是最省事的。
7.2 Redis 和 MySQL:数据库命令的线上经验
Redis 作为缓存中间件,运维常用命令不多,但有一个大坑必须提醒:keys *在生产环境是大忌。在 key 数量多的实例上,keys *会阻塞 Redis 处理新命令,造成线上缓存短暂不可用。需要遍历 key 时必须用scan分批扫。日常健康检查我一般执行:
redis-cli -h 127.0.0.1 -p 6379 ping # 结果返回 PONG 说明存活 redis-cli dbsize # 查看 key 数量 redis-cli info | grep used_memory # 查看实际占用内存MySQL 在运维阶段最高频的需求是连接、备份、查看慢查询和当前连接状态。连接命令mysql -u用户名 -p -h主机;备份用mysqldump;查看当前所有连接正在执行的 SQL 用:
show processlist;这条命令在排查数据库卡死、锁等待时非常有用。你能直接看到哪个会话卡在哪个 SQL 上、已经执行了多久,定位效率极高。
7.3 Git 与 Vim:发布流程里躲不开的两样
代码发布用 Git 已经是标配。服务器上最常用的就那几条:看状态、拉代码、切换分支、看提交历史。
git status # 查看工作区状态 git pull --rebase # 拉取远端代码 git checkout 分支名 # 切换分支 git log --oneline -10 # 看最近 10 条提交服务器上的代码目录最忌讳手工修改文件。很多人习惯直接在服务器上改一处配置,结果下一次git pull就冲突了。正确做法是:代码从远端拉取,配置通过环境变量或专门的配置中心管理,服务器本地不保留任何手工改动。
Vim 则是每台服务器上都存在的“保底编辑器”。至少要熟练几个动作:i进入编辑模式,Esc退出编辑模式,:wq保存退出,:q!不保存强制退出,/关键字搜索,dd删除当前行,yy复制当前行,p粘贴。Vim 在服务器里的角色不是优雅的代码编辑器,而是“在任何一台机器上都能快速改配置”的生存工具。
8. 关于命令记忆:可以查,但要有脑子的查
每次分享完常用命令,总有人问:这么多命令怎么背?我的回答一直很坚定:不需要全部背下来,也不可能全部背下来。
你真正能记住的,一定是那些反复用的命令。用得少的,只需要模糊记住“有这样一个工具、大概能做什么”,等真需要时再查手册、看--help、搜资料,完全来得及。这背后的原因是:命令是工具,工具是拿来用的,不是拿来展览的。一个合格的运维工程师,脑子里真正重要的不是命令参数表,而是一条一条的排查链路。
比如“用户说网站打不开”这条链路:先看机器负载和连通性,再看进程是否存活,看端口是否监听,看磁盘是否写满,看应用日志有什么报错。这条链路里的每一步,你会自然用到uptime、ps、ss、df、tail。链路养成了,参数只是按图索骥;链路没有,背再多命令也是散沙。
我还有一个个人习惯:凡是新学的命令,特别是带破坏性参数的操作,我都会先在测试环境里真实执行一遍,再上生产。命令写一遍带来的记忆效果,远胜于读十遍。我有个本地笔记,记录了各种场景的排查手册,每次遇到问题就在里面加记录,慢慢就沉淀成自己的知识库。
最后忍不住想提一个真实的小教训:有一次我在生产环境敲命令,怎么敲都没反应,排查了几分钟才发现是中文输入法没切换,命令里混进了全角字符。Linux 命令只认半角字符,一个全角逗号就能让你怀疑人生。这种细节不会写在任何官方文档里,但踩过一次,就再也不会犯了。运维这条路,就是这样一点点踩出来的经验,急不得,也炫不得。