各位,早上好啊~ 发现许久没有分享过技术文章了,今天分享两个部署项目时候比较实用的shell脚本

一键部署shell脚本

由于个人部署,会习惯把jar放到lib目录下面,如果你没有这个习惯,可以适当做一些修改。该脚本提供了一键启动、停止、重启、检查操作

deploy.sh代码
#!/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文件下面,可以自行做一些小调整即可

colorfullog.sh代码
#! /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$1\e[0m\e[1;36m$2\e[0m\e[1;33m$3\e[0m\e[1;31m$4\e[0m\e[1;34m$5\e[0m\e[1;35m$6\e[0m\e[1;36m$7\e[0m/g'

打印出来的效果

再进一步操作

微服务时代,项目肯定是不会只有一个jar的,就拿本人自己写的项目来看(也是因为没有采用容器化部署,感觉搞不好,坑太多了),目前也是6个包了,尽管上述操作也还简单方便,只需要进到每个模块里面,执行deploy.sh即可

不过本着精益求精的思想理念,到底有没有更加好方法,可以一劳永逸的,即使之后加服务,不需要修改太多东西的操作

基于此,在模块平级里,新建一个common-shell的文件夹,里面放一个deploy_all.sh

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即可

分享两个实用的shell脚本的更多相关文章

  1. 实用的shell脚本面试题和答案

    1. 写一个shell脚本来得到当前的日期,时间,用户名和当前工作目录. 答案 : 输出用户名,当前日期和时间,以及当前工作目录的命令就是logname,date,who i am和pwd. 现在,创 ...

  2. 几例实用的Shell脚本

    日常工作中,经常编写一些shell命令或脚本以完成重复性操作,本文分享了最近用到的几例shell实用脚本. 1 特殊文件名的远程拷贝 服务器之间拷贝文件经常使用scp命令,其命令格式: (1)scp ...

  3. 博主日常工作中使用的shell脚本分享

    前言: 今天给大家分享一篇在我工作中常用的一个shell脚本,里面有一些我们常用到的shell操作.该脚本用于本地电脑和服务器交互上,实现以下功能: 自动拉取自己个人电脑上的源码到服务器上yocto包 ...

  4. springboot打包不同环境配置与shell脚本部署

    本篇和大家分享的是springboot打包并结合shell脚本命令部署,重点在分享一个shell程序启动工具,希望能便利工作: profiles指定不同环境的配置 maven-assembly-plu ...

  5. Shell脚本学习指南 [ 第一、二章 ] 背景知识、入门

    摘要:第一章介绍unix系统的发展史及软件工具的设计原则.第二章介绍编译语言与脚本语言的区别以及两个相当简单但很实用的Shell脚本程序,涵盖范围包括了命令.选项.参数.Shell变量.echo与pr ...

  6. Apache下通过shell脚本提交网站404死链

    网站运营人员对于死链这个概念一定不陌生,网站的一些数据删除或页面改版等都容易制造死链,影响用户体验不说,过多的死链还会影响到网站的整体权重或排名. 百度站长平台提供的死链提交工具,可将网站存在的死链( ...

  7. shell 脚本——判断条件

    在之前的shell语言学习笔记中已经写过shell的几种判断语句及循环语句,也简单的介绍了shell语言判断语句和判断条件.在此再做进一步学习. test命令的测试功能 test命令用于检测系统文件及 ...

  8. 通信统计接口字段填充内容shell脚本

    现在通信行业上班,最麻烦的就是计算各个协议接口字段填充的内容是否正确.经历了小白似的一个个字段统计在到单个接口所有字段统计,然后到现在的多个接口一次统计.在大大节省了时间的同时,让自己有更充足的时间来 ...

  9. 让shell脚本中的echo输出带颜色

    转载自:http://www.linuxidc.com/Linux/2014-12/110463.htm 让echo输出带颜色的方法有两种 1.在shell脚本中定义颜色变量,使用echo -e调用变 ...

随机推荐

  1. 为什么不建议使用统配符初始化 css 样式

    为什么不建议使用统配符初始化 css 样式 * { padding:0; margin:0; } 采用这样的写法好处是写起来很简单,但是通配符,需要把所有的标签都遍历一遍,当网站较大时,样式比较多,这 ...

  2. cookies、sessionStorage和localStorage的区别

    cookies.sessionStorage和localStorage的区别 对比 特性 Cookie LocalStorage SessionStorage 数据的生命周期              ...

  3. C# 操作ie网页,注入JavaScript等操作

    之前做过一个录制鼠标键盘并回放的功能,使用的关键技术是钩子程序.在实现针对指定页面进行录制的过程中,发现C#操作网页的功能. https://www.cnblogs.com/wangchuang/ar ...

  4. Spring如何处理线程并发问题?

    在一般情况下,只有无状态的Bean才可以在多线程环境下共享,在Spring中,绝大部分Bean都可以声明为singleton作用域,因为Spring对一些Bean中非线程安全状态采用ThreadLoc ...

  5. Flask-SQLAlchemy 使用教程

    Flask-SQLAlchemy ,是对SQLAlchemy进一步封装 SQLAlchemy使用教程地址: https://www.cnblogs.com/bigox/p/11552542.html ...

  6. 『现学现忘』Docker基础 — 36、CMD指令和ENTRYPOINT指令的区别

    目录 1.CMD指令和ENTRYPOINT指令说明 2.CMD指令只有最后一条生效的原因 3.CMD指令演示 4.ENTRYPOINT指令演示 5.总结 CMD指令和ENTRYPOINT指令作用都是指 ...

  7. css 垂直居中方法汇总

    查看原文可以有更好的排版效果哦 前言 居中是平时工作中的最常见的一种需求,各种图片居中或者各种弹窗,水平居中还好,特别是垂直居中,很多初学者表示太难写了,现在列举一些常用的方法. 实战 这里只讲述cs ...

  8. 一个让我很不爽的外包项目——奔驰Smart2015新官网

    七月份的下半个月,有幸做了奔驰 Smart 2015年新官网,包括手机端和PC端的宣传页,地址: PC端 手机端 这里,为了证明这个是一个事实,我还特意的留存了两张截图: 这里只想说明这么几个问题: ...

  9. 从零到有模拟实现一个Set类

    前言 es6新增了Set数据结构,它允许你存储任何类型的唯一值,无论是原始值还是对象引用.这篇文章希望通过模拟实现一个Set来增加对它的理解. 原文链接 用在前面 实际工作和学习过程中,你可能也经常用 ...

  10. 原生ES6写的Web游戏:ES6-Mario,小美女,小帅哥快来玩啊~~

    ? ES6-Mario 这是一个用原生ES6语法和HTML5新特性写成的Web 游戏. 通过这个项目,你可以在实践中对ES6的主要内容.HTML Canvas 相关API以及Webpack的基础配置有 ...