在Linux服务中没有获取环境变量

时间:2017-02-28 02:35:49

标签: java linux maven daemon

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

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

我甚至试过给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 $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,则同样有效

1 个答案:

答案 0 :(得分:0)

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

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