ps:给进程拍快照
$ ps aux | grep java
app 12345 8.5 32.1 8021888 ... java -jar app.jar
↑PID ↑CPU% ↑内存%
$ ps -ef --forest # 树状显示进程父子关系(谁是谁的子进程)所有排障动作都从拿到 PID 开始:看它监听的端口(ss -ltnp)、读它的档案(/proc/PID/)、对它发信号(kill)。JVM 系列里 jstack、jmap 的第一个参数也是它。
top:实时仪表盘怎么读
$ top
top - 10:00:01 up 30 days, load average: 0.52, 0.58, 0.59
%Cpu(s): 12.5 us, 3.1 sy, 0.0 ni, 83.9 id, 0.3 wa
MiB Mem : 7800.0 total, 1200.0 free, 4200.0 used, 2400.0 buff/cacheload average 三个数 = 最近 1 / 5 / 15 分钟的平均负载(等待 CPU + 等待磁盘的进程数)。经验值:持续超过 CPU 核心数就是过载,4 核机器 load 到 8 就该动手查了。三个细分指标:us 高是用户代码吃 CPU(应用自身问题);sy 高是内核忙(系统调用太频繁);wa 高是 CPU 在等磁盘 I/O(瓶颈在盘不在 U)。
top 交互三连:大写 M 按内存排序、大写 P 按 CPU 排序、数字 1 展开每颗核心。
kill:发的不是「杀死」,是信号
$ kill 12345 # 默认 SIGTERM(15):请你自行收尾退出
$ kill -9 12345 # SIGKILL:内核直接掐断,进程无法拦截
$ kill -l # 查看全部信号
$ killall java # 按进程名杀(危险:所有同名进程一起死)
$ pkill -f app.jar # 按完整命令行匹配杀(更精准)军规:先发 15,等十秒,不行再 9。-15 给进程善后机会(释放连接、刷盘、保存状态);-9 不给任何机会——数据库进程被 -9 可能触发漫长的崩溃恢复,网络服务可能端口卡在 TIME_WAIT 迟迟不能重绑。
僵尸与孤儿
僵尸进程:子进程已死,父进程没「收尸」(没调用 wait),ps 里状态显示 Z。它已经死了所以 kill 不掉,正确解法是修复父进程或重启父进程。孤儿进程:父进程先死,子进程被 1 号进程收养后继续运行——通常无害。
$ ps aux | awk '$8 ~ /Z/ {print $2, $11}' # 找出所有僵尸进程前后台切换与 CPU 飙高第一现场
$ ./long-task.sh & # 末尾加 & 后台运行
$ jobs # 查看后台任务列表
$ fg %1 # 把 1 号后台任务调回前台
# Ctrl+Z 暂停当前任务,再敲 bg 让它转后台继续跑CPU 飙高的标准起手式:top 找到吃 CPU 的 PID → Java 进程用 jstack 按线程定位(JVM 系列讲过)→ 其他进程看 /proc/PID 或 strace 追系统调用。但注意:直接 & 跑的后台任务,SSH 一断就死——下一篇讲它的正确替代品:nohup 与 tmux,让任务在断线后依然活着。
评论 (0)