如何监视代码更新并自动重启?

Bash

1 前言

一个问题,一篇文章,一出故事。
众多的服务器频繁代码更新会占用运维大量的时间,于是笔者想到监视代码的更新并自动重启服务。于是整理此文。

2 最佳实践

2.1 创建脚本目录

mkdir ~/scripts

2.2 创建脚本

vim ~/scripts/autoRestart.sh

加入如下配置,

#!/bin/bash

monitorFiles="/usr/api/api.jar /etc/api/application-prod.properties"
monitorLog="/var/log/autoRestart.log"
monitorDate=`date +"%Y-%m-%d %H:%M:%S"`
serviceList="api.service nginx.service"

if [ ! -f "$monitorLog" ]; then
	touch "$monitorLog"
fi
if [ ! -f "$monitorLog" ]; then
	echo "$monitorDate"' Failed to create log file!'
	exit 1
fi

for i in $serviceList; do
	if [ "$i" == "" ]; then
		echo "$monitorDate"' Service name cannot be empty!' | tee -a "$monitorLog"
		continue
	fi
	checkServer="0"
	checkServer=`/usr/bin/systemctl status "$i" | grep "Active:" | grep "running" | wc -l`
	if [ "$checkServer" != "1" ]; then
		echo "$monitorDate"' Service non-running, this script restarts service!' | tee -a "$monitorLog"
		echo "$monitorDate"' Restarting Service '"$i" | tee -a "$monitorLog"
		/usr/bin/systemctl restart "$i"	
	fi
done

oldFileMd5=""
newFileMd5=""
restartMark="0"
for i in $monitorFiles; do
	if [ "`grep "$i" "$monitorLog" | wc -l`" != "0" ]; then
		oldFileMd5=`grep "$i" "$monitorLog" | cut -d" " -f3 | tail -n 1`
	else
		echo "$monitorDate"' '`md5sum "$i"` >> $monitorLog
	fi
	newFileMd5=`md5sum "$i" | cut -d" " -f1`

	if [ "$oldFileMd5" == "" -o "$newFileMd5" == "" ]; then
		echo "$monitorDate"' Get md5 exception!' | tee -a "$monitorLog"
		exit 1
	fi
	if [ "$oldFileMd5" != "$newFileMd5" ]; then
		echo "$monitorDate"' '`md5sum "$i"` >> $monitorLog
		restartMark="1"
	fi
done

if [ "$restartMark" == "1" ]; then
	echo "$monitorDate"' Program update, this script restarts service!' | tee -a "$monitorLog"
	for i in $serviceList; do
		if [ "$i" == "" ]; then
			echo "$monitorDate"' Service name cannot be empty!' | tee -a "$monitorLog"
			continue
		fi
		echo "$monitorDate"' Restarting Service '"$i" | tee -a "$monitorLog"
		/usr/bin/systemctl restart "$i"	
	done
fi

需要注意的是,
– 参数“monitorFiles”声明需要监视可能更新的代码文件(多个文件请使用空格分隔)
– 参数“monitorLog”声明脚本运行日志路径
– 参数“serviceList”声明需要重启的服务列表(多个服务请使用空格分隔)

2.3 设置脚本触发

crontab -e

加入如下设置,

*/5 * * * * sh ~/scripts/autoRestart.sh
没有评论

发表评论

Bash
如何命令查找docker集群实例关键字?

1 前言 一个问题,一篇文章,一出故事。 笔者定位某个IP地址在集群中的位置,于是笔者想到使用循环去 …

Bash
如何使用计划任务操作容器?

1 前言 一个问题,一篇文章,一出故事。 笔者今天需要根据一定的条件删除容器里面的过期文件,但由于容 …

Bash
如何实现主从存储目录镜像?

1 理论部分 1.1 工具的介绍 Inotify一种强大的、细粒度的、异步文件系统监控机制,它满足各 …