温馨提示×

ubuntu nohup日志如何滚动

小樊
40
2026-10-27 07:02:20
栏目: 智能运维

在 Ubuntu 下,使用 nohup 运行程序时,通常会把输出重定向到日志文件,例如:

nohup your_command > app.log 2>&1 &

但 nohup 本身不具备日志滚动(rotate)功能,日志会一直增长。要实现日志滚动,常见有以下几种方式:


一、使用 logrotate(推荐,系统级方案)

logrotate 是 Ubuntu 自带的日志管理工具,适合长期运行的服务。

1. 创建 logrotate 配置

例如配置文件:/etc/logrotate.d/myapp

/var/log/myapp/app.log {
    daily
    rotate 7
    compress
    missingok
    notifempty
    copytruncate
}

2. 关键参数说明

  • copytruncate:复制日志后清空原文件(适合 nohup 不重启进程的场景)
  • daily / weekly:滚动周期
  • rotate 7:保留 7 个历史日志
  • compress:压缩旧日志

3. 测试配置

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 规范。


四、使用支持日志滚动的进程管理器(推荐长期方案)

1. systemd(最推荐)

写成 service:

[Service]
ExecStart=/path/your_command
StandardOutput=append:/var/log/myapp/app.log
StandardError=append:/var/log/myapp/app.log

配合 logrotate 使用。

2. 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

如果你愿意,可以告诉我:

  • 是 Web 服务 / 脚本 / Python / Java?
  • 日志大概多大?

我可以帮你写一份可直接用的配置。

0 踩