t状态表示进程被信号主动停止或正被调试器追踪,与资源限制无关;资源受限导致的挂起通常表现为d状态、swap高占用或系统调用阻塞,需结合/proc/$pid/limits和strace诊断。

ps aux 输出里看到 T 状态不等于资源受限挂起
很多人一看到 ps aux 里某进程状态是 T,就以为是“被资源卡住”,其实不是。T 表示进程被信号(如 SIGSTOP)主动停止,或正被调试器追踪(t),和内存、文件数、CPU 时间等资源限制无关。真正因资源受限而“挂起”的进程,往往根本不会出现在 ps 的活跃列表里——它可能处于不可中断睡眠(D),或已被内核换出到 swap 区但尚未完全释放(即传统意义的“挂起”),此时 ps 显示仍是 S 或 R,但实际无法调度。
查资源限制是否触发,优先看 /proc/$pid/limits
资源类挂起(比如打开文件太多、内存耗尽、CPU 时间用完)通常发生在进程试图突破 ulimit 设置时,但系统不会直接标为 T,而是让系统调用阻塞或失败。确认是否资源触顶,最直接的方式是:
- 先用
ps aux | grep [关键词]找到目标进程 PID - 执行
cat /proc/$pid/limits,重点看Max open files、Max processes、Max locked memory这几行的Soft Limit是否已到上限 - 若
Soft Limit和Hard Limit相同且值很小(如1024),而进程日志里反复出现Too many open files或Cannot allocate memory,基本可断定是资源限制导致后续操作卡住
strace -p $pid 能暴露卡在哪个系统调用上
资源受限引发的挂起,常表现为某个系统调用长时间不返回,比如 open() 卡住(文件描述符满)、fork() 卡住(进程数超限)、mmap() 卡住(内存不足)。这时 strace 比 ps 更有效:
Zynq‑7000 / Zynq UltraScale+ 硬件调试技能。适用于 Xilinx Zynq(Cortex‑A9/A53 + FPGA)Linux 环境,调试 I2C、I2S、UART、GPIO 等外设。包括设备树配置、内核驱动、用户空间调试工具、交叉编译和常见问题排查,支持 PetaLinux 开发。
- 运行
strace -p $pid,观察最后几行是否停在某个系统调用上,例如:open("/var/log/app.log", O_WRONLY|O_APPEND) = ?(一直没返回) - 配合
lsof -p $pid | wc -l查当前打开文件数,对比/proc/$pid/limits中的Max open files - 注意:如果进程已处于
D状态(不可中断睡眠),strace会卡住自身,此时应先用cat /proc/$pid/status | grep State确认状态
swap 使用率高 + 进程 RSS 持续增长,暗示内存换出式挂起
当物理内存严重不足,内核会把部分进程页换出到 swap,进程本身仍显示为 S 或 R,但响应极慢、延迟陡增——这种“软挂起”最难察觉。判断方法:
- 运行
free -h和swapon --show,看 swap 使用率是否 >80% - 查进程内存:
cat /proc/$pid/status | grep -E "VmRSS|VmSize",再对比cat /proc/meminfo | grep -i "memavailable\|swapfree" - 若
VmRSS接近可用内存,且SwapFree极低,说明该进程很可能正在频繁换入换出,I/O 卡死在 swap 读写上
这类问题不会报错,也不改变进程状态码,但 top 里能看到 %CPU 很低、%MEM 很高、SWAP 列非零——最容易被忽略的是:它看起来“还在跑”,其实已经半瘫痪。










