nohup 本身不具备日志轮转(log rotation)功能,它只是把程序输出重定向到文件(通常是 nohup.out)。要实现 nohup 日志的轮转,需要借助外部机制。下面是常见做法,从简单到专业。
logrotate(推荐)nohup 程序持续写日志文件logrotate 定期重命名/压缩旧日志假设日志文件是:
/opt/app/nohup.out
创建 logrotate 配置:
sudo vim /etc/logrotate.d/myapp
内容:
/opt/app/nohup.out {
daily
rotate 7
compress
missingok
notifempty
copytruncate
}
copytruncate:不重启程序,先复制日志再清空原文件(适合 nohup)daily / rotate 7:每天轮转,保留 7 份compress:压缩旧日志logrotate -d /etc/logrotate.d/myapp # 模拟
logrotate -f /etc/logrotate.d/myapp # 强制执行
✅ 这是生产环境最推荐方式
如果你能控制程序:
这样 不需要 nohup.out 轮转,例如:
nohup python app.py > /dev/null 2>&1 &
日志由程序自己管理。
0 0 * * * mv /opt/app/nohup.out /opt/app/nohup.$(date +%F).log
⚠ 问题:
nohup your_app >> /var/log/myapp/app.log 2>&1 &
再配合 logrotate
如果是服务器程序,不要用 nohup,用 systemd:
[Service]
StandardOutput=append:/var/log/myapp/app.log
systemd 自动管理日志。
| 场景 | 推荐方案 |
|---|---|
| 临时脚本 | nohup + logrotate(copytruncate) |
| 长期服务 | systemd |
| 可控程序 | 程序内日志轮转 |
| 简单需求 | cron + mv(不推荐) |
如果你愿意,可以告诉我:
我可以给你定制一套日志轮转方案。