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来进行编写,即可解决此问题。