我有一个bash脚本来部署我的弹簧启动应用程序(使用竹子)。Bash脚本启动弹簧启动应用程序并完成脚本
脚本被挂在此为弹簧启动应用程序启动和运行
java -jar myApp.jar
我试着用
java -jar myApp.jar &
运行它的背景以及
java -jar myApp.jar &
disown
只是“&”似乎什么都不做,而“&”其次是“disown”使脚本失败。
如何在春季启动应用程序继续运行时让脚本完成?的TTY关闭时
我有一个bash脚本来部署我的弹簧启动应用程序(使用竹子)。Bash脚本启动弹簧启动应用程序并完成脚本
脚本被挂在此为弹簧启动应用程序启动和运行
java -jar myApp.jar
我试着用
java -jar myApp.jar &
运行它的背景以及
java -jar myApp.jar &
disown
只是“&”似乎什么都不做,而“&”其次是“disown”使脚本失败。
如何在春季启动应用程序继续运行时让脚本完成?的TTY关闭时
nohup java -jar myApp.jar &
nohup
将拦截HUP
(挂机)信号。这可以防止在用户注销/远程会话结束时终止进程。 &符号用于在后台启动进程。
尽管此代码可能会回答问题,但提供 有关_why_和/或_how_的其他上下文,它将回答 该问题将显着提高其长期值 的值。请[编辑]你的答案,添加一些解释。 –
@TobySpeight完成。 – joshiste
有多种选择,其中之一就是'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上启动后台服务(S)的适当方式。
“just”&“似乎什么都不做”实际上并不正确,它实际上是在后台运行应用程序并让脚本运行完成。你如何声称它什么都不做? – Inian
如果'java -jar myApp.jar'确实有效,并且做了你想做的事情,那么把'java -jar myApp.jar&'放到一个bash脚本中会在后台运行你的应用程序,其余的bash脚本将继续,我没有看到问题。发布一些结果来向我们展示问题和发生的情况,并告诉我们你期望发生的事情。 – drewyupdrew
我没有声称它什么都不做。我声称它似乎什么都不做 - 因为它似乎什么都不做。只要将“&”放在最后,脚本仍然在等待Java调用完成(这不会因为它正在启动服务)。我在“&”前面添加了“>>/dev/null”,并且它似乎有效。该脚本现在启动应用程序并自行完成 – swinters