温馨提示×

如何定位nohup日志异常

小樊
49
2026-10-12 07:46:21
栏目: 编程语言

在使用 nohup 运行程序时,通常会把输出重定向到日志文件(如 nohup.out 或自定义日志)。当日志出现异常时,可以按下面思路系统定位和排查。


一、确认日志来源和基本状态

1. 找到 nohup 启动的进程和日志

ps -ef | grep your_program

或

jobs -l

确认日志文件路径:

nohup python app.py > app.log 2>&1 &
  • app.log 是标准输出和错误输出
  • 若未指定,默认是 nohup.out

2. 查看日志是否还在增长

ls -l app.log
tail -f app.log
  • 无新内容 → 可能程序已退出或阻塞
  • 日志暴涨 → 可能死循环或异常频繁打印

二、常见日志异常及定位方法

1. 日志突然停止(无输出)

可能原因:

  • 程序崩溃
  • 死锁 / 阻塞(网络、数据库)
  • 输出被缓冲未刷新

排查:

ps -p <pid>
  • 进程不在 → 查看退出原因
  • 进程在但不输出 → 检查是否 flush 或缓冲问题(Python 加 -u)
nohup python -u app.py > app.log 2>&1 &

2. 日志中出现异常堆栈

直接搜索关键字:

grep -n -i "error\|exception\|traceback" app.log

常见情况:

  • OutOfMemory → 内存问题
  • Connection refused → 依赖服务不可用
  • Permission denied → 权限问题

3. 日志内容混乱或重复

可能原因:

  • 多个进程写同一日志
  • 未使用日志轮转

检查:

ls -l app.log*

解决:

  • 使用 logging 模块
  • 配合 logrotate

4. 日志文件过大

du -h app.log

建议:

  • 限制日志大小
  • 使用 >> + logrotate
  • 避免 print 大量调试信息

三、高级定位手段

1. 查看进程系统调用(卡死时)

strace -p <pid>

可看到是否卡在:

  • read()
  • futex()(锁)
  • connect()

2. 查看资源占用

top -p <pid>

或

cat /proc/<pid>/status

3. 程序已退出但无日志

检查:

  • dmesg | grep <pid>(OOM)
  • exit code
echo $?

四、推荐的 nohup 日志规范

nohup python -u app.py >> app.log 2>&1 &

或使用 setsid:

setsid python -u app.py >> app.log 2>&1 < /dev/null &

如果你能贴出:

  • 日志片段
  • 启动命令
  • 程序语言

我可以帮你更精确定位问题。

0 踩