在 Linux 下使用 nohup 运行程序时,日志一般会重定向到 nohup.out 或某个日志文件,nohup 本身并不具备日志分割能力。要实现日志分割,常见方案如下:
logrotate(推荐)logrotate 是 Linux 自带的日志管理工具,适合长期运行的服务。
假设日志文件为 /home/user/app/logs/app.log
创建配置 /etc/logrotate.d/myapp:
/home/user/app/logs/app.log {
daily
rotate 7
compress
missingok
notifempty
copytruncate
}
要点说明:
copytruncate:关键,先复制日志再清空原文件,适合 nohup 进程不重启的场景daily / weekly:分割周期rotate 7:保留 7 份compress:压缩旧日志cron + split(简单但不够优雅)0 0 * * * mv app.log app.log.$(date +%F) && touch app.log
⚠️ 问题:
copytruncate 安全 multilog / svlogd(daemontools)适合运维级服务
rotatelogs(Apache 工具)nohup ./app | rotatelogs app.log.%Y%m%d 86400 &
如果可以不用 nohup,推荐:
[Service]
ExecStart=/path/to/app
StandardOutput=append:/var/log/app.log
配合 logrotate 使用。
| 场景 | 推荐方案 |
|---|---|
| 简单脚本 | nohup + logrotate |
| 长期服务 | systemd + logrotate |
| 不想改启动方式 | logrotate + copytruncate |
如果你愿意,可以告诉我:
我可以帮你写一份可直接用的配置。