正确配置Gradle应用作为systemd服务启动的方法
问题:Gradle应用通过systemd启动失败(退出码127)
我尝试用bash脚本让Gradle启动的应用以systemd服务自动运行,参考了NodeJS服务的配置方案。bash脚本在控制台能正常执行,但作为systemd服务启动时失败,systemctl status输出如下:
× rString-backend.service - rString backend Loaded: loaded (/etc/systemd/system/rString-backend.service; enabled; vendor preset: enabled) Active: failed (Result: exit-code) since Thu 2023-04-27 10:01:51 UTC; 10min ago Main PID: 650047 (code=exited, status=127) CPU: 3ms apr 27 10:01:51 rstring systemd[1]: rString-backend.service: Scheduled restart job, restart counter is at 5. apr 27 10:01:51 rstring systemd[1]: Stopped rString backend. apr 27 10:01:51 rstring systemd[1]: rString-backend.service: Start request repeated too quickly. apr 27 10:01:51 rstring systemd[1]: rString-backend.service: Failed with result 'exit-code'. apr 27 10:01:51 rstring systemd[1]: Failed to start rString backend.
我推测问题是服务找不到Gradle的执行路径,需要像NodeJS脚本那样配置环境变量,但没找到相关文档,求正确配置方法。
参考的NodeJS环境变量配置代码
export NVM_DIR="$HOME/.nvm" [ -s "$NVM_DIR/nvm.sh" ] && \. "$NVM_DIR/nvm.sh" [ -s "$NVM_DIR/bash_completion" ] && \. "$NVM_DIR/bash_completion"
我的bash脚本内容
#! /bin/bash source ${HOME}/.bashrc cd /home/valentin/Politehnika gradle bootrun
我的systemd服务文件内容
[Unit] Description=rString backend After=syslog.target network.target [Service] Type=simple Restart=always RestartSec=1 ExecStart=/home/valentin/Politehnika/script.sh User=root [Install] WantedBy=multi-user.target
解决方案
原因分析
退出码127表示命令未找到,确实是systemd环境下找不到gradle可执行文件的路径。systemd服务默认运行在极简环境,不会加载普通用户的shell配置(比如.bashrc),即使你在脚本里source ${HOME}/.bashrc,但因为是root用户执行,${HOME}指向/root,而你的Gradle可能是安装在valentin用户下的,所以根本加载不到正确的环境变量。
解决方法(任选其一)
方法1:直接使用Gradle的绝对路径
先找到Gradle的绝对路径:
which gradle
假设输出是/home/valentin/.gradle/wrapper/dists/gradle-xxx/bin/gradle或者/usr/local/bin/gradle,把脚本里的gradle bootrun改成绝对路径:
#! /bin/bash cd /home/valentin/Politehnika /home/valentin/.gradle/wrapper/dists/gradle-xxx/bin/gradle bootrun
方法2:在systemd服务文件中配置环境变量
在[Service]段添加Environment来指定PATH:
[Service] Type=simple Restart=always RestartSec=1 ExecStart=/home/valentin/Politehnika/script.sh User=root # 添加Gradle所在路径到PATH Environment="PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/home/valentin/.gradle/wrapper/dists/gradle-xxx/bin"
方法3:切换到valentin用户执行服务
既然脚本是在valentin用户下能正常运行,直接让systemd以valentin用户启动服务,而不是root:
修改systemd服务文件的User字段:
[Service] Type=simple Restart=always RestartSec=1 ExecStart=/home/valentin/Politehnika/script.sh User=valentin # 确保加载用户的环境变量 Environment="HOME=/home/valentin"
同时确保脚本有可执行权限:
chmod +x /home/valentin/Politehnika/script.sh
验证步骤
修改后重新加载systemd并重启服务:
systemctl daemon-reload systemctl restart rString-backend.service
查看状态确认是否正常:
systemctl status rString-backend.service
内容的提问来源于stack exchange,提问作者PluggaRose
相关产品推荐
相关产品推荐

