SpringBoot在linux后台运行方法,含源码

1. 在linux服务器中,在程序结尾加入&符号,如下:

Java -jar test.jar &

&符号,在linux系统中代表的是让这个进程到系统的后台中去执行,但是一旦这个进程有输出,你的控制台将会被当前输出的信息所占领。

 

2. 此时可以考虑通过linux提供的>指令,把标准输出重定向到指定文件中,在linux的>指令中默认定义了两个变量(1, 2), 1代表的是标准输出, 2代表的是错误输出,此时的指令也就演变成了如下:

java -jar test.jar 1> output_common_log_file_path 2> output_error_log_file_path &

由于默认采用的是标准输出,也等同于如下写法

java -jar test.jar > output_common_log_file_path 2> output_error_log_file_path &

 

3. 此时有可能只想部分输出,既可以采用设备/dev/null,来进行忽略输出。

3.1 忽略标准输出

java -jar test.jar 1> /dev/null 2> output_error_log_file_path &

3.2 忽略错误输出

java -jar test.jar 1> output_common_log_file_path 2> /dev/null &

3.2 忽略全部输出

java -jar test.jar 1> /dev/null 2> /dev/null &

 

4. 信息重定向,把所有的输出指定到同一个文件中

4.1 将2的输出也重定向到1

java -jar test.jar 1> output_common_log_file_path 2> &1 &

4.2 忽略全部输出

java -jar test.jar 1> /dev/null 2> &1 &

错误示范:虽然说可以重定向到同一个文件,但是不能直接输出到同一个文件,否则会冲突,如下

java -jar test.jar 1> output_log_file_path 2> output_log_file_path &

 

5. 每次运行命令,都会覆盖原文件,而不是追加,如果想进行追加的话,需要采用>>指令

java -jar test.jar 1>> output_common_log_file_path 2>> output_error_log_file_path &

 

6. 通过&符号启动的“后台”进程在shell一直打开的情况下是没有问题的,如果此时关了shell窗口,甚至是退出了ssh登录或vnc登录,进程也就自动结束了,此时就需要用到linux的nohup指令。

nohup java -jar test.jar 1> output_common_log_file_path 2> output_error_log_file_path &

 

7. 经过整理后得到的sh文件,当前不输出>日志。

#!/bin/sh
APP_DIR=/app/server/cuohe-admin
APP_FILE=yaycrawler-admin-1.0.0-SNAPSHOT.war
#APP_CONF=$APP_DIR/application.properties

#set java home
#export JAVA_HOME=/opt/jdk1.8.0_111
usage(){
    echo 'Usage: sh yaycrawler-admin-1.0.0-SNAPSHOT.sh [start|stop|deploy|check]'
    exit 1
}

kills(){
    tpid=`ps -ef|grep $APP_FILE|grep -v grep|grep -v kill|awk '{print $2}'`
    if [[ $tpid ]]; then
	echo 'Kill Process!'
	kill -9 $tpid
    fi
}

start(){
    rm -f $APP_DIR/tpid

    if [[ $APP_CONF ]]; then
        nohup java -jar $APP_DIR/"$APP_FILE" --spring.config.location="$APP_CONF" >> /dev/null 2>>&1 &
	echo 'starting...'
    else
	nohup java -jar $APP_DIR/"$APP_FILE" >> /dev/null 2>>&1 &
	echo 'starting...'
    fi

    echo $! > $APP_DIR/tpid
    echo 'Start Success!'
}

stop(){
    tpid1=`ps -ef|grep $APP_FILE|grep -v grep|grep -v kill|awk '{print $2}'`
    echo "tpid1-$tpid1"
    if [[ $tpid1 ]]; then
	echo 'Stop Process...'
	kill -15 $tpid1
    fi
    sleep 5
    tpid2=`ps -ef|grep $APP_FILE|grep -v grep|grep -v kill|awk '{print $2}'`
   
    if [[ $tpid2 ]]; then
        echo "tpid2-$tpid2"
	echo 'Kill Process!'
	kill -9 $tpid2
    else
	echo 'Stop Success!'
    fi
}

check(){
    tpid=`ps -ef|grep $APP_FILE|grep -v grep|grep -v kill|awk '{print $2}'`
    if [[ $tpid ]]; then
	echo 'App is running.'
    else
	echo 'App is NOT running.'
    fi
}

deploy(){
    kills
    rm -rf $APP_DIR/"$APP_FILE"
    cp "$APP_FILE" $APP_DIR
}

case "$1" in
    "start")
	start;;
    "stop")
	stop;;
    "kill")
	kills;;
    "deploy")
	deploy;;
    "check")
	check;;
    *)
	usage;;
esac

运行方式,./sh文件 [start|stop|deploy|check] 这四个指令。

如启动:./yaycrawler-admin-1.0.0-SNAPSHOT.sh start

 

8. 在运行sh文件可能遇到的几个问题

8.1 \302\240,command not found

一看到这个错,就知道你是在Windows环境下编写的sh脚本,在vim环境下编辑当前的sh文件,如图找到第48行,把空格删除,并重新补入空格即可,原因是因为windows和linux的字符编码不一样导致的。

8.2 syntax error: unexpected end of file

这个错误跟上面的意思差不多,使用vim来进行编写,即可解决此问题。

赞 (0) 评论 分享 ()