使用 Shell 脚本甩掉重复的体力活,唯见你悠闲的喝着咖啡

从事java开发工作大约有7年多的时间,对设计模式、多线程高并发、分布式系统设计、JVM调优和sql调优有着丰富的实战经验和深刻的理解,对从事软件行业的每一个人和技术都怀有一颗敬畏的心,我希望把我的实战经验和对软件设计的个人见解分享给大家,我相信只有共同探讨才能进步。 我的公众号是“独孤九技”,欢迎大家订阅,会持续更新干货的哦。

文章正文

前言

大家好,首先感谢大家订阅本次 Chat,有了你们的支持,我会更加努力的去写作,好了,废话不多说,咱们直奔主题。

随着分布式系统的兴起,我们管理的大大小小的服务可能会有很多个,比如有 MySQL、Tomcat、Redis、MQ 等等,并且可能是分布在不同的 Linux 主机上面,如果一个一个地去启动这些服务,不但会浪费时间,而且还会做大量重复性的工作;并且这些服务有没有启动成功,我们可能还需要 ps -ef | grep 命令去一个一个地检查。

有没有更加快捷的办法呢?有的同学可能会想到使用市面上的服务检测工具,不过在有限硬件资源的情况下,这些服务检测工具也是需要安装和启动的,搞不好可能还需要修改源代码,有没有更加省力和快捷的办法呢?

答案就是,使用 Shell 脚本启动与监测这些服务,并通过一键命令就能解决这些需求,接下来我们会通过几个真实的案例来具体实现。

我们本次项目的 Git 地址为:

https://github.com/ningshuaichen1991/shell.git

第一个 Shell 脚本程序

很多小伙伴可能第一次接触 Shell 脚本,不过也没有关系,我们趁着这个机会就简单学习一下 Shell 脚本,先写第一个 Shell 脚本程序。

首先在 Linux 系统中的当前目录,执行:

vim test.sh

编辑此文件,所有 Shell 脚本文件都是 .sh 的格式,文件内容如下:

#!/bin/bash
#当前日期
time=$(date '+%Y-%m-%d %H:%M:%S')
echo "当前时间为:$time"

总共有三行代码,我们简单来分析一下。

#!/bin/bash

是 Shell 脚本的标识,任何一个 Shell 脚本都会在第一行有这个声明,如果不写,那么将无法启动。

time=$(date '+%Y-%m-%d %H:%M:%S')

声明一个 time 常量,注释上也有些,是当前系统的时间,date 就是当前的日期,如果想要时间格式为“2020-7-10 22:15:20”,那么就需要进行格式化,时间格式的标准写在$ ( '+%Y-%m-%d %H:%M:%S') 里面。

echo "当前时间为:$time"

是打印当前的时间常量,与 Java 的 System.out.print() 类似,然后我们测试一下,并观察它运行的结果。

测试

通过执行 sh test.sh 运行此脚本文件,结果如下:

在这里插入图片描述

ok,时间打印出来了,这只是我们编写的第一个 Shell 脚本程序,不是太难,相信大家都能够理解,接下来我们就分析在真实的项目中该如何使用脚本程序。

一键启动 Redis、Nginx、Tomcat 和 ActiveMQ 服务的 Shell 脚本编写

在我们现有的 Linux 系统中,有 Redis、Nginx、Tomcat 和 ActiveMQ,可是每一个启动的命令大约都差不多,如果一个一个地去启动太麻烦,所以我们采用 Shell 脚本对它们进行一键启动。

首先 vim startAllServer.sh,编写一个启动 Shell 脚本的文件,接下来我们直接看它们启动脚本的内容:

#!/bin/bash
#当前日期
time=$(date '+%Y-%m-%d %H:%M:%S')

#redis 启动
function redisStart(){
  #redis 启动的目录
  redis_server_exec=/usr/local/redis/src/redis-server
  #redis 的配置文件目录
  redis_conf=/usr/local/redis/redis.conf
  #每个 redis 服务端口,每一个端口的配置文件启动一个 redis 服务
  ports=('6379')
  #获取所有的 redis 服务的进程信息
  redis=`ps -aux | grep $redis_server_exec`
  echo $redis
  #判断端口是否存在于 redis 服务信息中
  for port in ${ports[*]};do
  #这句话的意思是判断 port 这个字符串是否在 redis 这个字符串中
  if [[ $redis =~ $port ]]
  then
    echo "redis 服务已经启动,无需再进行操作,端口号:$port  $time !!!!!!!!!!!!"
  else
    echo "redis 服务开始启动,端口号:$port  $time !!!!!!!!!!!!!!!"
    $redis_server_exec $redis_conf &
  fi
  done
}


#activeMQ 启动
#说明:
#ps -ef : 显示当前所有在运行的进程知
#|:管道,即其前面命令道的的输出回,作为后面命令的输入
#grep service_name :  在输出信息中,查找 service_name 数据行
#egrep -v grep:不显示 grep 查找命令本身,并把结果重定向到都定向到空设备丢弃。
function activeMQStart(){
  serviceName=activemq
  if ps -ef | grep $serviceName | egrep -v grep >/dev/null
  then
    echo "ActiveMQ 服务已经启动,无需再进行操作,$time  !!!!!!!!!!!!!!!"
  else
    #ActiveMQ 启动的目录
    activeMQ_home=/usr/local/apache-activemq-5.15.12/bin/activemq
    echo "activeMQ 服务开始启动   $time  !!!!!!!!!!!!!!!"
    $activeMQ_home start &
  fi  
}


#nginx 启动
function nginxStart(){
  serviceName=nginx
  if ps -ef | grep $serviceName | egrep -v grep >/dev/null
  then
    echo "nginx 服务已经启动,无需再进行操作,$time  !!!!!!!!!!!!!!!"
  else
    #nginx 启动的目录
    nginx_server_exec=/usr/local/nginx/sbin/nginx
    echo "nginx 服务开始启动   $time  !!!!!!!!!!!!!!!"
    $nginx_server_exec
  fi  
}


#tomcat 服务启动
function tomcatStart(){
  serviceName=apache-tomcat-9.0.34   

  if ps -ef | grep $serviceName | egrep -v grep >/dev/null
  then
    echo "tomcat 服务已经启动,无需再进行操作,$time  !
                        
作者正在撰写中...
隐藏内容 支付可见
内容互动
写评论
加载更多
评论文章
¥2.99 购买
× 订阅 Java 精选频道
¥ 元/月
订阅即可免费阅读所有精选内容