2017-02-28 4 views
0

/etc/init.d에 Jar 파일을 실행하는 Linux (AWS Linux) 시작 서비스를 만들고 있습니다. 이것은 기본적으로 Spring 부트를 사용하는 maven 프로젝트입니다. 나는 처음에는 sudo -E ./mvnw clean 패키지를 실행하여 Jar 파일을 생성 한 다음 Jar 파일을 서비스로 영원히 실행하는 서비스를 시작한다. 이 Jar 파일은 데몬 서비스로 실행됩니다. 그러나 환경 변수 중 어느 것도 서비스에서 선택되지 않고 실제로 이러한 변수에 대해 null이 표시됩니다. ~/.profile에 환경 변수를 설정하고 나중에 ~/.profile을 실행합니다. 프로젝트 경로에서 Java -jar osuserver.jar을 직접 실행하면 모든 환경 변수가 선택되는 것을 볼 수 있지만 서비스와 동일하게 실행하면 픽업 환경 변수를 사용할 수 없습니다.Linux 서비스에서 환경 변수가 선택되지 않음

시퀀스 : ~/.profile -> run source ~/.profile -> 먼저 maven 패키지를 실행하여 Jar 파일을 생성합니다. - sudo -E ./mvnw 클린 패키지 -> 나중에 나는 서비스를 시작할 것이다 (sudo 서비스 Osuserver start).

나는 심지어 Sudo -E 서비스 osuserver 시작을 시도했지만 도움이되지 않았고 여전히 환경 변수에 null 값이 있습니다. 여기

그래서 기본적으로 응용 프로그램이 제대로 서비스하지만 유일한 문제로 실행

#!/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

가 데리러 함께 내가있는 init.d에 저장하고 내 OSU 시작 스크립트의 구문입니다 환경 변수. 환경 변수를 서비스에서 직접 설정해야합니까? 내가 어디로 잘못 가고 있는지 확실하지 않습니다. 내 게시물 < < < < < < < < 편집

---- >>>>>> ---

나는이 /etc/profile.d에서 osuscript.sh 생성하는 스크립트를 작성하는 환경 변수의 모든 수출을 가지고 있지만 여전히 동일한 문제에 직면 해있다. 그러나 프로젝트 경로에서 직접 Java -jar osuserver.jar을 실행하면 동일하게 작동합니다.

+0

init.d가 시작한 스크립트는 대화 형 쉘로 실행되지 않으므로 프로필을 제공하지 않습니다. –

+0

프로파일을 수동으로 소싱 중이지만 데몬 서비스가 프로파일을 선택하지 않습니다. –

답변

0

/etc/init.d 아래의 데몬 스크립트는 대부분 루트 사용자로 실행되며 일부는 시스템 부팅시 자동 시작될 수 있습니다. 데몬은 싱글 톤이며, 하나의 데몬 스크립트는 하나의 데몬 서비스 (시작/중지/상태/재시작)를 제어합니다.

~/.profile의 환경은 시스템이 아닌 개인 구성입니다. 환경을 읽어 들일 때는 /etc 폴더 아래에 환경을 두어 데몬 스크립트에 source 명령을 추가해야합니다.

+0

그러면/etc 아래에 직접 파일 이름이 있어야합니까? 필자는 /etc/profile.d에 scripts.sh (환경 변수 내보내기 포함)를 넣기도했지만 그게 도움이되지 못했습니다. 프로젝트 경로에서 Java -jar osuserver.jar을 직접 실행해도 작동합니다. –

+0

감사합니다. 이제 환경 변수를 얻고 있습니다. 나는 데몬 스크립트에서 그것을 소싱하고있다. 나는 데몬 스크립트 소스에서 env 변수를 내보내도록 작성한 스크립트 소스를 아래 행에 추가했다. /home/ec2-user/osuserver/scripts/osuscript.sh –