1. 文件与目录操作的高频实战细节
1.1 删除操作的安全底线与替代方案
我把这一节放在最前面,是因为rm -rf这条命令几乎每个运维都失手过。第十三篇我们聊点进阶的,先说删除。
很多人刚接触Linux时会觉得,rm -rf 用起来挺爽,一敲就清干净了。但实际生产环境里,我见过太多因为多打了一个空格、写错路径导致的数据事故。比如你要删除 /tmp 下的临时目录 old_data,手一抖写成 rm -rf /tmp/old_data /,那个 / 直接毁掉整个系统。
如果必须用 rm 删除重要数据,我建议至少做到两件事:第一,先执行 pwd 确认当前路径;第二,用绝对路径删除而不是相对路径,并且删除前用 ls 检查一遍通配符展开的结果。写一个简单的命令组合可以救命:
bash复制ls -l /tmp/old_data* # 先确认要删的东西到底有哪些
rm -rf /tmp/old_data
再推荐一个更稳妥的做法:不要直接用 rm,而是把要删的内容先移动到一个临时回收目录,确认运行稳定后再清空。很多团队的生产服务器上都会建一个 /data/.trash 之类的目录,配合定时任务自动清理七天前的文件。这套方案花不了多少时间,却能防住绝大多数手误。
另外很多人不知道 rm 的 -i 交互参数,这个参数在删除前会逐个询问是否确认。批量删除时固然繁琐,但如果你是在处理重要配置目录,加上 -i 等于多了一道确认,成本很低,收益极高。生产环境我通常还会设置命令别名,让 rm 自动带上 -i 或者保险参数:
bash复制alias rm='rm -i'
这样即使手快敲了 rm,系统也会先问一句,给你一个反悔的机会。
1.2 find 的高级筛选与批量处理
find 是 Linux 里最常用也最被低估的命令之一。很多人只会用 find / -name "xxx" 找文件,其实它的核心优势在于"筛选加执行"的组合能力。
拿日志清理来举例。假设 Nginx 日志目录下按天生成 access.log.20250101 这样的文件,你希望保留最近30天,删除更早的日志。用 find 的 mtime 参数可以精准搞定:
bash复制find /var/log/nginx/ -name "access.log.*" -mtime +30 -exec rm {} \;
这里 mtime +30 表示修改时间超过30天的文件。-exec 后面跟要执行的命令,{} 是 find 找到的每一个文件名的占位符,; 表示命令结束。如果你不确定匹配结果,先把 -exec 换成 -print 或者 -ls 看看输出,确认无误后再真正执行删除。
find 还有一个更隐蔽的用法,就是按文件大小筛选。比如找出当前目录下所有大于100MB的文件,用来排查磁盘占用大头:
bash复制find . -type f -size +100M -exec ls -lh {} \;
-type f 限定只找普通文件,避免把目录也算进去。-size +100M 表示文件大小大于100MB。配合 -exec 可以继续做压缩、移动、转储等操作。
实操中我经常把 find 和 xargs 组合起来用,处理文件数量极多的情况。xargs 能把前一个命令的输出分批传给后续命令,避免一次性传参超过命令行长度限制。比如批量修改一堆文件权限:
bash复制find . -type f -name "*.sh" -print0 | xargs -0 chmod +x
这里的 -print0 和 -0 是配套的,使用空字符作为分隔符,专门应对文件名里带空格的情况。不用这个组合,文件名一出现空格就会出问题。
1.3 scp 与 rsync:远程传输的工具选型
在服务器之间传文件是绕不开的场景。scp 简单直接,一条命令搞定,但它的短板很明显:不支持断点续传,传输大文件时网络一抖动就得从头再来。rsync 则强大得多,支持增量同步、断点续传、压缩传输,甚至可以通过 SSH 隧道加密传输。
这里给一个通用的远程拉取文件命令:
bash复制scp -P 2222 user@192.168.1.10:/data/backup.tar.gz /local/backup/
注意传输目录时要加 -r 参数:scp -r user@192.168.1.10:/data/configs/ /local/backup/。大写的 -P 指定远程端口,小写的 -p 是保留文件时间戳和权限,这是一个非常容易搞混的点。
如果你需要定时备份服务器上的数据,rsync 是更好的选择:
bash复制rsync -avz --progress -e "ssh -p 2222" user@192.168.1.10:/data/www/ /backup/www/
-a 是归档模式,保留权限、时间戳等属性;-v 显示详细信息;-z 传输时压缩;--progress 显示进度。这套命令我几乎每天都在用,实测传输几十GB的数据时,增量同步比完整拷贝快几个数量级。
增量同步的原理是 rsync 会先对比源和目标的差异,只传输差异部分。第一次全量传输会慢一些,后续每次只需要几秒钟。而且 rsync 支持断点续传,网络中断后重新执行同一条命令就能继续,这一点在传输大文件时价值巨大。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 用户管理与权限配置的常见坑
2.1 新建用户的正确姿势与常见错误
看到热搜里反复出现"linux新建用户",我意识到很多新手在用户管理上容易踩坑。useradd 和 adduser 的区别是第一个坑:useradd 是 CentOS/RHEL 系的命令,需要手动设置密码、创建家目录;adduser 在 Debian/Ubuntu 下是交互式脚本,会自动创建家目录并设置密码。但如果你在 CentOS 上执行 adduser,它其实只是 useradd 的符号链接,并不会交互式配置,这个差异坑过不少人。
正确的新建用户流程,我建议明确指定参数:
bash复制useradd -m -d /home/devops -s /bin/bash devops
passwd devops
-m 表示自动创建家目录,-d 指定家目录路径,-s 指定登录 Shell。创建完成后马上用 passwd 设置密码,否则用户无法登录。如果希望用户具备 sudo 权限,需要把它加进 wheel 或者 sudo 用户组:
bash复制usermod -aG wheel devops # CentOS/RHEL
usermod -aG sudo devops # Debian/Ubuntu
注意 -aG 里的 -a 是 append 追加的意思,如果不加 -a,usermod -G 会直接覆盖用户的附属组列表,把用户从其他组里踢出去,这是生产环境很常见的事故点。
删除用户时,如果确认需要一起删除家目录和邮件池,用:
bash复制userdel -r devops
不带 -r 只是删除用户账号,家目录会残留。如果用户还有进程在运行,userdel 会提示无法删除,需要先确认并终止该用户的进程。实操中可以用 pgrep -u devops 查看用户关联进程,kill 掉再删除用户。
2.2 权限模型实战:从 chmod 到特殊权限位
Linux 的权限模型说简单很简单,rwx 三组权限对应属主、属组、其他人。但放到真实环境里,文件权限导致服务起不来、脚本跑不了的情况每天都有。我先列一个速查表:
| 权限 | 文件含义 | 目录含义 |
|---|---|---|
| r(4) | 查看文件内容 | 列出目录内容 |
| w(2) | 修改文件内容 | 在目录内创建/删除文件 |
| x(1) | 执行文件 | 进入目录 |
很多人容易把目录的 w 权限误解为只能改目录名,实际上目录的 w 权限决定的是能否在该目录下创建和删除文件。这就是为什么你虽然对 /tmp 有写权限,但如果目录本身没有 x 权限,依然无法进入目录访问文件。
除了这三组基本权限,还有几个特殊权限位,生产环境配置时经常用到。setuid 用数字4表示,比如 chmod 4755,它允许普通用户以文件属主的身份执行该文件,典型应用是 /usr/bin/passwd 命令。setgid 用数字2表示,对目录设置后,新创建的文件会继承目录的属组,典型应用是团队共享目录。sticky bit 用数字1表示,典型应用是 /tmp 目录,允许用户在目录下创建文件,但只有文件属主或 root 才能删除。
遇到"明明用 sudo 执行了还是 Permission denied",九成问题出在文件系统挂载选项上。检查一下是不是挂载时带了 noexec 或 nosuid 参数:
bash复制mount | grep /data
如果输出里带 noexec,说明该分区上的可执行文件一律跑不了,改挂载选项或者换路径就能解决。
2.3 umask 与默认权限的微妙关系
新创建的文件和目录默认权限不是 666 和 777,而是受 umask 影响。umask 是一个掩码,默认文件权限 666 加上 umask 就是最终的结果。大多数系统默认 umask 是 022,所以新建文件权限是 644(rw-r--r--),新建目录权限是 755(rwxr-xr-x)。
查看当前 umask 用:
bash复制umask
umask -S # 符号形式显示
如果需要更严格的默认权限,可以在 /etc/profile 或 /root/.bashrc 里设置 umask 077,这样新建文件默认只有属主可读写。对于有安全要求的服务器,我建议尽量改成 077,避免新创建的文件带着过宽的权限暴露给其他用户。
这里有个细节值得注意:umask 里的三个数字分别对应属主、属组、其他用户,数字表示要"扣掉"的权限位。umask 027 表示文件默认权限是 640,目录默认权限是 750。如果团队在同一个目录下协作,设置 umask 007 可以保证同组成员都有读写权限,而其他用户完全无法访问。
3. 系统状态排查的命令组合
3.1 磁盘与内存排查要看的几个指标
遇到"系统卡了"或者"磁盘满了"这类问题,很多人第一反应是打开 top 看 CPU。但实际生产环境中,我遇到的高频故障往往是磁盘写满或者 inode 耗尽,跟 CPU 没关系。
首先用 df -h 查看磁盘空间:
bash复制df -h
这里输出的第一列是文件系统,最后一列是挂载点。如果某个挂载点使用率到 80% 以上就要警惕了,尤其像 /、/var/log、/data 这类关键路径。df 显示的是文件系统层面的空间,但文件已经删除、进程还在占用的情况它看不出来。遇到"文件删了空间没释放"的怪问题,用 lsof 查谁占用了被删除的文件:
bash复制lsof | grep deleted
找到占用进程后重启或 kill 掉,空间才会真正释放。这是运维排查里一个非常经典的知识点。
inode 耗尽也是隐藏杀手。df -h 显示空间还有几十GB,但系统仍然报"no space left on device",多半是 inode 满了:
bash复制df -i
Ifree 如果显示 0%,说明小文件塞满了 inode 表。这种问题的典型场景是邮件队列堆积、docker overlay2 目录产生大量临时文件、或者日志没有轮转。清理一批小文件就能恢复。
内存排查不要只看 free 里的 used 列,Linux 会把空闲内存用作缓存(buff/cache),表面上 used 很大,其实 cache 可以回收。要看真实的可用内存,关注 free -h 输出的 available 列比较准确。它表示在不触发 swap 的前提下,系统实际还能分配给新进程的内存。如果 available 长期低于 500MB,就该考虑加内存或者排查内存泄漏了。
3.2 进程状态的深度解读
top 是最常用的进程监控工具,但很多人的解读方式有问题。top 默认按 CPU 排序,看到某个进程 CPU 100% 就认为它是罪魁祸首,其实要先区分是用户态消耗还是内核态消耗,前者可能是业务代码死循环,后者可能是频繁中断或者系统调用异常。
更精细的排查方式是用 ps aux 加排序:
bash复制ps aux --sort=-%mem | head -20
ps aux --sort=-%cpu | head -20
这两个命令分别按内存和CPU使用率排序,快速定位最耗资源的进程。找到进程 PID 后,可以看一下它的详细状态:
bash复制cat /proc/PID/status
ls -l /proc/PID/fd/
/proc/PID/fd 目录下列举了进程打开的所有文件描述符。如果这里数量爆炸,说明程序有文件描述符泄漏,进程连接数满了之后就会拒绝新请求。之前排查过一个 Java 应用频繁报 too many open files,就是这里发现问题,最终确认是 HttpClient 连接没释放。
还有一个低成本的排查工具是 pstree,把进程的父子关系画成一棵树。用来判断僵尸进程特别有用,凡是状态是 Z 的进程,都是父进程没有正确回收的子进程。僵尸进程杀不掉,只能处理其父进程。
3.3 日志查看的几个高效姿势
排障离不开日志。很多人在日志文件里 grep 关键词,一条一条翻,效率很低。我推荐几个组合用法。
实时跟进日志输出:
bash复制tail -f /var/log/nginx/access.log
加 -F 的作用是文件被轮转后自动重新打开,避免日志切割后 tail 还在盯旧文件。这是 tail -f 和 tail -F 最重要的区别,生产环境我几乎只用 -F。
看最近1000行日志并搜索关键词:
bash复制tail -n 1000 /var/log/messages | grep -i error
如果要看某一个时间窗口内的记录,用 sed 截取:
bash复制sed -n '/2025-01-10 00:00:00/,/2025-01-10 00:05:00/p' /var/log/app.log
这个命令会把两个时间点之间的日志全部打印出来。注意这里的匹配是字符串匹配,要求日志里时间格式一致,否则可能截不准。
排查系统级日志用 journalctl 更直接。查上一次启动以来的错误信息:
bash复制journalctl -b -p err
-b 表示本次启动的日志,-p err 只显示 error 及以上级别的消息。如果系统存在频繁崩溃重启的问题,这个命令能帮你快速定位是哪一步出的问题。
4. 网络排查与远程连接的关键命令
4.1 从 ping 到端口连通性检查
网络排查的顺序很重要。很多人一上来就 ping 目标 IP,ping 不通就说网络不通,其实 ping 走的是 ICMP 协议,很多服务器会禁 ping,但业务端口是完全正常的。判断网络问题要分层看。
第一步确认链路和路由通不通,用 ping -c 4 目标IP。通了说明二层三层没问题。接着检查端口,telnet 是一个老牌但有效的工具:
bash复制telnet 192.168.1.10 80
如果端口连通,telnet 会进入一个空会话界面,按 Ctrl+] 然后输入 quit 退出。如果端口不通,会提示 Connection refused 或者超时,说明服务没监听或者防火墙拦截了。
不过现在很多系统默认不装 telnet 客户端,用 nc(netcat)替代更方便。测试 TCP 端口连通性:
bash复制nc -zv 192.168.1.10 22
nc -zv 192.168.1.10 80 443
-z 表示只扫描不发送数据,-v 显示详细信息。批量检查多个端口时非常好用。
如果 ping 通、端口不通,大概率是防火墙或者安全组的问题。检查本机防火墙:
bash复制firewall-cmd --list-all # CentOS 7+
ufw status verbose # Ubuntu
iptables -L -n # 通用查看
注意 iptables 命令在云服务器上很常见,但很多云厂商的安全组是在虚拟机外层的,就算本机防火墙全放开,安全组不放行也白搭。这种情况要先去云控制台检查安全组规则。
4.2 ss 与 netstat 的现代替代
很多人还在用 netstat,但现代系统我更推荐 ss 命令,它性能更好,输出也更清晰。查看当前监听端口和对应的进程:
bash复制ss -lntp
拆解一下:-l 只显示监听中的 socket,-n 不做 DNS 反解直接显示 IP 和端口,-t 只显示 TCP,-p 显示进程信息。这一条命令基本能回答"哪个服务监听在哪个端口"这个高频问题。
查看已建立的连接数,排查连接数过高的问题:
bash复制ss -ant | wc -l
ss -ant state established | wc -l
第二条只统计 established 状态的连接。如果连接数异常高,查看连接分布:
bash复制ss -ant state established | awk '{print $4}' | sort | uniq -c | sort -rn
按本地端口统计连接数,能快速定位是哪个服务占用了大量连接。之前排查过一台生产服务器连接耗尽,就是通过这个方式发现某个端口积压了上万条连接,最终定位到是客户端连接池配置过大。
4.3 域名解析与延迟探测
排查"能 ping 通 IP 但访问域名失败"的问题时,优先确认 DNS 解析。用 dig 查询域名解析记录:
bash复制dig example.com
dig @8.8.8.8 example.com # 指定DNS服务器查询
nslookup 也可以,但 dig 输出更详细,能直接看到 TTL、A 记录、以及查询耗时。如果使用系统默认 DNS 解析失败,而指定公共 DNS 成功,说明本地 DNS 服务器配置有问题,检查 /etc/resolv.conf:
bash复制cat /etc/resolv.conf
探测网络链路延迟用 traceroute 或 mtr:
bash复制traceroute -n 8.8.8.8
mtr -r -c 10 8.8.8.8
mtr 结合了 ping 和 traceroute 的能力,-r 表示报告模式,-c 10 发送 10 个包后输出统计。它能看每一跳的丢包率和延迟。实测中我对跨地域链路排障基本都用 mtr,比单一工具直观太多。
5. 软件安装与服务的生命周期管理
5.1 包管理器的选择与软件源设置
Linux 下的软件安装有两套主流体系:apt(Debian/Ubuntu)和 yum/dnf(CentOS/RHEL)。新系统建议直接用 dnf,它的依赖解析性能和输出可读性都优于 yum。
用 apt 安装软件:
bash复制apt update
apt install -y nginx
update 的作用是刷新软件包索引,不执行的话可能装的是旧版本或者提示找不到包。-y 表示自动确认,省去交互步骤。卸载软件时要区分 remove 和 purge:
bash复制apt remove nginx # 保留配置文件
apt purge nginx # 连配置文件一起删除
如果遇到国内服务器下载慢的问题,我会换成国内镜像源。修改 /etc/apt/sources.list 后执行 apt update 生效。换源注意备份原文件,否则出了问题要上网找原配置比较麻烦。
centos 系统上用 dnf 安装软件:
bash复制dnf install -y redis
dnf remove redis
同样,如果默认源里没有某个软件,需要先安装 epel-release 扩展源,再搜索安装:
bash复制dnf install -y epel-release
dnf search nginx
很多软件所在仓库不同,搜不到先换源再加扩展源,这个问题在 CentOS 上出现频率极高。
5.2 systemd 服务管理的基本功
目前主流的 Linux 发行版都用 systemd 管理服务。systemctl 命令是这套体系的核心入口。最常用的几个操作:
bash复制systemctl start nginx
systemctl enable nginx
systemctl status nginx
systemctl restart nginx
systemctl stop nginx
start 是临时启动,enable 是设置开机自启,两个命令要分开执行。有些人只 start 不 enable,服务器一重启服务就不在了。查看服务是否设置开机自启:
bash复制systemctl is-enabled nginx
如果服务状态显示 failed,用 journalctl 查看服务日志:
bash复制journalctl -u nginx.service -n 50
-n 50 表示看最近50行日志。systemd 的日志管理比传统 syslog 更强,同一个服务的所有输出都会集中管理。
如果修改了服务的配置单元文件(/etc/systemd/system/xxx.service),需要先执行 daemon-reload 再重启服务:
bash复制systemctl daemon-reload
systemctl restart xxx
改完 service 文件不 reload 就 restart,经常出现配置不生效的诡异问题,这个问题我遇到过不下三次。
5.3 用 Docker 部署的基本流程
容器化部署已经成为标配,热搜里"linux安装docker"说明大家都有这个需求。在 Ubuntu 上安装 Docker 的官方流程比较简洁:
bash复制curl -fsSL https://get.docker.com | sh
systemctl enable docker
systemctl start docker
安装完成后,可以顺手配置一个国内镜像加速器,编辑 /etc/docker/daemon.json,加入镜像源后重启 docker:
bash复制systemctl restart docker
拉取镜像并运行容器:
bash复制docker run -d --name nginx -p 80:80 nginx
-d 后台运行,--name 指定容器名,-p 把宿主机的80端口映射到容器的80端口。如果宿主机 80 端口已被占用会报错,换一个映射端口即可。
查看容器状态和日志:
bash复制docker ps -a
docker logs -f nginx
进入容器内部调试:
bash复制docker exec -it nginx bash
这里注意 -it 是必须的,-i 保证标准输入打开,-t 分配伪终端,少了任一参数交互式 Shell 都用不起来。排查容器起不来的问题,第一件事就是 docker logs 看报错,盲猜配置问题效率太低。
6. 版本管理与调试工具的高频操作
6.1 git 日常操作中的效率细节
git 的常用命令大家都熟悉,但很多人的使用习惯停留在 add、commit、push 三板斧。这里分享几个容易忽略但实用的细节。
查看工作区状态和差异:
bash复制git status # 查看当前变更
git diff # 查看未暂存的修改
git diff --cached # 查看已暂存的修改
撤销操作是很多人的痛点。改错文件想回退,区分三种场景:
bash复制git restore README.md # 丢弃工作区的修改
git restore --staged README.md # 撤销暂存,保留工作区修改
git revert <commit-id> # 用一次新的提交来撤销某次提交
git reset 也能回退,但要区分 --soft、--mixed、--hard 三个参数,其中 --hard 会直接丢弃工作区和暂存区的所有修改,非常危险。在共享分支上永远不要用 git reset 去重写历史,应该用 git revert。这是我踩过坑后的血的教训。
看提交历史时,用图形化和单行模式更直观:
bash复制git log --oneline --graph --all
分支管理中等分支切换,如果本地有未提交的修改,git checkout 会拒绝切换分支。可以先用 git stash 暂存变更,切换完分支再用 git stash pop 恢复。这个原子操作组合非常实用。
6.2 vim 里高频操作的进阶用法
vim 是 Linux 绕不开的文本编辑器。很多人问"linux常用命令vi替换单词",vi/vim 的替换功能确实是日常高频需求。基本替换语法是:
vim复制:%s/old/new/g
拆解一下:%s 表示全文件替换,old 是查找内容,new 是替换内容,g 表示替换每一行中的所有匹配项,而不只是第一个。如果只替换当前行,去掉 % :
vim复制:s/old/new/g
如果替换前想逐个确认,加 c 标志:
vim复制:%s/old/new/gc
每一次匹配都会询问 y(确认)、n(跳过)、a(全部替换)、q(退出)。生产配置文件的批量替换我强烈建议加 c,能避免很多手误。
vim 的高效操作还包括跳转:gg 跳到文件开头,G 跳到文件末尾,行号+G 跳到指定行。搜索用 /关键字 然后 n 跳到下一个匹配。撤销用 u,恢复用 Ctrl+R。
还有一个小技巧,处理多文件时用 vim -p file1 file2 分标签打开,接着用 gt 切换标签。vim 默认没有启用语法高亮,编辑配置文件时在 /etc/vimrc 或 ~/.vimrc 里加上 syntax on,阅读体验会好很多。
6.3 gdb 调试程序的入门路径
遇到程序崩溃,只会看日志效率太低。gdb 是 Linux 下最经典的调试工具,热搜里"gdb调试常用命令"说明这块需求量不小。
编译时要加 -g 参数保留调试信息,否则 gdb 看不到源码和变量名:
bash复制gcc -g -o test test.c
启动调试最基本的操作:
bash复制gdb ./test
(gdb) break main # 在main函数设置断点
(gdb) run # 开始运行
(gdb) next # 单步执行,跳过函数
(gdb) step # 单步执行,进入函数
(gdb) print x # 打印变量x的值
(gdb) continue # 继续运行到下一个断点
程序崩溃时,gdb 能直接告诉我们崩溃位置和调用栈:
bash复制gdb ./test core
(gdb) bt # 查看调用栈
bt 输出从当前崩溃点一路回溯到 main 函数的调用链,能快速定位是哪个函数、哪一行触发了段错误。排查内存越界或者空指针问题时,gdb 配合 bt 的输出基本是最高效的路径。
如果程序运行过程中崩溃但没留下 core 文件,先确认 ulimit -c 是否为 0。设置为 unlimited 后重新运行程序,崩溃时就会生成 core 文件:
bash复制ulimit -c unlimited
这个设置只对当前 Shell 生效,需要持久化的话写进 /etc/profile 或者 /etc/security/limits.conf。
7. 排查问题的方法论与实用技巧
7.1 先看整体再看局部
排查系统问题的思路很重要。很多人遇到问题先钻进细节里,比如直接 tail -f 日志找异常,但缺乏整体视角经常会白费功夫。我的习惯是先看系统整体状况,再定位具体进程和日志。
第一步用 uptime 看系统负载。负载值大于 CPU 核数时,说明系统处于过载状态,这时候再多的操作都会变慢。第二步用 free -h 看内存,第三步 df -h 看磁盘,第四步 ss -lntp 看服务端口。四步走完,大部分问题的范围就能确定下来。
这个顺序的意义在于排除法:要么资源问题,要么服务问题,要么网络问题。直接把范围收敛到某个维度,接着用针对性的工具深挖。比如负载高,继续用 top 看是 CPU 还是 IO 占满;端口不通,继续查防火墙和服务状态。
7.2 日志的时间轴思维
排障时把日志按时间轴串起来,比单纯 grep 一个关键词有效得多。具体做法是:确定故障时间点,往前翻5分钟,往后翻5分钟,把这10分钟里所有相关日志按时间顺序列出来,不看级别只看链条。
遇到异常堆栈时,不要只看报错那一行,往上翻看调用链。很多问题表面上是 A 报错,根源在 B 的调用。比如数据库连接池满,报错的是业务接口超时,但根本原因是某条慢 SQL 拖垮了连接池。
串联日志的实用工具是 grep 加上下文参数:
bash复制grep -A 20 "Exception" app.log
grep -B 5 "timed out" app.log
-A 显示匹配行之后的内容,-B 显示匹配行之前的内容,-C 显示前后各多少行。看堆栈信息时 -A 20 是标准操作,能覆盖大部分异常栈的深度。
7.3 小步快跑的实验原则
排查问题时的每一步操作都要有明确目的,不要同时改多个变量,否则出了问题根本不知道是哪个改动导致的。我习惯遵循一个原则:一次只改动一个点,改完立即验证,确认无效再回滚。
比如服务端口不通,先从本机 ss 确认服务是否监听,然后检查防火墙,再检查云平台安全组。不要同时关防火墙又改服务配置,那样出了问题无从排查。验证成功一个环节再进入下一个环节,问题范围会一步步缩小。
修改配置前备份原文件也是基本操作:
bash复制cp /etc/nginx/nginx.conf /etc/nginx/nginx.conf.bak
不要嫌麻烦,生产环境的应急恢复往往就靠这一条备份。我处理过太多因为改配置文件忘记备份,导致回滚无门的情况。备份文件多花十秒钟,出了事故能省下几个小时。
7.4 常用命令的"速查表"思维
我经常被问到"Linux 命令那么多,怎么记得住"。我的答案是:记不住不要紧,但要有一套自己的速查体系。系统自带的 man 和 --help 永远是最基础的帮助源,但更实用的是自己沉淀一份高频命令笔记,按场景分类,用到时翻一下。
分享一个我自己整理的高频命令速查表结构,按场景分类:
| 场景 | 高频命令组合 |
|---|---|
| 磁盘排查 | df -h, df -i, du -sh *, lsof | grep deleted |
| 内存排查 | free -h, top, ps aux --sort=-%mem |
| 网络排查 | ping, ss -lntp, nc -zv, traceroute, curl -I |
| 服务管理 | systemctl status/restart/enable, journalctl -u |
| 日志查看 | tail -F, grep -C 10, sed -n '/time1/,/time2/p' |
| 文件传输 | scp -P, rsync -avz --progress |
| 权限调整 | chmod, chown, usermod -aG, umask |
这里的每一条都是对应场景下的高频操作,熟练使用这套组合覆盖了日常运维中八成以上的问题。剩下的遇到具体问题再查,慢慢沉淀进自己的笔记。
还有一个小技巧:在 ~/.bashrc 里给高频长命令设置别名,比如:
bash复制alias llt='ls -lhtr'
alias ports='ss -lntp'
alias myip='curl ifconfig.me'
alias 是在当前 Shell 生效的,写入 ~/.bashrc 后执行 source ~/.bashrc 就能立即生效。长期积累下来,这些别名就是最贴合个人使用习惯的流水线工具。
8. 一些个人体会
这套命令梳理下来,不知不觉写了十几篇。回头看来,Linux 命令本身不难,难的是把它放在正确的场景里。rm -rf 谁都会敲,但知道什么时候该用 rm -i、什么时候该先移动到回收目录,才是经验积累出来的判断力。
我给新人的建议是:不要试图背命令,而是带着问题去查。遇到"磁盘满了"就去查 df、du、lsof,遇到"端口不通"就沿着 ss、firewall、云控制台的链路排查。问题解决得多了,命令自然就记住了。
最后说个小细节:局域网内传文件优先用 rsync,跨机房传输记得加 --timeout;修改系统文件之前一定备份;配置持久化不要在 /etc/rc.local 里直接写命令,改用 systemd 服务。这些经验不是书本上写的,都是实际操作中踩出来的。
