温馨提示×

centos nohup日志为何写满

小樊
36
2026-09-12 02:27:17
栏目: 智能运维

在 CentOS(以及大多数 Linux)上,nohup 命令默认会把标准输出(stdout)和标准错误(stderr)重定向到当前目录下的 nohup.out 文件。如果程序持续不断地输出日志,或者输出量非常大,nohup.out 就会很快被“写满”(其实是不断增大,直到占满磁盘)。

下面从原因解决办法两方面说明。


一、为什么 nohup 日志会写满

1. 默认行为导致日志无限增长

nohup your_command &

等价于:

nohup your_command > nohup.out 2>&1 &

只要程序:

  • 不停打印日志
  • 不轮转日志
  • 不清理 nohup.out

文件就会一直变大。


2. 程序本身日志量大

常见情况:

  • Java / Python / Node 服务
  • 定时任务
  • 调试级别的日志(DEBUG)

尤其生产环境如果开了 DEBUG,很容易写满磁盘。


3. 没有日志切割(log rotate)

nohup.out 不会自动切割,不像 rsysloglogrotate 管理日志。


4. 磁盘空间被占满的表现

nohup.out 写满磁盘后:

  • 服务报错:No space left on device
  • 系统变慢
  • 其他程序无法写入日志

二、如何解决 / 避免 nohup 写满

✅ 方法 1:重定向到指定日志文件并控制

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

然后配合 logrotate


✅ 方法 2:不输出日志(不推荐但可用)

nohup your_command > /dev/null 2>&1 &

适合:

  • 后台守护进程
  • 日志已在程序内部处理

✅ 方法 3:使用日志切割(推荐)

示例 logrotate 配置:

/var/log/app.log {
    daily
    rotate 7
    compress
    missingok
    notifempty
    copytruncate
}

copytruncate 对 nohup 程序很关键,避免进程还持有旧文件句柄。


✅ 方法 4:用 systemd(最佳实践)

如果是服务,强烈建议:

[Service]
ExecStart=/path/to/your_command
StandardOutput=syslog
StandardError=syslog

journald 统一管理日志。


✅ 方法 5:手动清理(临时)

# 清空而不删除
: > nohup.out

⚠️ 不要直接 rm nohup.out,否则进程还在写,但文件已消失(磁盘不释放)。


三、排查当前是谁写满的

du -sh /path/* | sort -h
lsof | grep deleted
df -h

总结一句话

nohup 日志写满,是因为默认把所有输出写进 nohup.out,且没有日志切割机制。

如果你愿意,可以告诉我:

  • 你跑的是什么程序
  • CentOS 版本
  • 是否生产环境

我可以给你一套最适合你场景的 nohup / 日志方案

0