【发布时间】:2017-02-28 02:35:48
【问题描述】:
我正在创建一个 Linux (AWS Linux) 启动服务来运行 /etc/init.d 中的 Jar 文件。它基本上是一个使用 Spring Boot 的 Maven 项目。我最初通过运行 sudo -E ./mvnw clean package 生成 Jar 文件,然后启动一个服务,该服务将 Jar 文件作为服务永久运行。此 Jar 文件将作为守护程序服务运行。但是,没有从服务中选择任何环境变量,我实际上为这些变量获得了 null。我在 ~/.profile 中设置我的环境变量,然后我运行 source ~/.profile。如果我直接在项目路径中运行 Java -jar osuserver.jar,我可以看到所有被选择的环境变量,但如果我与服务运行相同,则无法选择环境变量。
顺序:我首先在~/.profile中设置环境变量-->运行源码~/.profile-->我通过运行maven package-sudo -E ./mvnw clean package-->创建Jar文件-->稍后我将启动服务(sudo service Osuserver start)。
我什至尝试给 Sudo -E service osuserver start 但它没有帮助,我仍然得到环境变量的空值。
这是我保存在 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,则同样有效
【问题讨论】:
-
由 init.d 启动的脚本不会作为交互式 shell 执行,因此它们不会获取配置文件。
-
我正在手动获取配置文件,但守护程序服务没有选择它。