2016-04-28 117 views
0

我有一个bash脚本来部署我的弹簧启动应用程序(使用竹子)。Bash脚本启动弹簧启动应用程序并完成脚本

脚本被挂在此为弹簧启动应用程序启动和运行

java -jar myApp.jar 

我试着用

java -jar myApp.jar & 

运行它的背景以及

java -jar myApp.jar & 
disown 

只是“&”似乎什么都不做,而“&”其次是“disown”使脚本失败。

如何在春季启动应用程序继续运行时让脚本完成?的TTY关闭时

+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上启动后台服务(S)的适当方式。