在 CentOS 上用 nohup 启动程序时,日志通常是这样产生的:
nohup java -jar app.jar > app.log 2>&1 &
下面从实用角度讲几种日志备份/管理方案,从简单到规范。
手动或定时备份:
cp app.log /backup/app_$(date +%F).log
配合 crontab:
0 2 * * * cp /path/app.log /backup/app_$(date +%F).log
⚠️ 缺点:日志会一直变大,不清理
CentOS 自带 logrotate,最推荐
/opt/app/app.log)新建配置:
vi /etc/logrotate.d/app
内容:
/opt/app/app.log {
daily
rotate 7
missingok
notifempty
copytruncate
compress
}
参数说明:
daily:每天切割rotate 7:保留 7 份copytruncate:不中断 nohup 进程compress:压缩旧日志测试:
logrotate -d /etc/logrotate.d/app # 模拟
logrotate -f /etc/logrotate.d/app # 强制执行
✅ 这是最标准做法
如果你能改启动脚本:
nohup java -jar app.jar > app_$(date +%F).log 2>&1 &
每天重启一次(crontab):
0 0 * * * pkill -f app.jar; nohup java -jar /opt/app.jar > /opt/app_$(date +%F).log 2>&1 &
适合短任务 / 批处理
不要用 nohup,改用 systemd:
vi /etc/systemd/system/app.service
[Unit]
Description=App
[Service]
ExecStart=/usr/bin/java -jar /opt/app.jar
StandardOutput=append:/var/log/app/app.log
StandardError=append:/var/log/app/app.log
Restart=always
[Install]
WantedBy=multi-user.target
然后:
systemctl start app
日志交给 logrotate 或 journalctl
❌ 直接 rm app.log(进程还在写,会丢日志)
❌ 手动 > app.log(可能清空正在写的文件)
| 场景 | 建议 |
|---|---|
| 个人测试 | nohup + 定期 cp |
| 生产服务 | nohup + logrotate |
| 新项目 | systemd |
| 批处理 | 日期日志 |
如果你愿意,可以告诉我:
我可以给你直接可用的配置。