在 Debian 上,nohup 本身不会做日志轮转,它只是把输出重定向到文件(默认 nohup.out)。日志轮转需要你额外处理。常见做法有下面几种:
这是 Debian 官方最标准的方式。
nohup /opt/app/run.sh >> /var/log/app/app.log 2>&1 &
sudo vim /etc/logrotate.d/app
示例配置:
/var/log/app/app.log {
daily
missingok
rotate 7
compress
delaycompress
notifempty
copytruncate
}
copytruncate 非常重要
copytruncate,就需要程序支持 SIGUSR1 或重载日志sudo logrotate -d /etc/logrotate.d/app # 调试
sudo logrotate -f /etc/logrotate.d/app # 强制执行
如果你不想用 logrotate:
0 0 * * * mv /var/log/app/app.log /var/log/app/app.log.$(date +%F); kill -USR1 $(cat /var/run/app.pid)
⚠️ 注意:
cp + > 方式清空更好的做法是用 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 |
如果你愿意,可以告诉我:
我可以帮你写一份可直接用的配置。