Linux 服务中未获取环境变量
Environmental variables not being picked up in Linux service
我正在为 运行 /etc/init.d 中的 Jar 文件创建 Linux (AWS Linux) 启动服务。它基本上是一个使用 Spring 启动的 Maven 项目。我最初通过 运行ning sudo -E ./mvnw clean package 生成 Jar 文件,然后启动一个服务,该服务 运行 Jar 文件永远作为服务。此 Jar 文件将 运行ning 作为守护程序服务。但是,none 的环境变量是从服务中选取的,而我实际上为这些变量获取了 null。我在 ~/.profile 中设置我的环境变量,后来我 运行 source ~/.profile。如果我 运行 Java -jar osuserver.jar 直接在项目路径中,我可以看到所有环境变量都被选中但是如果我 运行 与服务相同,则不是能够拾取环境变量。
序列:我首先在 ~/.profile 中设置环境变量 --> 运行 source ~/.profile --> 我通过 运行ning maven package - sudo - 创建 Jar 文件E ./mvnw clean package--> 稍后我会启动服务(sudo service Osuserver start)。
我什至尝试启动 Sudo -E 服务 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 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
所以基本上应用程序 运行 与服务正确连接,但唯一的问题是获取环境 variables.So 我需要直接从服务设置环境变量吗?我不确定我哪里出错了。
---->>>>>>编辑我的 Post<<<<<<<<---
我写了一个脚本,它将在 /etc/profile.d 下创建 osuscript.sh,它具有所有环境变量的导出,但仍然面临同样的问题。但是,如果我 运行 Java -jar osuserver.jar 直接在项目路径
中,同样有效
/etc/init.d
下的守护进程脚本主要以 root 用户身份运行,其中一些可以在系统启动时自动启动。守护进程是单例的,意味着一个守护进程脚本控制一个守护进程服务(start/stop/status/restart)。
~/.profile
中的环境是个人配置,不是系统。您应该将环境放在 /etc
文件夹下,并将 source
命令添加到守护程序脚本以读取环境。
我正在为 运行 /etc/init.d 中的 Jar 文件创建 Linux (AWS Linux) 启动服务。它基本上是一个使用 Spring 启动的 Maven 项目。我最初通过 运行ning sudo -E ./mvnw clean package 生成 Jar 文件,然后启动一个服务,该服务 运行 Jar 文件永远作为服务。此 Jar 文件将 运行ning 作为守护程序服务。但是,none 的环境变量是从服务中选取的,而我实际上为这些变量获取了 null。我在 ~/.profile 中设置我的环境变量,后来我 运行 source ~/.profile。如果我 运行 Java -jar osuserver.jar 直接在项目路径中,我可以看到所有环境变量都被选中但是如果我 运行 与服务相同,则不是能够拾取环境变量。
序列:我首先在 ~/.profile 中设置环境变量 --> 运行 source ~/.profile --> 我通过 运行ning maven package - sudo - 创建 Jar 文件E ./mvnw clean package--> 稍后我会启动服务(sudo service Osuserver start)。
我什至尝试启动 Sudo -E 服务 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 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
所以基本上应用程序 运行 与服务正确连接,但唯一的问题是获取环境 variables.So 我需要直接从服务设置环境变量吗?我不确定我哪里出错了。
---->>>>>>编辑我的 Post<<<<<<<<---
我写了一个脚本,它将在 /etc/profile.d 下创建 osuscript.sh,它具有所有环境变量的导出,但仍然面临同样的问题。但是,如果我 运行 Java -jar osuserver.jar 直接在项目路径
中,同样有效/etc/init.d
下的守护进程脚本主要以 root 用户身份运行,其中一些可以在系统启动时自动启动。守护进程是单例的,意味着一个守护进程脚本控制一个守护进程服务(start/stop/status/restart)。
~/.profile
中的环境是个人配置,不是系统。您应该将环境放在 /etc
文件夹下,并将 source
命令添加到守护程序脚本以读取环境。