nohup 本身只是“忽略挂断信号、后台运行程序”,卡死通常不是 nohup 的问题,而是被它启动的进程卡住了。排查可以按下面步骤来。
ps -ef | grep 你的进程名
# 或
ps aux | grep 你的进程名
如果进程还在,但长时间无输出、无响应,才叫“卡死”。
top -p 进程PID
# 或
htop
默认日志:
nohup.out
或你指定的:
nohup xxx > app.log 2>&1 &
查看日志:
tail -f app.log
重点看:
常见原因:
排查:
# 看进程在等什么
strace -p 进程PID
常见输出:
futex() → 等锁read() / recvfrom() → 等网络或文件pstack 进程PID
# 或
kill -3 进程PID # Java 会打印线程栈到日志
看是否多个线程都在等同一把锁。
perf top -p 进程PID
或直接 top 看哪个线程 CPU 高,再 pstack。
| 现象 | 可能原因 |
|---|---|
| 日志突然不更新 | 主线程阻塞 |
| CPU 0% | 等网络 / 锁 |
| CPU 100% | 死循环 |
| 多进程卡住 | 共享资源竞争 |
| Java 程序卡 | GC / 死锁 |
jstack PID > jstack.log # Java
pstack PID > pstack.log
kill PID
# 不行再
kill -9 PID
supervisor / systemd 代替 nohup如果你愿意,可以把:
top / 最后日志截图发出来,我可以帮你精确定位卡死点。