nohup 本身不会自动切割日志,只会把输出追加到 nohup.out(或你重定向的文件)。要实现日志切割(rotate),常见做法有下面几种,按推荐程度排序。
logrotate(最推荐,生产环境标准)这是 最规范、最安全 的方式,适合长期运行的服务。
nohup.out假设你的日志路径是:
/home/app/nohup.out
sudo vim /etc/logrotate.d/myapp
内容示例:
/home/app/nohup.out {
daily # 每天切割
rotate 7 # 保留 7 份
missingok # 文件不存在也不报错
notifempty # 空文件不切割
compress # 压缩旧日志
copytruncate # 关键点:不重启进程
dateext # 日期后缀
dateformat -%Y%m%d
}
logrotate -d /etc/logrotate.d/myapp
✅ 优点
⚠️ 注意
copytruncate 可能导致极少量日志丢失(通常可接受)cronolog(适合实时按时间切割)适合你一开始就知道要按天/小时切日志。
yum install cronolog
# 或
apt install cronolog
nohup ./myapp | cronolog /home/app/logs/myapp-%Y%m%d.log &
✅ 优点
❌ 缺点
#!/bin/bash
LOG=/home/app/nohup.out
mv $LOG $LOG.$(date +%Y%m%d%H%M)
touch $LOG
crontab -e
0 3 * * * /home/app/rotate_log.sh
⚠️ 问题
touch 新文件nohup.out(最佳实践)不要直接依赖 nohup.out,而是主动重定向日志。
nohup ./myapp > logs/app.log 2>&1 &
然后:
logrotate 管理 logs/app.log| 场景 | 推荐方案 |
|---|---|
| 生产环境 | ✅ logrotate |
| 临时脚本 | nohup 重定向 |
| 实时按时间切 | cronolog |
| 长期服务 | 日志框架 + logrotate |
如果你愿意,可以告诉我:
我可以帮你直接写一份可用的 logrotate 配置。