前言
大家好,首先感谢大家订阅本次 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 !