在 Ubuntu 下,使用 nohup 运行程序时,通常会把输出重定向到日志文件,例如:
nohup your_command > app.log 2>&1 &
但 nohup 本身不具备日志滚动(rotate)功能,日志会一直增长。要实现日志滚动,常见有以下几种方式:
logrotate(推荐,系统级方案)logrotate 是 Ubuntu 自带的日志管理工具,适合长期运行的服务。
例如配置文件:/etc/logrotate.d/myapp
/var/log/myapp/app.log {
daily
rotate 7
compress
missingok
notifempty
copytruncate
}
copytruncate:复制日志后清空原文件(适合 nohup 不重启进程的场景)daily / weekly:滚动周期rotate 7:保留 7 个历史日志compress:压缩旧日志logrotate -d /etc/logrotate.d/myapp # 调试
logrotate -f /etc/logrotate.d/myapp # 强制执行
split 切割日志(简单但不自动)如果你只是临时使用:
nohup your_command | split -b 10m - app.log.
会生成:
app.log.aa
app.log.ab
缺点:不会自动管理旧文件。
cron + cp / truncate(手工方案)# crontab -e
0 0 * * * cp /path/app.log /path/app.log.$(date +\%F) && > /path/app.log
适合简单脚本,但不如 logrotate 规范。
systemd(最推荐)写成 service:
[Service]
ExecStart=/path/your_command
StandardOutput=append:/var/log/myapp/app.log
StandardError=append:/var/log/myapp/app.log
配合 logrotate 使用。
supervisor自带日志滚动配置:
[program:myapp]
command=/path/your_command
stdout_logfile=/var/log/myapp/app.log
stdout_logfile_maxbytes=10MB
stdout_logfile_backups=7
| 场景 | 推荐方式 |
|---|---|
| 简单 nohup | logrotate + copytruncate |
| 长期服务 | systemd / supervisor |
| 临时任务 | split |
如果你愿意,可以告诉我:
我可以帮你写一份可直接用的配置。