通过EC2 UserData使用systemd启动应用服务失败求助
问题:Amazon Linux 2 EC2实例通过UserData配置systemd启动Java应用失败
我在Amazon Linux 2系统的AWS EC2实例上,尝试通过UserData配置systemd将Java应用作为服务启动,但应用无法正常运行。
相关配置文件内容
1. systemd单元文件 appstart.service
[Unit] Description=Application start [Service] Type=simple User=ec2-user ExecStart=/usr/bin/bash /home/ec2-user/project/restartScript.sh SyslogIdentifier=App_start [Install] WantedBy=multi-user.target
2. 启动脚本 restartScript.sh
#!/bin/bash export SPRING_PROFILES_ACTIVE="tst,development" cd /home/ec2-user/project pkill java /usr/bin/java -jar /home/ec2-user/project/app.jar >>/home/ec2-user/project/web.log 2>>/home/ec2-user/project/web-error.log &
3. EC2 UserData脚本
#!/bin/bash mkdir /home/ec2-user/project cd /home/ec2-user/project sudo wget -P /home/ec2-user/project/ https://tst.s3.eu-west-1.amazonaws.com/app.jar chown -R ec2-user:ec2-user /home/ec2-user/project sudo wget -P /home/ec2-user/project/ https://tst.s3.eu-west-1.amazonaws.com/restartScript.sh sudo chmod 755 /home/ec2-user/project/restartScript.sh cd /etc/systemd/system/ sudo wget /etc/systemd/system/ https://tst.s3.eu-west-1.amazonaws.com/appstart.service sudo su systemctl daemon-reload systemctl enable appstart.service systemctl start appstart.service exit
服务状态输出
执行后查看服务状态:
$ systemctl status appstart.service ● appstart.service - Application start Loaded: loaded (/etc/systemd/system/appstart.service; enabled; vendor preset: disabled) Active: inactive (dead) since Thu 2022-08-25 13:35:52 UTC; 4min 19s ago Process: 7328 ExecStart=/usr/bin/bash /home/ec2-user/project/restartScript.sh (code=exited, status=0/SUCCESS) Main PID: 7328 (code=exited, status=0/SUCCESS) Aug 25 13:35:52 ip-x-x-x-x.tst.local systemd[1]: Started Application start.
再次执行systemctl start appstart.service也无变化,应用仍未运行。
原因分析及解决方法
1. systemd服务类型与脚本后台执行冲突
appstart.service设置了Type=simple,该类型要求ExecStart启动的进程是服务主进程,不能后台运行。但启动脚本里的Java命令加了&,让进程后台运行,导致脚本执行完成后立即退出,systemd判定服务结束,进入inactive (dead)状态。
解决方法:
- 去掉Java命令后的
&,让进程前台运行:/usr/bin/java -jar /home/ec2-user/project/app.jar >>/home/ec2-user/project/web.log 2>>/home/ec2-user/project/web-error.log - 或改为
Type=forking类型,并添加PIDFile配置让systemd跟踪主进程,适配后台启动场景。
2. UserData中wget命令格式错误
下载appstart.service时,命令格式有误:
sudo wget /etc/systemd/system/ https://tst.s3.eu-west-1.amazonaws.com/appstart.service
正确写法需用-P指定目标目录,或直接指定输出路径:
sudo wget -P /etc/systemd/system/ https://tst.s3.eu-west-1.amazonaws.com/appstart.service # 或 sudo wget https://tst.s3.eu-west-1.amazonaws.com/appstart.service -O /etc/systemd/system/appstart.service
该错误会导致单元文件未正确下载到指定目录,可能服务加载的是之前手动配置的文件。
3. UserData中切换用户的冗余操作
用sudo su切换root后执行systemd命令属于冗余操作,且可能导致环境变量异常,直接用sudo前缀执行即可:
sudo systemctl daemon-reload sudo systemctl enable appstart.service sudo systemctl start appstart.service
删除sudo su和exit语句,避免不必要的shell切换。
4. pkill java的范围风险
pkill java会杀掉实例上所有Java进程,若存在其他Java服务会被误杀,建议改为精准匹配:
pkill -f "/home/ec2-user/project/app.jar"
5. 日志排查建议
查看Java应用的日志文件/home/ec2-user/project/web.log和/home/ec2-user/project/web-error.log,确认启动时是否有依赖缺失、端口占用、配置错误等问题。
内容的提问来源于stack exchange,提问作者Alex
相关产品推荐
相关产品推荐

