当工具用习惯了。也就懒的去关心底层的东西了。项目部署的时候,用习惯了jenkins也就不关心运维写的脚本了。但是当工具出问题,那就要从最基础的脚本来部署项目。脚本我也不太懂,在这里只是与大家一起分享启动和关闭的两个脚本,大神请绕路。
注:springboot项目,jar包部署,main类启动项目。脚本有很多,只要懂的原理,都能写出来,仅供参考,没有注释,相关标签知识自己补吧。
1.启动脚本
#!/bin/sh
JAVA_OPTS=""
CLASSPATH=""
CATALINA_OPTS=""
PRG="$0"
RUN_USER="root"
PID_FILE="/data/sbc/项目名/tomcat.pid"
current_user=`whoami`
if [ "$current_user" != "$RUN_USER" ];then
echo "please run $0 as user $RUN_USER" 1>&2
exit 1
fi
# resolve links - $0 may be a softlink
while [ -h "$PRG" ]; do
ls=`ls -ld "$PRG"`
link=`expr "$ls" : '.*-> \(.*\)$'`
if expr "$link" : '/.*' > /dev/null; then
PRG="$link"
else
PRG=`dirname "$PRG"`/"$link"
fi
done
# Get standard environment variables
PRGDIR=`dirname "$PRG"`
APP_HOME=`cd "$PRGDIR/.." >/dev/null; pwd`
SPRINGBOOT_OUT="$APP_HOME"/log/springboot.out
# set JAVA_OPTS
ENV_CONF="$APP_HOME"/conf/env.conf
if [ -f $ENV_CONF ];then
JAVA_OPTS=`sed 's/"//g' $ENV_CONF | awk '/^[^#]/' | tr "\n" ' '`
fi
# set CLASSPATH
if [ -d "$APP_HOME"/lib ];then
for lib_jar in `ls "$APP_HOME/lib"`;do
CLASSPATH="$APP_HOME"/lib/"$lib_jar":"$CLASSPATH"
done
fi
# User can set environment in setenv.sh
if [ -r "$APP_HOME/bin/setenv.sh" ]; then
. "$APP_HOME/bin/setenv.sh"
fi
echo "Using JAVA_HOME: $JAVA_HOME"
echo "Using APP_HOME: $APP_HOME"
if [ ! -z "$CLASSPATH" ];then
echo "Using CLASSPATH: $CLASSPATH"
fi
if [ ! -z "$PID_FILE" ]; then
echo "Using PID_FILE: $PID_FILE"
fi
if [ ! -z "$PID_FILE" ]; then
if [ -f "$PID_FILE" ]; then
if [ -s "$PID_FILE" ]; then
echo "Existing PID file found during start."
if [ -r "$PID_FILE" ]; then
PID=`cat "$PID_FILE"`
ps -p $PID >/dev/null 2>&1
if [ $? -eq 0 ] ; then
echo "Server appears to still be running with PID $PID. Start aborted."
exit 0
else
echo "Removing/clearing stale PID file."
rm -rf "$PID_FILE" >/dev/null 2>&1
if [ $? != 0 ]; then
if [ -w "$PID_FILE" ]; then
cat /dev/null > "$PID_FILE"
else
echo "Unable to remove or clear stale PID file. Start aborted."
exit 1
fi
fi
fi
else
echo "Unable to read PID file. Start aborted."
exit 1
fi
else
rm -rf "$PID_FILE" >/dev/null 2>&1
if [ $? != 0 ]; then
if [ ! -w "$PID_FILE" ]; then
echo "Unable to remove or write to empty PID file. Start aborted."
exit 1
fi
fi
fi
fi
fi
# Add server.jar to classpath, if CLASSPATH is not blank, it must be endswith ":"
CLASSPATH="$CLASSPATH""$APP_HOME"/bin/server.jar
cat /dev/null > ${SPRINGBOOT_OUT}
${JAVA_HOME}/bin/java $JAVA_OPTS -classpath $CLASSPATH org.springframework.boot.loader.JarLauncher >> $SPRINGBOOT_OUT 2>&1 &
if [ ! -z "$PID_FILE" ]; then
echo $! > "$PID_FILE"
fi
echo "springboot server started."
2.关闭脚本
#/bin/sh
RUN_USER="root"
PID_FILE="/data/sbc/项目名/tomcat.pid"
SHUTDOWN_PORT="8411"
current_user=`whoami`
if [ "$current_user" != "$RUN_USER" ];then
echo "please run $0 as user $RUN_USER"
exit 1
fi
if [ ! -f "$PID_FILE" ];then
echo "pid file $PID_FILE not exist, please check if server running, stop aborted."
exit 1
fi
netstat -an | grep LISTEN | grep -w $SHUTDOWN_PORT
if [[ $? -eq 0 ]]; then
shut_info=`curl --connect-timeout 10 -m 30 -XPOST http://127.0.0.1:"$SHUTDOWN_PORT"/shutdown.json`
echo "shutdown info: $shut_info ,result code: $?"
fi
pid=`cat $PID_FILE`
for num in 1 2 3 4 5 6 7 8 9 10
do
echo "stop times: $num"
still_alive=`ps -ef | awk '$2 ~ /^'$pid'$/{print $2}'`
if [ ! -z "$still_alive" ];then
kill $pid
sleep 1
else
break
fi
done
still_alive=`ps -ef | awk '$2 ~ /^'$pid'$/{print $2}'`
if [ ! -z "$still_alive" ];then
kill -9 $pid
fi
rm -rf $PID_FILE
exit 0
再补充一种nohup java 方式的简单启动脚本
#!/bin/bash
#这里可替换为你自己的执行程序,其他代码无需更改
APP_NAME=myApplication.jar
#使用说明,用来提示输入参数
usage() {
echo "Usage: sh start.sh [start|stop|restart|status]"
exit 1
}
#检查程序是否在运行
is_exist() {
pid=`ps -ef | grep $APP_NAME | grep -v grep | awk '{print $2}' `
#如果不存在返回1,存在返回0
if [ -z "${pid}" ]; then
return 1
else
return 0
fi
}
#启动方法
start() {
is_exist
if [ $? -eq "0" ]; then
echo "${APP_NAME} is already running. pid=${pid} ."
else
nohup java -jar $APP_NAME --server.port=83> /dev/null 2>&1 &
fi
}
#停止方法
stop() {
is_exist
if [ $? -eq "0" ]; then
kill -9 $pid
else
echo "${APP_NAME} is not running"
fi
}
#输出运行状态
status() {
is_exist
if [ $? -eq "0" ]; then
echo "${APP_NAME} is running. Pid is ${pid}"
else
echo "${APP_NAME} is not running."
fi
}
#重启
restart() {
stop
start
}
#根据输入参数,选择执行对应方法,不输入则执行使用说明
case "$1" in
"start")
start
;;
"stop")
stop
;;
"status")
status
;;
"restart")
restart
;;
*)
usage
;;
esac