springboot项⽬在linux服务器部署启动脚本shell编写springboot项⽬可以打成⼀个jar包,在服务器上部署启动还是很⽅便的,但写⼀个简单的脚本会让部署更加⽅便,
特别是分布式部署的时候,可以省略很多的ps 查看进程和kill进程的步骤,下⾯就展⽰⼀个简单的启动脚本
⾸先展⽰⼀下项⽬部署的⽬录结构 small.jar是要运⾏的jar包
8080⽬录和8081⽬录 8082 8083 ⽬录类似
其中small_control.sh是总执⾏脚本运⾏去触发执⾏每个⽂件夹下的 small.sh脚本
这样可以⼀起启动四个不同的端⼝也可以单独启动不同的端⼝
执⾏命令⽰例:
sh small_control.sh all start
sh small_control.sh8080 stop
sh small_control.sh8081 restart
下⾯是small_control.sh 代码
#!/bin/bash
current_dir=$(cd `dirname $0`; pwd) #当前⽬录
#判断第⼆个参数
case $2in
start)
if [ $1 == "all" ]; then
#第⼀个参数是all 遍历所有含80⽬录执⾏small.sh
for dir in `ls -d */ | grep80`
do
sub_shell=${current_dir}/${dir}small.sh
if [ -x "$sub_shell" ]; then
$sub_shell stop >/dev/null2>&1
$sub_shell start
fi
done
else
#第⼀个参数$1是port 类似8080 去执⾏该端⼝⽬录下的small.sh
${current_dir}/$1/small.sh start
fi
;;
stop)
if[ $1 == "all" ];then
for dir in `ls -d */ | grep80`
do
sub_shell=${current_dir}/${dir}small.sh
if [ -x "$sub_shell" ];then
$sub_shell stop
fi
done
else
${current_dir}/$1/small.sh stop
;;
restart)
if[ $1 == "all" ];then
for dir in `ls -d */ | grep80`
do
sub_shell=${current_dir}/${dir}small.sh
if [ -x "$sub_shell" ];then
$sub_shell restart
fi
done
else
${current_dir}/$1/small.sh restart
;;
*)
echo"Usage: small_control.sh {port|all} {start|stop}"
echo"example: small_control.sh all start"
echo"example: small_control.sh 8081 stop"
exit 1
;;
esac
下⾯是smal.sh 代码
#!/bin/bash
current_dir=$(cd `dirname $0` ; pwd) #当前⽬录
grand_parent_dir=$(cd ${current_dir}/..;pwd) #⽗⽬录
port_num=${current_dir##*/} #端⼝截取⽬录最后⼀个/右边内容
dest_out=${current_dir}/small${port_num}.out #输出⽂件
jar_file=${grand_parent_dir}/small.jar
pid_file=${current_dir}/${port_num}.pid
command="java -jar -Xms1024M -Xmx4096M -Dserver.port=${port_num} ${jar_file}"
#Functions 定义⽅法
#是否正在运⾏传⼊进程号
isRunning() {
ps -p "$1" &> /dev/null
}
start() {
#判断pid⽂件是否存在如存在且在运⾏则返回0
if [[ -f "$pid_file" ]]; then
pid=$(cat"$pid_file")
isRunning "$pid" && { echo"Alreday running [$pid]"; return 0 }
fi
do_start "$@" # $@ 传递所有参数到下⼀个⽅法
}
do_start(){
cd $current_dir
echo $command #打印命令
$command > $dest_out 2>&1 & #执⾏命令
pid=$! #记录进程号
echo"$pid" > "$pid_file" #进程号输出到pid file
# -z 判断字符串长度是否为0 为0则true
[[ -z $pid ]] && { echo"Failed to start"; return 1; }
echo"Started {$pid}"
}
stop(){
# -f 判断pid⽂件是否存在
[[ -f $pid_file ]] || { echo"Not running (Pidfile not found)"; return 0; }
pid=$(cat"$pid_file")
isRunning "$pid" || { echo"not running (process ${pid}). remove pid file."; rm -f "$pid_file"; return 0; } do_stop "$pid""$pid_file"
}
do_stop(){
#杀掉进程失败返回
kill"$1" &> /dev/null || { echo"unable to kill process $1"; return 1; }
#循环判断是否还运⾏
for i in $(seq130); do
isRunning "$1" || { echo"stopped [$1]"; rm -rf "$2"; return 0; }
[[ $i -eq 10 ]] && kill"$1" &> /dev/null
[[ $i -eq 20 ]] && kill -9"$1" &> /dev/null
sleep1
done
echo"unable to kill process $1";
return 1;
}
restart(){
stop && start
}
#运⾏状态
status(){
[[ -f "$pid_file" ]] || { echo"not running"; return 3; }
pid=$(cat"$pid_file")
isRunning $pid || { echo"Not running (Pidfile not found)"; return 1; }
echo"running {$pid}"
return 0
linux循环执行命令脚本}
case"$1"in
start)
#执⾏start⽅法
start "$@"; exit $? ;;
stop)
stop "$@"; exit $? ;;
restart)
restart "$@"; exit $? ;;
status)
status "$@"; exit $? ;;
*)
echo"usage $0 {start|stop|restart|status}"
echo1;;
esac
注意⽅法的定义要放在执⾏⽅法的语句前⾯,shell脚本是顺序执⾏的
注意在windows环境下编写的脚本每⾏结尾是\r\n,⽽Unix系统结尾是\n,所以从windows上传的shell脚本需执⾏下⾯语句进⾏转换才能正确运⾏
sed -i 's/\r//' small_control.sh
sed -i 's/\r//' small.sh
如发现问题欢迎留⾔!
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论