各位,早上好啊~ 发现许久没有分享过技术文章了,今天分享两个部署项目时候比较实用的shell脚本
由于个人部署,会习惯把jar放到lib目录下面,如果你没有这个习惯,可以适当做一些修改。该脚本提供了一键启动、停止、重启、检查操作
#!/bin/bash #这里可替换为你自己的执行程序,其他代码无需更改 cd ../lib/ jar_path=`pwd` APP_NAME=`ls -al *.jar | awk '{print $9}'` #使用说明,用来提示输入参数 usage() { echo "Usage: sh robotcenter.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 cd /home/dtx/common-shell echo `pwd` # 引入公用shell脚本参数,可以自行考虑需不需要 . common_params.sh echo "启动堆大小: $java_mem_size" echo "------------------------------------------------------------------------------------------------------------" echo "java_gc: $java_gc" echo "------------------------------------------------------------------------------------------------------------" echo "启动profile参数:$profile" cd ${jar_path} nohup java ${java_mem_size} ${java_gc} -jar ${APP_NAME} ${profile} >/dev/null 2>&1 & is_exist if [ $? -eq 0 ]; then echo "${APP_NAME} is running" else echo "${APP_NAME} is running failed" fi sleep 2 fi } #停止方法 stop(){ is_exist if [ $? -eq "0" ]; then kill -9 $pid echo "${APP_NAME} has stopped" 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 sleep 5 start } #根据输入参数,选择执行对应方法,不输入则执行使用说明 case "$1" in "start") start ;; "stop") stop ;; "status") status ;; "restart") restart ;; *) usage ;; esac
重启效果如下
也是由于个人习惯,回把log4j打印的日志放到logs文件下面,可以自行做一些小调整即可
#! /bin/bash tail -300f ../logs/stdout.log | perl -pe's/(INFO)|(DEBUG)|(WARN)|(ERROR)|(^[0-9-:.s]{10,23})|((?<=[OGNR]s)[0-9]{1,5})|((?<=[.{15}]s).{1,40}(?=s(:s)|s))/e[1;32m$1e[0me[1;36m$2e[0me[1;33m$3e[0me[1;31m$4e[0me[1;34m$5e[0me[1;35m$6e[0me[1;36m$7e[0m/g'
打印出来的效果
微服务时代,项目肯定是不会只有一个jar的,就拿本人自己写的项目来看(也是因为没有采用容器化部署,感觉搞不好,坑太多了),目前也是6个包了,尽管上述操作也还简单方便,只需要进到每个模块里面,执行deploy.sh即可
不过本着精益求精的思想理念,到底有没有更加好方法,可以一劳永逸的,即使之后加服务,不需要修改太多东西的操作
基于此,在模块平级里,新建一个common-shell的文件夹,里面放一个deploy_all.sh
#! /bin/bash ## author:Amg ## 该shell脚本用于一键启动、停止、重启所有设置好的jar文件 cd .. base_path=`pwd` # 即使加服务,只要符合约定就可以被扫描出来 centers=`ls -al | grep dtx | awk '{print $9}'` echo "---------------------base path: ${base_path} ------------------------" ## 启动所有项目 start(){ for line in $centers do jarPath=${base_path}/$line/bin/ echo "当前所在目录: ${jarPath},即将启动目录下的jar " cd ${jarPath} sh deploy.sh start echo "================================" done } ## 停止所有项目 stop(){ for line in $centers do jarPath=${base_path}/$line/bin/ echo "当前所在目录: ${jarPath},即将停止目录下的jar " cd ${jarPath} sh deploy.sh stop echo "================================" done } ## 重启所有项目 restart(){ for line in $centers do jarPath=${base_path}/$line/bin/ echo "当前所在目录: ${jarPath},即将重启目录下的jar " cd ${jarPath} sh deploy.sh restart echo "================================" done } ##检查项目状态 status(){ for line in $centers do jarPath=${base_path}/$line/bin/ echo "当前所在目录: ${jarPath},即将检查目录下的jar运行情况" cd ${jarPath} sh deploy.sh status echo "================================" done } usage(){ echo "该脚本用于一键启停,具体用法有start、stop、restart status" } #根据输入参数,选择执行对应方法,不输入则执行使用说明 case "$1" in "start") start ;; "stop") stop ;; "status") status ;; "restart") restart ;; *) usage ;; esac
该脚本的作用其实很简单,就是不断的循环进入到各个具体的模块,调用上面的deploy脚本,进行一系列的操作
基于约定大于配置的思想,如果我们后续加服务,只需要在平级下面创建相同规则的文件夹,里面的结构也是存放lib,logs,bin即可