温馨提示×

CentOS nohup日志为何停止写入

小樊
39
2026-08-30 13:51:12
栏目: 智能运维

nohup 日志突然停止写入,通常不是 nohup 本身的问题,而是程序输出、缓冲、重定向或系统资源的问题。下面按最常见 → 较少见的顺序给你排查思路(适用于 CentOS 6/7/8)。


一、最常见原因:stdout/stderr 被缓冲,看起来像“停止写入”

现象

  • 程序仍在运行
  • nohup.out 不再增长
  • 但程序其实还在跑

原因

很多程序(尤其是 Python、Java、C++)行缓冲 / 全缓冲,不是实时刷盘。

排查方法

# 查看进程是否还在
ps -ef | grep your_program

# 查看文件是否还在被写入(实时)
tail -f nohup.out

解决方案

✅ 强制刷新缓冲

  • Python
python -u your_script.py

sys.stdout.flush()
  • Java
java -Djansi.force=true ...
  • C / C++
setvbuf(stdout, NULL, _IONBF, 0);

二、nohup.out 被覆盖 / 删除 / 重定向失效

常见错误用法

nohup python app.py > nohup.out &

后来手动:

rm nohup.out

> nohup.out

后果

  • 文件 inode 变了
  • 程序仍写入旧文件句柄
  • 磁盘上看不到新内容

验证

ls -i nohup.out
lsof -p <PID> | grep nohup

正确做法 ✅

>> nohup.out 2>&1

nohup your_cmd >> app.log 2>&1 &

三、磁盘满了(非常常见)

检查

df -h

特征

  • nohup.out 不再增长
  • 程序不报错但卡住
  • write() 系统调用阻塞

解决

du -sh *

清理日志或扩容。


四、程序 crash / 死锁 / 被 kill

检查进程

ps -ef | grep your_program

查看 nohup.out 后几行

tail -n 50 nohup.out

查看系统 kill 记录

dmesg | tail
journalctl -xe

常见原因:

  • OOM Killer
  • 死循环
  • 线程死锁

五、nohup 被误用,实际并没接管输出

错误示例

nohup ./app &

app 内部:

  • 自己关闭 stdout
  • 重定向到 /dev/null
  • daemonize 后重新打开 FD

验证

lsof -p <PID> | grep log

六、CentOS 7/8 systemd 环境影响(少见)

如果你在:

  • cron
  • systemd service
  • ssh 断开后

有可能 stdout 被 systemd 接管。

建议

不要依赖 nohup.out,而是明确日志文件:

nohup ./app >> /var/log/app.log 2>&1 &

七、推荐的最佳实践 ✅(避免再踩坑)

✅ 正确姿势

nohup ./app >> app.log 2>&1 &

✅ 更稳定方案

  • screen / tmux
  • systemd service
  • 日志框架(logback / log4j / logging)

八、快速自检清单(照着做)

ps -ef | grep app
df -h
lsof -p <PID> | grep log
tail -f app.log

如果你愿意,可以把下面信息发我,我可以直接帮你定位原因

  1. 程序语言(Python / Java / C++)
  2. 启动命令
  3. nohup.out 最后几行
  4. CentOS 版本

我可以一步一步帮你查。

0