gpt4 book ai didi

java - Linux 服务中未获取环境变量

转载 作者:太空宇宙 更新时间:2023-11-04 12:34:04 24 4
gpt4 key购买 nike

我正在创建一个 Linux (AWS Linux) 启动服务来运行/etc/init.d 中的一个 Jar 文件。它基本上是一个使用 Spring boot 的 maven 项目。我最初通过运行 sudo -E ./mvnw clean package 生成 Jar 文件,然后启动一个将 Jar 文件永远作为服务运行的服务。此 Jar 文件将作为守护程序服务运行。但是,没有从服务中选择任何环境变量,而且我实际上为这些变量获取了空值。我在 ~/.profile 中设置环境变量,然后运行 ​​source ~/.profile。如果我直接在项目路径中运行 Java -jar osuserver.jar,我可以看到所有环境变量都被选中,但是如果我运行与服务相同的方式,则它无法拾取环境变量。

顺序:我首先在 ~/.profile 中设置环境变量 --> 运行 source ~/.profile --> 我通过运行 maven package - sudo -E ./mvnw clean package 创建 Jar 文件--> 稍后我将启动服务(sudo service Osuserver start)。

我什至尝试启动 Sudo -E service osuserver 但它没有帮助,我仍然得到环境变量的空值。

这是我保存在 init.d 中的 OSU 启动脚本的语法

#!/bin/sh
# chkconfig: 35 99 10
SERVICE_NAME=osuserver
PATH_TO_JAR=/home/ec2-user/osuserver/target/osu-server-0.1.0.jar
PID_PATH_NAME=/tmp/osuserver-pid
case $1 in
start)

echo "Starting $SERVICE_NAME ..."
if [ ! -f $PID_PATH_NAME ]; then
nohup java -jar $PATH_TO_JAR /tmp 2>> /dev/null >> /dev/null &
echo $! > $PID_PATH_NAME
echo "$SERVICE_NAME started ..."
touch /var/lock/subsys/osuserver
else
echo "$SERVICE_NAME is already running ..."
touch /var/lock/subsys/osuserver
fi
;;
stop)

if [ -f $PID_PATH_NAME ]; then
PID=$(cat $PID_PATH_NAME);
echo "$SERVICE_NAME stoping ..."
kill $PID;
echo "$SERVICE_NAME stopped ..."
rm $PID_PATH_NAME
rm -f /var/lock/subsys/osuserver
else
echo "$SERVICE_NAME is not running ..."
rm -f /var/lock/subsys/osuserver
fi
;;
restart)
if [ -f $PID_PATH_NAME ]; then
PID=$(cat $PID_PATH_NAME);
echo "$SERVICE_NAME stopping ...";
kill $PID;
echo "$SERVICE_NAME stopped ...";
rm $PID_PATH_NAME
echo "$SERVICE_NAME starting ..."
nohup java -jar $PATH_TO_JAR /tmp 2>> /dev/null >> /dev/null &
echo $! > $PID_PATH_NAME
echo "$SERVICE_NAME started ..."
else
echo "$SERVICE_NAME is not running ..."
fi
;;
esac

所以基本上应用程序与服务一起正常运行,但唯一的问题是获取环境变量。所以我需要直接从服务设置环境变量吗?我不确定哪里出错了。

---->>>>>>编辑我的帖子<<<<<<<<---

我写了一个脚本,它将在/etc/profile.d 下创建 osuscript.sh,它具有所有环境变量的导出,但仍然面临同样的问题。但是,如果我直接在项目路径中运行 Java -jar osuserver.jar

最佳答案

/etc/init.d 下的守护进程脚本主要以 root 用户身份运行,其中一些可以在系统启动时自动启动。守护进程是单例的,即一个守护进程脚本控制一个守护进程服务(启动/停止/状态/重启)。

~/.profile 中的环境是个人配置,不是系统。您应该将环境放在 /etc 文件夹下,并将 source 命令添加到守护程序脚本以读取环境。

关于java - Linux 服务中未获取环境变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42499166/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com