在 Debian 上,nohup 本身没有日志轮转功能,它只是把输出重定向到文件(默认 nohup.out)。日志轮转需要靠外部机制来做。
下面按“推荐程度”给你几种常用方案。
logrotate(系统级,标准做法)假设你这样启动程序:
nohup /opt/app/run.sh > /var/log/app/nohup.out 2>&1 &
创建 logrotate 配置:
sudo vim /etc/logrotate.d/app
内容:
/var/log/app/nohup.out {
daily
missingok
rotate 7
compress
delaycompress
copytruncate
notifempty
}
copytruncate ✅ 必须
daily / weekly:轮转周期rotate 7:保留 7 份compress:压缩旧日志sudo logrotate -f /etc/logrotate.d/app
nohup ./app > /var/log/app/app.log 2>&1 &
然后用上面的 logrotate 配置。
systemd(最优雅,推荐长期运行)如果你能改成 systemd 服务:
[Unit]
Description=My App
[Service]
ExecStart=/opt/app/run.sh
StandardOutput=append:/var/log/app/app.log
StandardError=append:/var/log/app/app.log
Restart=always
[Install]
WantedBy=multi-user.target
然后:
sudo systemctl enable app
sudo systemctl start app
logrotate 同样可用,且支持 postrotate 重载。
#!/bin/bash
mv nohup.out nohup.out.$(date +%F)
kill -USR1 $(pidof yourapp)
⚠️ 仅当程序支持信号重新打开日志时才可用
❌ nohup 默认不支持
| 方式 | 推荐度 | 说明 |
|---|---|---|
| logrotate + copytruncate | ⭐⭐⭐⭐⭐ | 最简单稳定 |
| systemd + logrotate | ⭐⭐⭐⭐⭐ | 长期运行最佳 |
| nohup.out 原生 | ⭐ | 不轮转,会爆盘 |
如果你愿意,可以告诉我:
我可以帮你写一份可直接用的 logrotate 配置。