在 CentOS 中,nohup 本身不能配置日志格式或滚动策略,它只是把进程的标准输出/错误重定向到文件。要实现“日志配置”,通常要把 nohup + 输出重定向 + 日志轮转(logrotate) 一起用。下面按常见需求说明。
nohup java -jar app.jar &
nohup.out⚠️ 问题:nohup.out 会无限增长,没有轮转
nohup java -jar app.jar > app.log 2>&1 &
含义:
> app.log:stdout 写到 app.log2>&1:stderr 也写进去&:后台运行✅ 这是最常用做法
nohup java -jar app.jar > /dev/null 2>&1 &
nohup java -jar app.jar > app_$(date +%Y%m%d).log 2>&1 &
⚠️ 只在启动时生成一次文件名,不会自动按天切割
logrotate(生产推荐)vim /etc/logrotate.d/app
示例配置:
/opt/app/app.log {
daily
rotate 7
missingok
notifempty
compress
copytruncate
dateext
}
| 参数 | 说明 |
|---|---|
| daily | 每天轮转 |
| rotate 7 | 保留 7 份 |
| compress | 压缩旧日志 |
| copytruncate | 不重启进程截断日志 |
| dateext | 加日期后缀 |
logrotate -vf /etc/logrotate.d/app
✅ 这是最标准、最安全的方式
如果你的程序是:
✅ 不要用 nohup 输出当业务日志
<file>logs/app.log</file>
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<fileNamePattern>logs/app.%d{yyyy-MM-dd}.log</fileNamePattern>
<maxHistory>7</maxHistory>
</rollingPolicy>
nohup 只负责:
nohup java -jar app.jar > /dev/null 2>&1 &
vim /etc/systemd/system/app.service
[Unit]
Description=app
After=network.target
[Service]
ExecStart=/usr/bin/java -jar /opt/app/app.jar
Restart=always
StandardOutput=append:/var/log/app/app.log
StandardError=append:/var/log/app/app.log
[Install]
WantedBy=multi-user.target
systemctl daemon-reload
systemctl start app
systemctl enable app
✅ 日志可控、可重启、可管理
cat /dev/null > nohup.out
加上:
export PYTHONUNBUFFERED=1 # Python
或 Java:
-Dspring.output.ansi.enabled=never
| 场景 | 推荐方案 |
|---|---|
| 简单脚本 | nohup + 重定向 |
| 长期运行 | nohup + logrotate |
| 生产服务 | systemd + 程序日志 |
| Java 应用 | logback + logrotate |
如果你愿意,可以告诉我:
我可以给你一份可直接用的完整配置。