ARTICLE · INTELLIGENCE

战地情报 · 详情页

来自尧图项目组的一线实战观察与深度解析

工程师必备:构建个人命令手册提升运维与开发效率

工程师必备:构建个人命令手册提升运维与开发效率 1. 从零到一为什么你需要一份自己的命令手册干了这么多年技术我电脑里最宝贵的文件之一不是什么高深莫测的源码而是一个名为my_commands.md的文档。它不是什么官方手册而是我这些年敲过的、查过的、踩过坑后记住的各类命令的集合。你可能会说现在搜索引擎这么发达需要什么命令搜一下不就行了这话对也不全对。当你面对一个紧急的生产故障需要在几十秒内定位问题或者当你切换到一个新环境网络受限工具链陌生又或者你只是想高效地完成日常重复性工作——那一刻你大脑里或者手边有一份自己整理、信手拈来的命令清单那种从容和效率是临时搜索无法比拟的。这份手册的核心价值不在于“全”而在于“用”。它不是一本包罗万象的百科全书而是你个人工作流的“快捷键”映射。它记录了你最常用的那些命令、最易忘的参数、以及最痛的教训总结。比如你知道用ps aux | grep xxx查进程但你是否清楚地记得如何精确过滤掉grep进程本身你知道用tar解压但面对.tar.gz,.tar.bz2,.tar.xz时是否总要犹豫一下该用z,j还是J参数这份手册就是为了消灭这些犹豫而生的。接下来我将以一名一线工程师的视角为你拆解如何构建和维护一份真正属于你、能极大提升效率的常用命令手册。我们会涵盖从 Linux 系统运维、容器化Docker/K8s、版本控制Git、到开发调试GDB, ADB、包管理NPM, Maven等多个核心场景。我不会简单罗列命令而是会告诉你每个命令在什么场景下用、为什么这么用、以及我踩过哪些坑。我们的目标是让你看完后不仅能获得一份现成的参考更能掌握构建自己知识体系的方法。2. 手册架构设计与核心原则在开始往手册里填充命令之前我们必须先想清楚它的结构。一个杂乱无章的命令列表其价值会随时间迅速衰减因为你根本找不到需要的内容。我自己的手册遵循以下几个核心原则这些原则决定了手册的实用性和可持续性。2.1 按场景与上下文组织而非按字母顺序这是最重要的一条原则。官方man页面或很多在线手册喜欢按字母顺序排列那是为了查阅方便但不是为了解决问题方便。我们的大脑在解决问题时是沿着“场景 - 任务 - 工具”这条路径思考的。例如当你遇到“磁盘空间不足”这个场景时你需要的是一系列相关的命令首先用df -h查看整体磁盘使用情况然后用du -sh * | sort -rh定位哪个目录最大接着可能需要用lsof | grep deleted查看是否有被删除但未释放的文件最后或许要用logrotate或find命令清理日志。这些命令在字母表上毫不相干但在逻辑上紧密相连。因此我的手册主要章节是这样划分的系统监控与诊断CPU、内存、磁盘、网络、进程。文件与文本处理查找、查看、编辑、比较、归档。网络操作与调试连接测试、端口查看、抓包、防火墙。进程与性能进程管理、性能分析、定时任务。用户与权限用户、组、文件权限、sudo。开发与构建Git, Maven, NPM, Python 环境等。容器与编排Docker, Kubernetes (k8s), Docker Compose。数据库操作连接、查询、备份、恢复以 MySQL/PostgreSQL 为例。特定工具链如 ADB安卓调试、GDBC/C调试、Vim 等。每个章节内部再按照“观察 - 诊断 - 操作”的逻辑子分类。2.2 命令格式参数、示例、输出解读三位一体记录一个命令绝不是只记录命令本身。一个完整的条目应该包含命令与核心参数写出最常用、最有效的参数组合。用表示需替换的变量用[]表示可选参数。一个清晰的示例展示一个具体的、贴近真实工作的用例。对关键输出的解读命令输出中哪些信息是关键如何解读这是新手和老手的最大区别。糟糕的记录ps aux查看进程良好的记录# 查看系统所有进程的详细信息常用于定位资源占用问题 ps aux # 示例查找与 nginx 相关的进程 ps aux | grep nginx # 输出列解读部分关键 # USER: 进程所有者 # PID: 进程ID # %CPU: CPU 占用百分比 # %MEM: 内存占用百分比 # VSZ: 虚拟内存大小 (KB) # RSS: 驻留物理内存大小 (KB) # STAT: 进程状态 (R: 运行, S: 睡眠, Z: 僵尸等) # START: 启动时间 # COMMAND: 启动命令注意直接使用ps aux | grep nginx会把自己grep nginx这个进程也显示出来。更精确的写法是ps aux | grep [n]ginx或pgrep -f nginx。2.3 融入“避坑指南”与“为什么”这是让你的手册从“参考资料”升级为“经验宝典”的关键。在每个命令或场景下记录你曾经犯过的错误、遇到的诡异问题以及解决方案。例如在tar命令下我会记录避坑使用tar时老手常犯的错是参数顺序。记住这个口诀“f参数必须紧跟文件名”。所以tar -czf archive.tar.gz dir/是对的而tar -cz archive.tar.gz dir/ -f是错的。另外解压时常用tar -xzf archive.tar.gz但更安全的做法是先tar -tzf archive.tar.gz查看内容列表确认无误再解压。在chmod命令下我会解释为什么数字模式755对应rwxr-xr-x。计算方式r4, w2, x1。所有者4217所属组4015其他人4015。这样理解后你就能轻松算出640(rw-r-----) 或777(rwxrwxrwx) 了。3. 核心场景命令精讲与实操要点下面我将选取几个最高频、最容易出错的场景深入讲解其中的命令并附上我的手册中的完整记录。你可以以此为模板填充你自己的手册。3.1 场景一系统资源突然告警如何快速定位瓶颈假设收到报警服务器 CPU 使用率持续 100%。你需要像侦探一样在终端里快速搜集线索。第一步全局视野快速定位问题方向# 1. 查看整体负载1分钟、5分钟、15分钟的平均负载。若核心数为4负载持续4则表明有进程在排队。 uptime # 2. 动态监控系统资源一个全能仪表盘。按1可以查看每个CPU核心的详情。 top # 在 top 界面中按 P (大写) 按CPU使用率排序按 M 按内存使用率排序。这是定位“罪魁祸首”进程最快的方法。 # 3. 更现代、更强大的替代品htop需安装。界面更友好支持鼠标操作垂直显示CPU颜色区分不同类型进程。 htop第二步深入剖析找到具体进程和线程如果top发现是某个 Java 进程 (java) CPU 很高这还不够我们需要知道是哪个线程。# 1. 找到高CPU进程的PID假设是 12345 ps aux | grep java # 2. 查看该进程下的所有线程资源占用情况 top -H -p 12345 # 或者使用 ps 命令 ps -eLf | grep 12345 | head -20 # 3. 将占用最高的线程ID例如 12346转换为16进制便于后续在日志或堆栈中查找 printf %x\n 12346 # 输出303a第三步结合日志和堆栈确定问题代码获取到高CPU线程的16进制ID如0x303a后我们可以获取该线程的堆栈信息。# 使用 jstack 获取 Java 进程的线程堆栈如果是 Java 应用 jstack 12345 /tmp/thread_dump.log # 然后在 /tmp/thread_dump.log 文件中搜索 nid0x303a就能看到这个线程正在执行什么代码。 # 如果是 C/C 程序可以使用 gdb 附加到进程然后查看线程 gdb -p 12345 (gdb) info threads # 查看所有线程 (gdb) thread apply all bt # 打印所有线程的堆栈我的手册记录要点将top/htop的快捷键说明P, M, 1直接写在命令下方。记录ps -eLf输出中NLWP线程数和PSR运行在哪个CPU核心列的含义。强调printf “%x\n”这个将线程PID转16进制的小技巧并附上示例。区分不同语言Java, C, Go程序获取线程堆栈的不同命令。3.2 场景二高效处理文本与文件——开发者的基本功文本处理是命令行中最体现效率的地方。grep,awk,sed,find是四大天王。grep不仅仅是查找# 基础查找 grep ‘error’ /var/log/app.log # 在文件中查找包含‘error’的行 # 强大之处在于选项和管道结合 grep -r ‘TODO’ /project/src # -r 递归查找目录 grep -n ‘panic’ app.log # -n 显示行号 grep -v ‘INFO’ app.log # -v 反选排除包含‘INFO’的行 grep -E ‘error|warning|critical’ app.log # -E 使用扩展正则表达式 grep -C 3 ‘Exception’ app.log # -C 显示匹配行的前后3行上下文 ps aux | grep -v grep | grep nginx # 经典组合排除 grep 进程自身避坑grep默认使用基础正则表达式BRE?,,|,()需要转义或使用-E选项。在查找固定字符串时使用grep -F ‘string’速度更快且不会将字符串中的点.误解为正则的通配符。awk文本处理的瑞士军刀awk擅长处理结构化的文本如 CSV、日志、命令输出。其核心模式是pattern {action}。# 示例分析访问日志统计每个IP的访问次数 # 假设日志格式$1是IP$7是请求路径 awk ‘{print $1}’ access.log | sort | uniq -c | sort -rn | head -10 # 示例只处理包含‘POST’的行并打印时间和路径 awk ‘/POST/ {print $4, $7}’ access.log # 示例计算文件第二列的总和 awk ‘{sum $2} END {print sum}’ data.txt # 示例使用自定义分隔符比如冒号打印 /etc/passwd 的用户名和shell awk -F: ‘{print $1, $7}’ /etc/passwd为什么awk将每一行按分隔符默认空格分割成$1,$2...$NF。$0代表整行。BEGIN和END块分别在处理开始和结束时执行一次非常适合做初始化和汇总。find定位文件的终极武器find的强大在于其丰富的测试条件和可执行动作。# 基础按名称查找 find /home -name ‘*.log’ # 按类型查找 find . -type f # 普通文件 find . -type d # 目录 find . -type l # 符号链接 # 按时间查找非常实用 find /var/log -mtime -7 # 过去7天内修改过的文件 find . -mmin -30 # 过去30分钟内修改过的文件 find . -newer reference.txt # 比 reference.txt 更新的文件 # 按大小查找 find . -size 100M # 大于100MB的文件 find . -size -10k # 小于10KB的文件 # 组合条件并且-a可省略或者-o非-not find . -type f -name ‘*.tmp’ -mtime 30 # 查找30天前的 .tmp 文件 # 找到后执行动作-exec 或 -delete find /tmp -type f -name ‘*.tmp’ -mtime 7 -delete # 删除7天前的tmp文件 find . -type f -name ‘*.js’ -exec chmod 644 {} \; # 将找到的js文件权限改为644注意-exec后面的{}代表找到的文件路径\;是命令结束符。使用-exec要格外小心特别是结合rm时。一个安全的最佳实践是先用-exec echo {} \;或-exec ls -l {} \;预览一下将要操作的文件确认无误后再执行真正的命令。3.3 场景三玩转容器与编排Docker Kubernetes容器化时代Docker 和 K8s 的命令是运维和开发的必备技能。Docker 核心命令流# 镜像操作 docker images # 列出本地镜像 docker pull nginx:alpine # 拉取镜像 docker rmi image_id # 删除镜像先删容器 docker image prune -a # 清理所有未被使用的镜像 # 容器生命周期 docker run -d --name my_nginx -p 80:80 nginx:alpine # 后台运行容器 docker ps # 查看运行中的容器 docker ps -a # 查看所有容器包括已停止的 docker stop container_id # 停止容器 docker start container_id # 启动已停止的容器 docker restart container_id # 重启容器 docker rm container_id # 删除已停止的容器 docker rm -f container_id # 强制删除运行中的容器 # 容器内交互与调试 docker exec -it container_id /bin/sh # 交互式进入容器Alpine用sh docker logs -f container_id # 实时查看容器日志 docker inspect container_id # 查看容器底层详细信息JSON格式 # 清理 docker system df # 查看Docker磁盘使用情况 docker system prune -a --volumes # 清理所有未使用的镜像、容器、网络和卷危险Kubernetes (k8s) 日常操作清单k8s 命令kubectl的语法通常是kubectl 动作 资源类型 [资源名称] [选项]。# 查看与描述 kubectl get pods # 查看默认命名空间下的Pod kubectl get pods -n kube-system # 查看指定命名空间的Pod kubectl get pods -o wide # 查看更多信息如节点IP kubectl get pods,svc,deploy # 同时查看多种资源 kubectl describe pod pod_name # 查看Pod的详细事件和状态 # 故障排查这是最重要的部分 kubectl logs pod_name # 查看Pod日志 kubectl logs -f pod_name # 实时查看日志 kubectl logs pod_name -c container_name # Pod内多容器时指定容器 kubectl exec -it pod_name -- /bin/sh # 进入Pod的容器 kubectl exec -it pod_name -c container_name -- /bin/sh # 进入指定容器 # 应用部署与管理 kubectl apply -f deployment.yaml # 应用/更新配置 kubectl delete -f deployment.yaml # 删除配置创建的资源 kubectl scale deployment/deploy_name --replicas5 # 伸缩副本数 kubectl rollout status deployment/deploy_name # 查看部署状态 kubectl rollout undo deployment/deploy_name # 回滚到上一版本 # 端口转发用于本地调试 kubectl port-forward svc/service_name 8080:80 # 将Service的80端口转发到本地8080 kubectl port-forward pod/pod_name 8080:80 # 直接转发Pod端口实操心得kubectl get时善用-o输出格式。-o wide看基础详情-o yaml或-o json获取完整配置用于调试-o name只输出资源名称便于管道传递。例如kubectl get pods -o name | xargs -I {} kubectl describe {}。4. 开发与协作工具链命令精要这一部分关乎日常开发效率命令虽小但熟练与否天差地别。4.1 Git不仅仅是git add/commit/push# 提交的艺术 git commit -m “feat: add new API endpoint” # 使用约定式提交 git commit --amend # 修改上一次提交未push前 git commit --amend --no-edit # 只修改文件不修改提交信息 # 分支管理 git branch -a # 查看所有分支本地和远程 git checkout -b feature/xxx # 创建并切换到新分支 git branch -d branch_name # 删除已合并的分支 git branch -D branch_name # 强制删除未合并的分支 # 查看与对比 git log --oneline --graph -10 # 图形化查看最近10条提交 git diff # 查看工作区与暂存区的差异 git diff --staged # 查看暂存区与仓库的差异 git diff HEAD~1 # 查看当前与上一次提交的差异 # 后悔药谨慎使用 git reset --soft HEAD~1 # 撤销上一次提交保留更改到暂存区 git reset --hard HEAD~1 # 彻底撤销上一次提交丢弃所有更改危险 git revert commit_id # 创建一个新的提交来撤销指定提交安全推荐用于公共分支 # 清理与优化 git clean -fd # 删除所有未跟踪的文件和目录-n 先预览 git gc --prunenow --aggressive # 垃圾回收压缩仓库4.2 包管理器NPM 与 MavenNPM (Node.js)# 初始化与安装 npm init -y # 快速生成 package.json npm install package # 安装到 dependencies npm install -D package # 安装到 devDependencies npm install -g package # 全局安装 # 版本管理与运行 npm update package # 更新包 npm outdated # 检查过时的包 npm run script_name # 运行 package.json 中定义的脚本 npm audit # 检查安全漏洞 npm audit fix # 自动修复可修复的漏洞 # 清理缓存 npm cache clean --forceMaven (Java)# 生命周期命令 mvn clean compile # 清理并编译 mvn clean test # 清理并运行测试 mvn clean package # 清理并打包生成jar/war mvn clean install # 清理、打包并安装到本地仓库 mvn clean deploy # 清理、打包并部署到远程仓库 # 跳过测试 mvn clean install -DskipTests # 跳过测试执行但会编译测试代码 mvn clean install -Dmaven.test.skiptrue # 完全跳过测试不编译也不执行 # 多模块项目 mvn clean install -pl module-a -am # 构建 module-a 及其依赖的模块5. 高频问题排查与命令组合技在实际工作中很多问题需要组合多个命令来解决。下面是我手册里记录的“组合技”片段。5.1 磁盘空间被谁吃了# 1. 查看整体使用情况 df -h # 2. 定位到占用最大的挂载点比如 /var cd /var # 3. 找出该目录下最大的文件或目录按大小排序 du -sh * | sort -rh | head -10 # 4. 如果发现是某个目录如 logs很大继续深入 du -sh logs/* | sort -rh | head -10 # 5. 有时文件已被删除但进程仍持有句柄空间未释放 lsof | grep deleted # 查看被删除但未释放的文件 # 输出会显示进程PID和文件大小重启对应进程即可释放空间。 # 6. 查找并删除特定类型的旧文件例如7天前的.log文件 find /var/log -name “*.log” -type f -mtime 7 -delete # 安全做法先执行 find ... -exec echo {} \; 或 -exec ls -l {} \; 确认文件列表5.2 网络端口与连接排查# 1. 查看本机监听的所有端口 sudo netstat -tulpn | grep LISTEN # 现代替代命令更清晰 sudo ss -tulpn | grep LISTEN # 2. 查看某个端口如8080被哪个进程占用 sudo lsof -i :8080 # 或 sudo ss -ltnp | grep :8080 # 3. 测试远程主机的端口是否可达 telnet host port # 如果未安装telnet可用nc nc -zv host port # 4. 查看当前系统的网络连接状态 ss -ant # 显示所有TCP连接不解析服务名 # 状态解读ESTABLISHED已建立TIME_WAIT等待关闭LISTEN监听 # 5. 查看实时网络流量按进程 sudo iftop # 需安装类似top的网络版 # 或使用 nethogs 查看每个进程的流量 sudo nethogs5.3 进程卡死或僵尸进程处理# 1. 查看僵尸进程STAT列为Z ps aux | grep ‘Z’ # 2. 僵尸进程无法用kill杀死需要杀死其父进程 # 找到僵尸进程的PID比如123和其父进程PPID ps -eo pid,ppid,stat,comm | grep ‘Z’ # 假设父进程PPID是456 kill -9 456 # 强制杀死父进程子进程僵尸会被init进程回收 # 3. 如果某个进程无响应D状态不可中断睡眠可能是IO问题。 # 查看进程状态 ps aux | grep process_name # 使用 iotop 查看磁盘IO情况需安装 sudo iotop # 使用 dstat 综合查看CPU、磁盘、网络IO dstat -cdngy6. 手册的维护与进化让它活起来一份静态的手册很快就会过时。让你的手册“活”起来才是长期受益的关键。1. 即时记录每当你在网上搜到一个有用的命令组合或者自己摸索出一个高效解法立刻把它添加到手册的对应章节。最好在命令后面加上日期和简短的上下文比如# 2023-10-27 用于排查XX项目内存泄漏。2. 定期回顾与清理每季度或每半年回顾一次手册。删除那些已经过时、不再使用或者有更好替代方案的命令。合并重复的内容。这个动作能强迫你重新思考自己的工作流。3. 版本化管理将你的命令手册放在 Git 仓库里。这不仅能备份还能通过提交历史看到自己技能的演进。你可以为手册创建不同的分支比如work、personal、linux、k8s或者用标签管理。4. 分享与共创在团队内部共享一个基础版的命令手册 Wiki鼓励大家共同维护。每个人遇到的场景不同积累的命令也不同集思广益能让手册变得无比强大。但切记个人手册里可以保留一些更私人的、与特定项目强相关的“独门秘籍”。5. 工具化辅助不要只记录命令可以记录一些简单的 Shell 脚本或别名Alias。例如在你的~/.bashrc或~/.zshrc中定义alias dps‘docker ps --format “table {{.ID}}\t{{.Image}}\t{{.Status}}\t{{.Names}}”’ alias k‘kubectl’ alias kgp‘kubectl get pods’ alias klog‘kubectl logs -f’把这些别名及其作用的说明也记录在手册的“效率工具”章节。最终这份命令手册会成为你外部化的“第二大脑”是你技术人格的一部分。它始于模仿和收集但最终会成长为你解决问题思维模式的直接体现。现在就打开一个文本编辑器或笔记软件创建你的my_commands.md文件从记录今天学到的第一个命令组合开始吧。
RELATED READING

延伸阅读

更多一线实战笔记与深度复盘,助您持续精进