温馨提示×

centos nohup日志为何中断

小樊
42
2026-09-06 08:07:44
栏目: 智能运维

在 CentOS 上使用 nohup 运行程序时,日志突然中断(不再增长)是很常见的问题,通常不是 nohup 本身坏了,而是下面这些原因导致的。我按最常见 → 较少见给你梳理。


一、最常见原因

1️⃣ 程序被系统杀掉了(OOM / 退出)

nohup 只能保证你退出终端不中断程序,但不能保证程序不被杀。

常见情况:

  • 内存占用过高 → 被 OOM Killer 杀掉
  • 程序自己崩溃 / 抛异常退出
  • 程序运行完自然结束

✅ 排查方法:

dmesg | grep -i kill

grep -i oom /var/log/messages

✅ 确认进程是否还在:

ps -ef | grep 你的程序

2️⃣ 日志被重定向到 buffer,未刷新

很多程序(尤其 Java / Python)日志有缓存,不会立刻写文件。

症状:

  • 日志停在某一个时间点
  • 进程还在
  • nohup.out 不增长

✅ 解决方法:

  • Java:加 -DLog4j2.asyncQueueFullPolicy=Discard
  • Python:
    print(..., flush=True)
    
  • 或运行时加:
    python -u xxx.py
    

3️⃣ 你以为的日志不是这个文件

你可能看到的是:

nohup command > out.log 2>&1 &

但程序内部又写了别的日志路径。

✅ 检查:

lsof -p PID | grep log

4️⃣ 日志写满 / 磁盘满了

CentOS 上磁盘满了,nohup.out 会直接停止增长。

✅ 检查:

df -h

二、nohup 使用方式问题

5️⃣ 错误使用 nohup(后台没真正挂起)

❌ 错误:

nohup python app.py

然后直接关终端

✅ 正确:

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

6️⃣ 标准输出被关闭

如果程序里调用了:

close(1);

或重定向到 /dev/null,日志当然没内容。


三、系统层原因(较少见)

7️⃣ systemd / 会话被回收(非 login shell)

如果你是在:

  • crontab
  • Jenkins
  • 某些 SSH 会话

启动的进程,可能会被 session 回收。

✅ 更稳妥方案(推荐):

setsid nohup command > log 2>&1 &

8️⃣ nohup.out 被 truncate

有人执行了:

> nohup.out

或 logrotate 配置不当。


四、推荐你这样做(最佳实践)

稳定写法

setsid nohup your_command > run.log 2>&1 &

长期运行推荐

# 用 systemd(最稳)
vim /etc/systemd/system/your.service

五、你可以直接告诉我

如果你愿意,可以把下面信息发我,我能精准判断:

  1. 启动命令
  2. 程序语言(Java / Python / C / Shell)
  3. 日志停之前最后几行
  4. ps 是否还能看到进程

我可以直接告诉你是哪一条原因

0