温馨提示×

debian nohup日志怎么轮转

小樊
39
2026-10-25 03:08:26
栏目: 智能运维

在 Debian 上,nohup 本身不会做日志轮转,它只是把输出重定向到文件(默认 nohup.out)。日志轮转需要你额外处理。常见做法有下面几种:


一、使用 logrotate(推荐)

这是 Debian 官方最标准的方式。

1. 假设你用 nohup 这样启动

nohup /opt/app/run.sh >> /var/log/app/app.log 2>&1 &

2. 创建 logrotate 配置

sudo vim /etc/logrotate.d/app

示例配置:

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

关键点说明

  • copytruncate 非常重要
    • 不重启进程
    • 复制日志后清空原文件
    • 适合 nohup / 不能接收 HUP 信号的程序
  • 如果不支持 copytruncate,就需要程序支持 SIGUSR1 或重载日志

3. 手动测试

sudo logrotate -d /etc/logrotate.d/app   # 调试
sudo logrotate -f /etc/logrotate.d/app   # 强制执行

二、用 cron + 简单脚本(轻量方案)

如果你不想用 logrotate:

0 0 * * * mv /var/log/app/app.log /var/log/app/app.log.$(date +%F); kill -USR1 $(cat /var/run/app.pid)

⚠️ 注意:

  • nohup 程序必须支持信号重新打开日志
  • 否则要用 cp + > 方式清空

三、从根源解决:不用 nohup 写文件

更好的做法是用 systemd(Debian 10+ 默认):

[Service]
ExecStart=/opt/app/run.sh
StandardOutput=journal
StandardError=journal

然后:

journalctl -u app

systemd 自动轮转 journal,不需要你管日志文件。


四、常见坑提醒

❌ 直接 mv 日志文件
→ nohup 进程仍写旧 inode,磁盘不会释放

✅ 一定要:

  • copytruncate
  • 或程序支持重新打开日志

总结建议

场景 推荐方案
简单脚本 / 老程序 logrotate + copytruncate
可控程序 logrotate + USR1
新服务 systemd

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

  • Debian 版本
  • 启动命令
  • 是否是 Java / Python / Shell

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

0 踩