如何在AWS EC2实例上实现两个Java jar包开机自动启动?
问题根因
你当前遇到的问题核心是rc.local为串行执行逻辑,直接书写的java -jar命令默认是前台阻塞运行的,执行到第一条启动命令后会一直等待该进程退出,永远不会执行后续的第二条命令,因此第二个服务无法启动。
解决方案
方案1:快速修复rc.local配置
给两条启动命令追加后台运行标识&,同时补充绝对路径、日志重定向配置即可:
# 请替换为你自己的jar包实际路径和日志存储路径 java -jar /data/app/first-service.jar > /var/log/first-service.log 2>&1 & java -jar /data/app/second-service.jar > /var/log/second-service.log 2>&1 &
注意事项:
- 必须写jar包的绝对路径,rc.local执行时默认工作目录为根目录,相对路径会导致找不到jar包
- 执行前先确认
rc.local有可执行权限,没有的话执行sudo chmod +x /etc/rc.local开启
方案2(更推荐):使用systemd管理服务
rc.local是老旧的兼容启动机制,更建议用系统自带的systemd管理Spring Boot服务,支持开机自启、异常自动重启、统一日志管理等能力,配置步骤如下:
- 给第一个服务创建配置文件
/etc/systemd/system/first.service,内容示例:
[Unit] Description=First Spring Boot Microservice After=network.target [Service] # 替换为你EC2的实际运行用户,比如ec2-user、ubuntu User=ec2-user # 替换为jar包所在的目录绝对路径 WorkingDirectory=/data/app ExecStart=/usr/bin/java -jar first-service.jar # 异常退出自动重启 Restart=always RestartSec=5 [Install] WantedBy=multi-user.target
- 同理给第二个服务创建配置文件
/etc/systemd/system/second.service,修改对应描述和jar包名称即可 - 执行命令生效配置并开启自启:
# 重载systemd配置 sudo systemctl daemon-reload # 开启两个服务的开机自启 sudo systemctl enable first.service second.service # 立即启动两个服务 sudo systemctl start first.service second.service
后续排查日志可直接用journalctl -u first.service -f查看对应服务的实时运行日志。
内容的提问来源于stack exchange,提问作者elvis
相关产品推荐
相关产品推荐

