温馨提示×

nohup日志如何排查卡死

小樊
44
2026-09-18 14:34:47
栏目: 编程语言

nohup 本身只是“忽略挂断信号、后台运行程序”,卡死通常不是 nohup 的问题,而是被它启动的进程卡住了。排查可以按下面步骤来。


一、先确认进程是否真的“卡死”

1. 看进程是否还在

ps -ef | grep 你的进程名
# 或
ps aux | grep 你的进程名

如果进程还在,但长时间无输出、无响应,才叫“卡死”。


2. 看 CPU / 内存状态

top -p 进程PID
# 或
htop
  • CPU 100% → 死循环
  • CPU 0% → 可能在等 IO / 锁 / 网络
  • 内存持续增长 → 内存泄漏

二、看 nohup 日志本身

默认日志:

nohup.out

或你指定的:

nohup xxx > app.log 2>&1 &

查看日志:

tail -f app.log

重点看:

  • 最后一条日志停在哪儿
  • 是否卡在某一步(如“连接数据库”)

三、判断卡在什么地方(非常关键)

1. 卡在 IO / 网络(CPU 低)

常见原因:

  • 数据库死锁
  • 远程接口超时
  • 文件读写阻塞

排查:

# 看进程在等什么
strace -p 进程PID

常见输出:

  • futex() → 等锁
  • read() / recvfrom() → 等网络或文件

2. 卡在锁(多线程程序)

pstack 进程PID
# 或
kill -3 进程PID   # Java 会打印线程栈到日志

看是否多个线程都在等同一把锁。


3. 卡在死循环(CPU 高)

perf top -p 进程PID

或直接 top 看哪个线程 CPU 高,再 pstack。


四、常见场景速查表

现象 可能原因
日志突然不更新 主线程阻塞
CPU 0% 等网络 / 锁
CPU 100% 死循环
多进程卡住 共享资源竞争
Java 程序卡 GC / 死锁

五、应急手段(生产环境)

1. 先保留现场

jstack PID > jstack.log   # Java
pstack PID > pstack.log

2. 再决定是否重启

kill PID
# 不行再
kill -9 PID

六、预防卡死建议

  • nohup 日志按大小轮转
  • 加超时(网络 / 数据库)
  • 用 supervisor / systemd 代替 nohup
  • 关键路径打日志

如果你愿意,可以把:

  • 程序语言(Java / Python / C++)
  • top / 最后日志截图
  • 是否多线程

发出来,我可以帮你精确定位卡死点。

0 踩