2017-02-28 43 views
0

我正在创建Linux(AWS Linux)启动服务以在/etc/init.d中运行Jar文件。这基本上是一个使用Spring引导的maven项目。我最初通过运行sudo -E ./mvnw clean包生成Jar文件,然后启动一个永久运行Jar文件的服务作为服务。该Jar文件将作为守护程序服务运行。然而,没有任何环境变量正在从服务中挑选出来,而我实际上对于这些变量而言是空的。我在〜/ .profile中设置我的环境变量,然后运行source〜/ .profile。如果我直接在项目路径中运行Java -jar osuserver.jar,则可以看到所有环境变量被选中,但如果我运行与服务相同的操作,则无法获取环境变量。我首先在〜/ .profile中设置环境变量 - >运行source〜/ .profile - >我通过运行maven包创建Jar文件 - sudo -E ./mvnw clean package - > later我将开始服务(sudo服务Osuserver启动)。在Linux服务中未采集环境变量

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

这里是我的OSU启动脚本中,我在init.d下现在的储蓄语法

#!/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,则工作正常。

+0

由init.d启动的脚本不会作为交互式shell执行,因此它们不会生成配置文件。 –

+0

我正在手动采集配置文件,但守护程序服务未选择它。 –

回答

0

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

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

+0

那么应该直接在/ etc下面指定文件名?我甚至尝试在/etc/profile.d下放置scripts.sh(包含环境变量的导出),但它没有帮助。即使它工作正常,如果我直接在项目路径 –

+0

中运行Java -jar osuserver.jar谢谢我现在正在获取环境变量。我从守护进程脚本中找到它。我在下面添加了一行,它将编写我编写的用于在守护进程脚本中导出Env变量的脚本source /home/ec2-user/osuserver/scripts/osuscript.sh –