2016-04-28 1 views
0

Ich habe ein Bash-Skript, um meine Spring-Boot-App (mit Bambus) zu implementieren.Bash-Skript zum Starten der Spring-Boot-App und Beenden des Skripts

Skript wird auf diese als feder Boot-App startet gehängt und

java -jar myApp.jar 

Ich habe versucht, es läuft im Hintergrund mit

java -jar myApp.jar & 

sowie

java -jar myApp.jar & 
disown 
läuft

nur "&" scheint nichts zu tun, während die "&" gefolgt von "enterprise" hat das Script zum Scheitern gebracht.

Wie kann ich das Skript beenden, während die Spring-Boot-App ausgeführt wird?

+1

"nur" & "scheint nichts zu tun" ist nicht wirklich wahr, es führt die App tatsächlich im Hintergrund aus und lässt das Skript zum Abschluss laufen. Wie behaupten Sie, dass es nichts tut? – Inian

+0

Wenn 'java -jar myApp.jar' auf eigene Faust funktioniert, und tut, was Sie wollen, dann setzen Sie' java -jar myApp.jar & 'in einem Bash-Skript Ihre App im Hintergrund und die Der Rest des Bash-Skripts wird fortgesetzt. Ich sehe das Problem nicht. Veröffentlichen Sie eine Ausgabe, um uns das Problem und die Vorgänge zu zeigen, und teilen Sie uns auch mit, was Sie erwarten. – drewyupdrew

+0

Ich behauptete nicht, dass es nichts tut. Ich behauptete, dass es nichts zu tun schien - weil es nichts zu tun schien. Nachdem das "&" an das Ende gesetzt wurde, wartete das Skript immer noch auf den Java-Aufruf, um zu beenden (was nicht bedeutet, dass es einen Dienst startet). Ich fügte ">>/dev/null" vor dem "&" hinzu und es schien den Trick zu machen.Das Skript startet jetzt die App und vervollständigt sich selbst. – swinters

Antwort

1

nohup java -jar myApp.jar &

nohup das HUP (Hangup-Signal) abfangen, wenn die TTY schließt. Dies verhindert, dass der Prozess beendet wird, wenn sich der Benutzer abmeldet/Ihre Remote-Sitzung endet. Das Et-Zeichen dient dazu, den Prozess im Hintergrund zu starten.

+0

Obwohl dieser Code die Frage beantworten kann, bietet zusätzlichen Kontext in Bezug auf _why_ und/oder _how_ es die Frage würde deutlich verbessern seine langfristige Wert. Bitte [bearbeiten] Sie Ihre Antwort, um eine Erklärung hinzuzufügen. –

+0

@TobySpeight erledigt. – joshiste

1

Es gibt mehrere Optionen, eine wie erwähnt ist 'nohup' Befehl. Eine andere Möglichkeit zum Ausführen ist das Verwenden des virtuellen Terminals "Bildschirm". Aber ich würde vorschlagen, dass Sie einen wesentlich besseren Ansatz und führen Sie es als jeder andere Hintergrund-Service auf * nix Maschinen (wie Apache, Mysql, etc.)

Hier mein sehr einfacher Code, den ich innerhalb /etc/init.d/great-spring-boot-app Skript haben, können Sie bearbeiten paar Zeilen Ihrer Konventionen zur Suite und diese Datei mit beliebigen Namen speichern innerhalb von /etc/init.d/ Verzeichnis, zum Beispiel /etc/init.d/my-cool-spring-boot-app

Dann machen sie es ausführbar: chmod +x /etc/init.d/my-cool-spring-boot-app

Danach einfach Prozess beginnen kann etwas wie

tun

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

Weitere Optionen sind:

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; 

Dies ist der geeignete Weg ist, Hintergrunddienst (e) unter Linux zu starten.