5:用 top/ps/killall/fdisk 排查磁盘与进程的实操清单)
1. 磁盘告警与进程失控实习期最容易踩的两个坑刚接手一台 Linux 服务器最先遇到的两类告警基本跑不掉磁盘写满导致服务起不来或者某个进程把 CPU 吃满让 SSH 都卡住。这两个场景看起来简单但真到线上排查时很多人会卡在「命令敲了但看不懂输出」这一步。这篇内容面向刚接触 Linux 的实习生把fdisk、top、ps、killall这四个命令串成一条完整的排查链路。核心检索词就是 Linux 磁盘分区查看与进程管理排查你能学到的是怎么用fdisk -l确认分区和挂载状态怎么用top和ps定位异常进程最后怎么用killall安全收尾。每一步都有可直接复制的命令和验证动作不是只讲概念。我自己的习惯是排查过程用 TaoToken 统一记录把命令、输出、结论整理成可复用的运维笔记。这样下次遇到同类问题直接翻笔记就行不用重新想一遍。下面按实际操作顺序展开你可以跟着敲一遍。2. 用 fdisk 查看分区与挂载磁盘告警排查第一步磁盘告警的第一反应不应该是删文件而是先搞清楚磁盘到底怎么分的、挂到哪了。fdisk就是干这个的。先看整体分区情况sudo fdisk -l输出里你会看到类似/dev/sda、/dev/vda、/dev/nvme0n1这样的设备名每个设备下面列出分区表。重点看三列Device分区名、Size大小、Type类型。如果某块盘有空间但没分区这里会显示为空。接着确认挂载关系df -hdf -h的输出自上而下是文件系统、容量、已用、可用、挂载点。如果某个挂载点的Use%接近 100%那就是告警源头。注意df -h只显示已挂载的分区没挂载的盘不会出现所以要和fdisk -l对照着看。举个实际例子。假设你新加了一块 20G 的硬盘fdisk -l能看到/dev/sdb有 20G 但没有任何分区。这时候需要先分区sudo fdisk /dev/sdb进入交互界面后按n新建分区选p主分区分区号默认 1起始扇区回车结束扇区输入10G表示分 10G。然后按w保存退出。再执行fdisk -l就能看到/dev/sdb1了。分区完还要格式化sudo mkfs.ext4 /dev/sdb1格式化后查看 UUIDsudo blkid /dev/sdb1拿到 UUID 后写入/etc/fstab实现开机自动挂载。这里有个坑如果 fstab 写错重启后系统可能进不去。所以写完先执行sudo mount -a测试没报错再重启。mount -a会自动挂载 fstab 里所有未挂载的条目如果挂载失败会直接报错比重启后才发现问题安全得多。挂载成功后用df -h再看一次新磁盘应该出现在列表里。这一步做完磁盘层面的排查就算有了基础。3. 用 top 和 ps 定位异常进程CPU 飙高怎么查磁盘确认没问题后如果服务还是卡大概率是进程在捣乱。top和ps是两把不同的刀top看动态ps看静态快照。先敲toptop默认按 CPU 使用率排序最上面几行是系统整体负载。重点看%Cpu(s)那一行的us用户态和sy内核态如果us长期高于 80%说明有进程在疯狂计算。下面进程列表里PID是进程号%CPU和%MEM是资源占用COMMAND是进程名。top里有个实用操作按K键会提示输入 PID默认终止第一个进程。但我不建议在top里直接杀因为容易误操作。更好的做法是先记下 PID退出top再用kill或killall处理。ps适合做精确查询。比如查某个进程ps aux | grep nginxaux参数组合表示显示所有用户的所有进程包括没有终端的。输出里STAT列能看出进程状态R是运行中S是睡眠Z是僵尸D是不可中断睡眠。如果看到大量D状态进程可能是 IO 卡住了要回头查磁盘。再比如按 CPU 排序取前 10ps aux --sort-%cpu | head -n 11这个组合在写排查脚本时特别有用能快速定位消耗大户。--sort-%cpu表示按 CPU 降序head -n 11是因为第一行是表头。定位到异常进程后先别急着杀。用ps -p PID -o pid,ppid,user,cmd确认一下这个进程是谁启动的、父进程是谁。如果是某个服务的子进程杀了它父进程可能会重新拉起这时候要处理的是父进程或者服务配置。4. 用 killall 收尾安全终止进程的正确姿势确认要终止进程后killall比kill更方便因为它按进程名操作不用记 PID。但有个前提killall命令来自psmisc包很多最小化安装的系统没有。先检查which killall如果没有输出说明没装。安装命令sudo yum install psmisc -y # CentOS/RHEL sudo apt install psmisc -y # Debian/Ubuntu装完后就可以用了。比如终止所有 nginx 进程sudo killall nginx默认发的是SIGTERM信号 15这是优雅终止进程有机会保存状态再退出。如果进程不响应再用-9强制杀sudo killall -9 nginx-9是SIGKILL进程无法忽略直接被杀。但要注意强制杀可能导致数据丢失或文件锁没释放所以优先用默认信号。杀完验证一下ps aux | grep nginx如果只剩 grep 自己那一行说明进程已经清干净了。如果还有残留检查是不是有守护进程在自动拉起比如 systemd 管理的服务要用systemctl stop而不是killall。这里有个我踩过的坑killall后面跟的进程名必须完全匹配Linux 进程名有 15 字符限制太长的名字会被截断。如果killall没反应先用ps aux确认实际进程名。5. 常见报错排查401、local proxy failed、reading choices 怎么处理排查过程中如果涉及 API 调用或远程工具容易遇到几类固定报错。这里对照真实场景说清楚。401 Unauthorized通常是 Key 没配或配错。检查你的环境变量或配置文件里的 Key 是否完整有没有多余空格。如果用 TaoToken 统一管理 Key确认请求头里的Authorization格式是Bearer 你的Key。local proxy failed这个报错一般出现在本地代理配置和实际网络环境不匹配时。检查你的工具配置文件里 Base URL 是否指向了正确的地址。比如用 Cline 或 Claude Code 时Base URL 要填https://taotoken.net/api不要多加路径。reading choices 报错这是解析响应时找不到choices字段通常是因为返回的不是标准模型响应格式。检查 Model ID 是否填对比如claude-sonnet-4-20250514这类完整 ID不要简写。如果用的是 Codex 的auth.json确认里面base_url和model两个字段都正确。OAuth 相关报错如果工具走 OAuth 流程检查回调地址是否和配置一致。这类问题多半出在重定向 URL 上和 Key 本身无关。遇到这些报错时先把 Base URL、Key、Model ID 三件套核对一遍。以 Cline 的 MCP 配置为例settings.json里应该是这样的结构{ mcpServers: { taotoken: { command: npx, args: [-y, taotoken/mcp-server], env: { TAOTOKEN_API_KEY: 你的Key, TAOTOKEN_BASE_URL: https://taotoken.net/api, TAOTOKEN_MODEL: claude-sonnet-4-20250514 } } } }如果是 Claude Code 的配置路径在~/.claude/settings.json字段名类似。Codex 的auth.json则放在~/.codex/auth.json里面写api_key和base_url。三件套对齐后大部分 401 和 proxy failed 都能解决。6. 把排查过程沉淀成可复用笔记排查完一次磁盘告警或进程失控如果不记录下次还得重新想。我的做法是用 TaoToken 的模型对话能力把命令和输出整理成结构化笔记。具体操作打开模型对话页面把fdisk -l、df -h、top、ps aux的输出贴进去让模型帮你归纳成「现象-命令-结论」三段式。比如磁盘满的场景笔记里会记下现象是df -h显示/分区 100%命令是du -sh /* | sort -rh | head结论是/var/log占了大头。这样积累下来你就有了一套自己的运维排查清单。下次遇到类似问题直接翻笔记对照执行效率会高很多。TaoToken 在这里的作用是统一 Key 和 API 通道不用在多个工具之间来回切换配置记录和调用都在一个地方完成。如果你还在用零散的 Key 管理方式可以试试把常用工具的 Base URL 都指向https://taotoken.net/apiKey 统一在控制台生成。这样排查时不会因为 Key 过期或配错而中断思路。需要生成新 Key 的话去 API Keys 页面操作就行。接入文档里有各工具的详细配置示例照着填不会出错。排查这件事工具是次要的思路和记录习惯才是关键。先把fdisk、top、ps、killall这条链路跑熟再慢慢加别的命令比一上来背一堆参数有用得多。