在 CentOS(以及大多数 Linux)上,nohup 命令默认会把标准输出(stdout)和标准错误(stderr)重定向到当前目录下的 nohup.out 文件。如果程序持续不断地输出日志,或者输出量非常大,nohup.out 就会很快被“写满”(其实是不断增大,直到占满磁盘)。
下面从原因和解决办法两方面说明。
nohup your_command &
等价于:
nohup your_command > nohup.out 2>&1 &
只要程序:
文件就会一直变大。
常见情况:
尤其生产环境如果开了 DEBUG,很容易写满磁盘。
nohup.out 不会自动切割,不像 rsyslog 或 logrotate 管理日志。
当 nohup.out 写满磁盘后:
nohup your_command > /var/log/app.log 2>&1 &
然后配合 logrotate。
nohup your_command > /dev/null 2>&1 &
适合:
示例 logrotate 配置:
/var/log/app.log {
daily
rotate 7
compress
missingok
notifempty
copytruncate
}
copytruncate对 nohup 程序很关键,避免进程还持有旧文件句柄。
如果是服务,强烈建议:
[Service]
ExecStart=/path/to/your_command
StandardOutput=syslog
StandardError=syslog
由 journald 统一管理日志。
# 清空而不删除
: > nohup.out
⚠️ 不要直接 rm nohup.out,否则进程还在写,但文件已消失(磁盘不释放)。
du -sh /path/* | sort -h
lsof | grep deleted
df -h
nohup 日志写满,是因为默认把所有输出写进 nohup.out,且没有日志切割机制。
如果你愿意,可以告诉我:
我可以给你一套最适合你场景的 nohup / 日志方案。