在 Linux 下使用 nohup 启动程序时,通常会把输出重定向到日志文件,比如:
nohup your_command > app.log 2>&1 &
下面介绍几种常见、实用的 nohup 日志备份方式。
cp app.log app.log.bak
或带时间戳:
cp app.log app.log.$(date +%Y%m%d_%H%M%S)
⚠️ 注意:这种方式只是复制,原日志仍在增长。
which logrotate
sudo vim /etc/logrotate.d/app
示例:
/opt/app/app.log {
daily
rotate 7
missingok
notifempty
copytruncate
compress
}
说明:
copytruncate:不重启进程就截断日志(非常适合 nohup)daily:每天轮转rotate 7:保留 7 份compress:压缩旧日志sudo logrotate -f /etc/logrotate.d/app
✅ 这是生产环境最推荐方案
vim backup_log.sh
#!/bin/bash
LOG=/opt/app/app.log
BAK=/opt/backup/app.log.$(date +%Y%m%d)
cp $LOG $BAK
> $LOG
⚠️
> $LOG会清空日志,nohup 进程仍可继续写
chmod +x backup_log.sh
crontab -e
0 2 * * * /opt/backup_log.sh
logrotate + copytruncate 的原理(重要)nohup 进程 → 文件描述符 → app.log
logrotate copytruncate:
1. 复制 app.log → app.log.1
2. 清空 app.log
3. 进程继续写 app.log
✅ 不需要 kill / 重启进程
❌ 直接 mv app.log app.log.bak
❌ 删除 app.log
✅ 正确方式:copytruncate 或 > log
| 场景 | 推荐方式 |
|---|---|
| 开发测试 | 手动 cp |
| 生产环境 | logrotate |
| 不想装工具 | crontab + 脚本 |
如果你愿意,可以告诉我:
我可以帮你写一套完整配置。