如何监视服务并自动通知?

Bash

1 前言

一个问题,一篇文章,一出故事。
最近笔者希望通过脚本实现监视服务并在服务异常是使用两种方式通知管理员,于是创建本章节。

2 最佳实践

2.1 创建脚本

vim ~/scripts/checkService.sh

加入如下配置,

#!/bin/bash

# 配置变量
serverName="rproxy03"  # 替换为要检查的服务器名称
serviceName="nginx php-fpm"  # 替换为要检查的服务名称列表
adminEmail="will@cmdschool.org jeff@cmdschool.org"  # 替换为接收通知的邮箱列表
mailFrom="no_reply_admin@cmdschool.org"
smtpSer="smtp.cmdschool.org"
smtpPort="25"
mailTool="mail" #选项: "s-nail" or "mail"
comChatAppID="10086"
comChatAppPassword="*********"
comChatEmployeeID="will,jeff"
comChatApiURL="https://tigase.cmdschool.org:8092/tigase/pushText"
logFile="/var/log/serviceCheck.log"

# 函数:检查服务状态
checkServiceStatus() {
    local serviceName=$1
    systemctl is-active --quiet "$serviceName"
    return $?  # 返回服务状态
}

# 函数:发送 Tigase 通知
sendComChatNotification() {
    local serverName=$1
    local serviceName=$2
    local messageBody="$serverName: $serviceName is down.%0d%0aEvent date:$(date +'%Y.%m.%d')"
    local curlData="appId=$comChatAppID&password=$comChatAppPassword&employee_id=$comChatEmployeeID&body=$messageBody"
    curl -X POST -d "$curlData" "$comChatApiURL" &> /dev/null
}

# 函数:发送邮件通知
sendEmailNotification() {
    local serverName=$1
    local serviceName=$2
    local subject="Service Alert: $serverName $serviceName is down"
    local message="The service $serviceName is not running. Please check the system."

    for mailTo in $adminEmail; do
        if [ "$mailTool" == "s-nail" ]; then
        	echo "$message" | s-nail -s "$subject" -r "$mailFrom" -S "mta=smtp://$smtpSer:$smtpPort" "$mailTo";
        elif [ "$mailTool" == "mail" ]; then
        	echo "$message" | mail -s "$subject" -r "$mailFrom" -S "smtp=smtp://$smtpSer:$smtpPort" "$mailTo";
        else
                echo "Invalid mail tool specified."
                exit 1
        fi
    done
}

# 函数:记录日志
logMessage() {
    local message="$1"
    echo "$(date +'%Y-%m-%d %H:%M:%S') $message" | tee -a "$logFile"
}

# 主程序
main() {
    for service in $serviceName; do
        if ! checkServiceStatus "$serviceName"; then
            echo "Service $serviceName is down. Sending notifications."
            sendEmailNotification "$serverName" "$serviceName"
            sendComChatNotification "$serverName" "$serviceName"
            logMessage "$serviceName is down. Notifications sent."
        else
            echo "Service $serviceName is running."
        fi
    done
}

# 执行主程序
main

2.2 测试脚本

bash ~/scripts/checkService.sh

2.3 创建脚本触发

crontab -e

加入如下配置,

*/5 * * * * bash ~/scripts/checkService.sh
没有评论

发表回复

Bash
如何用Base Shell控制服务启动与停止?

1 前言 一个问题,一篇文章,一出故事。 某些场景,我们使用简单的命令去停止或者启动服务,会遇到出错 …

Bash
如何Telnet自动登录路由器执行命令?

1 前言 一个问题,一篇文章,一出故事。 最近在笔者需要一个脚本自动从路由读取一些信息,因此整理本章 …

Bash
如何防止Base Shell脚本重复执行?

1 前言 一个问题,一篇文章,一出故事。 笔者最近发现脚本因为重复执行而损耗服务器性能,因此解决此问 …