如何在AWS EC2运行Java Jar 解决日志轮转与PM2异常重启问题
AWS EC2 运行Java Jar文件可行方案
方案1:nohup 配合系统原生logrotate实现无停机日志轮转
该方案无需额外安装第三方进程管理工具,完全满足150MB自动轮转、轮转全程不停止应用的要求。
- 启动应用时统一重定向标准输出、错误输出到固定日志路径:
mkdir -p /var/log/myapp nohup java -jar myfilename.jar > /var/log/myapp/output.log 2>&1 &
- 配置logrotate轮转规则,在
/etc/logrotate.d/目录下新建名为myapp的配置文件:
/var/log/myapp/output.log { size 150M rotate 10 copytruncate compress delaycompress missingok notifempty dateext }
配置参数说明:
size 150M:单日志文件达到150MB时自动触发轮转copytruncate:核心配置,轮转时先将当前日志内容拷贝至备份文件,再清空原日志文件,整个过程不需要重启Java进程,无服务中断rotate 10:最多保留10份历史轮转日志,可根据磁盘容量自行调整compress:历史日志自动gzip压缩,节省存储空间
配置完成后无需手动重启服务,系统默认每日定时执行logrotate扫描规则,可执行logrotate -f /etc/logrotate.d/myapp手动触发测试,测试过程中应用不会停止。
方案2:修复PM2配置,解决非预期自动重启问题
之前PM2频繁自动重启的核心原因是配置中开启了watch文件监听,只要监听的Jar包出现访问时间变动、文件覆盖等操作,PM2就会自动重启进程。修正配置即可关闭非预期重启逻辑,同时支持按大小轮转日志。
- 替换原有process.json配置为以下内容:
{ "apps":[ { "name": "my-backend-api", "cwd":"/home/ubuntu/my-backend", "script":"/usr/bin/java", "args":[ "-jar", "/home/ubuntu/my-backend/target/my-api-0.0.1-SNAPSHOT.jar" ], "watch": false, "autorestart": false, "max_restarts": 0, "log_date_format":"YYYY-MM-DD HH:mm Z", "exec_interpreter":"", "exec_mode":"fork", "out_file": "/var/log/myapp/out.log", "error_file": "/var/log/myapp/err.log", "merge_logs": true } ] }
核心改动点:
- 将
watch字段从监听Jar路径改为false,彻底关闭文件变动触发的自动重启 - 新增
autorestart: false、max_restarts: 0配置,关闭进程异常退出后的自动拉起逻辑,完全避免非预期重启 - 补充固定日志路径配置,统一管理输出日志
- 配置PM2日志轮转,执行以下命令安装轮转模块并设置150MB阈值:
pm2 install pm2-logrotate pm2 set pm2-logrotate:max_size 150M pm2 set pm2-logrotate:retain 10 pm2 set pm2-logrotate:compress true
PM2日志轮转过程不会重启业务进程,满足不停止应用的要求。配置完成后执行pm2 start process.json启动即可。
内容的提问来源于stack exchange,提问作者Atique Ahmed
相关产品推荐
相关产品推荐

