You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

通过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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.21 00:46:09