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.
"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
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
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