Supervisor可实现Java应用崩溃自动拉起,核心是配置前台运行、设置autorestart=unexpected、startsecs=15、stopsignal=TERM,并通过reread/update/status校验状态。

Java 应用在 Linux 上长期运行时,常因内存溢出、依赖超时或未捕获异常而意外退出。Supervisor 能自动拉起崩溃进程,实现“崩溃自愈”,无需人工干预。关键在于配置要让 Java 进程以前台方式运行,并由 supervisord 直接 fork 管理——不能是后台 daemon。
安装与基础服务启动
大多数发行版推荐用系统包管理器安装,避免权限和路径问题:
- Ubuntu/Debian:
sudo apt update && sudo apt install supervisor -y - CentOS/RHEL:
sudo yum install epel-release -y && sudo yum install supervisor -y
安装后 supervisord 通常自动启用。确认服务状态:sudo systemctl status supervisor。若未运行,执行 sudo systemctl start supervisor 并设为开机自启:sudo systemctl enable supervisor。
为 Java 应用创建独立配置文件
不建议直接修改主配置文件。标准做法是在 /etc/supervisor/conf.d/ 下新建一个以 .conf 结尾的文件,例如 /etc/supervisor/conf.d/myapp.conf:
立即学习“Java免费学习笔记(深入)”;
[program:myapp] command=/usr/bin/java -jar /opt/myapp/app.jar --server.port=8080 directory=/opt/myapp user=deploy autostart=true autorestart=unexpected startsecs=15 startretries=3 stopsignal=TERM stopwaitsecs=10 redirect_stderr=true stdout_logfile=/var/log/myapp/out.log stderr_logfile=/var/log/myapp/err.log stdout_logfile_maxbytes=20MB stdout_logfile_backups=5 environment=JAVA_HOME="/usr/lib/jvm/java-11-openjdk",SPRING_PROFILES_ACTIVE="prod"
注意几个核心点:
-
command必须是前台启动命令:Spring Boot 默认就是前台运行,不要加&或nohup;若 Jar 启动后立即退出,检查是否缺少必要参数(如配置文件路径)或端口被占用 -
autorestart=unexpected表示只在非预期退出(如崩溃)时重启,正常 shutdown(返回码 0)不重启,更安全 -
startsecs=15指进程启动后稳定运行 15 秒才认定成功,避免刚启动就挂掉被误判为失败 -
stopsignal=TERM+stopwaitsecs=10给 Spring Boot 留出优雅关闭时间,确保事务和连接正确释放 -
user=deploy强烈建议指定非 root 用户,降低安全风险
加载配置并验证运行状态
配置保存后,需让 supervisord 重新读取:
-
sudo supervisorctl reread—— 扫描 conf.d 目录,识别新配置 -
sudo supervisorctl add myapp—— 将 myapp 加入监控(也可直接用update一步完成) -
sudo supervisorctl start myapp—— 启动应用 -
sudo supervisorctl status—— 查看状态,应显示RUNNING及 PID
如果状态是 STARTING 或 FATAL,立刻查日志:sudo tail -f /var/log/myapp/err.log。常见错误包括:Jar 文件路径错误、权限不足(user 对目录无读/执行权)、JVM 内存参数超出限制、端口已被占用。
日常运维与故障模拟验证
真正实现“崩溃自愈”,需要验证它是否按预期工作:
- 手动杀死进程:
sudo supervisorctl stop myapp→ 状态变STOPPED;再执行sudo kill -9 $(ps aux | grep app.jar | grep -v grep | awk '{print $2}'),观察几秒后是否自动恢复为RUNNING - 查看实时日志:
sudo supervisorctl tail -f myapp stdout或tail -f /var/log/myapp/out.log - 重启整个应用:
sudo supervisorctl restart myapp - 批量操作:
sudo supervisorctl restart all或stop group:*(若配置了分组)
补充提示:如需 Web 界面,可在主配置中启用 [inet_http_server] 段,设置 port 和账号密码,浏览器访问 http://服务器IP:8080 即可图形化操作。


















