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

正确配置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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.23 10:05:28