因为分布式系统的流行,服务器上面部署的项目都是多实例的。而我又但愿有一个功能,当服务器出现异常状况可以自动重启实例。linux
因此我想到了使用shell脚本监控实例进程id,若是不存在的话,就重启对应的实例。shell
1、轮询监控实现:服务器
1. 使用crontab,缺点一分钟轮询一次app
2. 使用shell死循环进行轮询分布式
参考:https://blog.csdn.net/u011261430/article/details/72921991spa
因为咱们系统使用人数比较少,因此我选择crontab进行轮询.net
2、环境变量问题:rest
crontab中的环境变量默认不会将咱们自行定义的环境变量载入进来,因此执行脚本的时候,须要执行source命令日志
source /etc/profile
3、日志输出code
对于轮询失败的次数和时间须要进行统计,保证可以查询到,因此咱们要将日志重定向到一个固定的目录,定时清理
*/1 * * * * /app/crontab/monitor.sh >> /app/crontab/kafka.log
4、代码实例:
crontab -e:将对应日志写入到文件中,方便后期查询失败的状况
*/1 * * * * /app/crontab/monitor.sh >> /app/crontab/kafka.log
文件目录结构:
├── app │ ├── crontab │ ├── kafka.log │ ├── monitor.sh
monitor.sh
记得必须先赋权
chmod 777 monitor.sh
具体代码
#!/bin/sh
# 默认shell执行须要的内容
# 环境变量从新生效 source /etc/profile
# 判断进程是否存在,记得使用grep -v 排除gerp进程 retDesc=`ps -ef | grep "kafka.Kafka /app/kafka/config/server.properties" | grep -v grep` retCode=$? # 判断是否不为0,不为0就从新启动服务器,为0就说明服务器存在
if [ ${retCode} -ne 0 ]; then # invoke aliyun mobile push sms echo $(date +%F%n%T) echo "server down restart..." /app/kafka/bin/kafka-server-start.sh -daemon /app/kafka/config/server.properties >> /dev/null 2>&1 else echo "server on" fi
5、其余
linux中若是须要显示树形目录结构,安装tree库便可
cron日志:tailf /var/log/cron
linux中的标准输入和输出,也就是控制台的输入和输出:https://blog.csdn.net/cjfeii/article/details/10084343
linux中有一个输入时空设备/dev/null 输出到这边的东西是不会占用内存的 > 新文件 >> 附加 2>&1 程序输出和错误输出都走这个输出
赋权命令:chmod 777 *.sh
linux快熟清空文件的三种方法:
echo "" > test.txt(文件大小被截为1字节) > test.txt(文件大小被截为0字节) cat/dev/null > test.txt(文件大小被截为0字节)
路径问题:最好脚本中都使用全路径,避免路径引起的问题。