2016-04-28 11 views
0

У меня есть сценарий bash для развертывания моего приложения для загрузки весны (с использованием бамбука).Сценарий Bash, чтобы запустить приложение Spring-Boot и завершить скрипт

сценарий получает повесила на это как запуски приложений весна-загрузки и работает

java -jar myApp.jar 

Я попытался запустить его в фоновом режиме с

java -jar myApp.jar & 

, а также

java -jar myApp.jar & 
disown 

просто «&», кажется, ничего не делает, пока «&» после чего «отключение» заставило скрипт выйти из строя.

Как разрешить выполнение скрипта во время работы приложения весенней загрузки?

+1

«just» & «кажется, ничего не делает» на самом деле не так, оно фактически запускает приложение в фоновом режиме и позволяет сценарию работать до завершения. Как вы утверждаете, что ничего не делает? – Inian

+0

Если 'java -jar myApp.jar' сам по себе работает, и делает то, что вы хотите, чтобы сделать, то в java -jar myApp.jar &' в сценарии bash будет запущено ваше приложение в фоновом режиме и остальная часть сценария bash будет продолжена, я не вижу проблемы. Отправьте некоторый результат, чтобы показать нам проблему и что происходит, а также рассказать нам, что вы ожидаете. – drewyupdrew

+0

Я не утверждал, что ничего не делает. Я утверждал, что это ничего не делало - потому что это, казалось, ничего не делало. Просто положив «&» в конце, сценарий все еще ожидал завершения вызова java (что обычно связано с тем, что он запускает службу). Я добавил «>>/dev/null» перед «&», и, похоже, это трюк.Теперь скрипт запускает приложение и завершается сам. – swinters

ответ

1

nohup java -jar myApp.jar &

nohup будет перехватывать сигнал HUP (зависание), когда телетайп закрывается. Это предотвращает завершение процесса, когда пользователь выходит из системы/ваш удаленный сеанс заканчивается. Амперсанд предназначен для начала процесса в фоновом режиме.

+0

Хотя этот код может ответить на вопрос, предоставив дополнительный контекст относительно _why_ и/или _how_ он отвечает , вопрос значительно улучшит его долгосрочное значение . Пожалуйста, отредактируйте свой ответ, чтобы добавить какое-то объяснение. –

+0

@TobySpeight сделано. – joshiste

1

Существует несколько вариантов, один из которых упоминается как команда «nohup». Другой способ запускать - использовать «экранный» виртуальный терминал. Но я бы предложил вам значительно лучше подойти и запустить его как любую другую фоновую службу на машинах * nix (например, apache, mysql и т. Д.)

Вот мой очень простой код, который у меня внутри скрипта /etc/init.d/great-spring-boot-app, вы можете редактировать несколько строк в наборе ваших конвенций и сохранить этот файл с именем любого внутри /etc/init.d/ каталога, например /etc/init.d/my-cool-spring-boot-app

Затем сделайте его исполняемым: chmod +x /etc/init.d/my-cool-spring-boot-app

После этого можно просто начать процесс что-то вроде

sudo service my-cool-spring-boot-app start

Другие варианты:

stop|restart|status

#!/bin/bash - 

#=-= START OF CUSTOM SERVICE CONFIGURATION =-# 
# Where micro service war/jar file sits? 
MS_HOME=/opt/MY_MICRO_SERVICE_ROOT_DIRECTORY # <--- EDIT THIS LINE 

# Actual file name of Micro Service (jar or war), 
# ms-service.war or something-0.0.1-SNAPSHOT.jar, etc. 
MS_JAR=MY_SPRING_BOOT_APPLICATION-0.0.1-SNAPSHOT.war # <--- EDIT THIS LINE 
# ^^^ that should relative to MS_HOME directory. 

# Which username we should run as. 
RUNASUSER=USER_TO_RUN_AS; # <-- EDIT THIS LINE, 
# if port number for spring boot is < 1024 it needs root perm. 

JAVA_HOME=/usr/local/jdk1.8.0_60; # <-- EDIT THIS, Where is your JDK/JRE? 
PATH=${JAVA_HOME}/bin:${PATH}; 
SHUTDOWN_WAIT=20; # before issuing kill -9 on process. 

export PATH JAVA_HOME 


# These options are used when micro service is starting 
# Add whatever you want/need here... overrides application*.yml. 
OPTIONS=" 
-Dserver.port=8080 
-Dspring.profiles.active=dev 
"; 
#=-= END OF CUSTOM CONFIGURATION =-=# 

# Try to get PID of spring jar/war 
MS_PID=`ps fax|grep java|grep "${MS_JAR}"|awk '{print $1}'` 
export MS_PID; 

# Function: run_as 
run_as() { 
    local iam iwant; 

    iam=$(id -nu); 
    iwant="$1"; 
    shift; 

    if [ "${iam}" = "${iwant}" ]; then { 
    eval $*; 
    } 
    else { 
    /bin/su -p -s /bin/sh ${iwant} $*; 
    } fi; 
} 

# Function: start 
start() { 
    pid=${MS_PID} 
    if [ -n "${pid}" ]; then { 
    echo "Micro service is already running (pid: ${pid})"; 
    } 
    else { 
    # Start screener ms 
    echo "Starting micro service"; 
    cd $MS_HOME 
    run_as ${RUNASUSER} java -jar ${OPTIONS} ./${MS_JAR}; 
    # java -jar ${OPTIONS} ./${MS_JAR} 
    } fi; 
    # return 0; 
} 

# Function: stop 
stop() { 
    pid=${MS_PID} 
    if [ -n "${pid}" ]; then { 

    run_as ${RUNASUSER} kill -TERM $pid 

    echo -ne "Stopping micro service module"; 

    kwait=${SHUTDOWN_WAIT}; 

    count=0; 
    while kill -0 ${pid} 2>/dev/null && [ ${count} -le ${kwait} ]; do { 
     printf "."; 
     sleep 1; 
     ((count++)); 
    } done; 

    echo; 

    if [ ${count} -gt ${kwait} ]; then { 
     printf "process is still running after %d seconds, killing process" \ 
    ${SHUTDOWN_WAIT}; 
     kill ${pid}; 
     sleep 3; 

     # if it's still running use kill -9 
     # 
     if kill -0 ${pid} 2>/dev/null; then { 
     echo "process is still running, using kill -9"; 
     kill -9 ${pid} 
     sleep 3; 
     } fi; 
    } fi; 

    if kill -0 ${pid} 2>/dev/null; then { 
     echo "process is still running, I give up"; 
    } 
    else { 
     # success, delete PID file, if you have used it with spring boot 
     # rm -f ${SPRING_BOOT_APP_PID}; 
    } fi; 
    } 
    else { 
     echo "Micro service is not running"; 
    } fi; 

    #return 0; 
} 

# Main Code 

case $1 in 
    start) 
    start; 
    ;; 
    stop) 
    stop; 
    ;; 
    restart) 
    stop; 
    sleep 1; 
    start; 
    ;; 
    status) 
    pid=$MS_PID 
    if [ "${pid}" ]; then { 
     echo "Micro service module is running with pid: ${pid}"; 
    } 
    else { 
     echo "Micro service module is not running"; 
    } fi; 
    ;; 
esac 

exit 0; 

Это подходящий способ, чтобы начать фоновую службу (ы) на Linux.