由于,自己开发应用程序部署后,是不是有异常,需要及时收到通知。本文介绍如何使用 Shell 编写一个监控脚本,用于监控程序的运行状态,并在程序异常时发送通知钉钉或者邮件。
暂时没有使用 mail,mail 需要安装配置才能使用。而且,有好多 mail 工具,等选好使用后在补充。
# 监控端口脚本
#!/bin/bash | |
# 钉钉 Webhook URL | |
DINGTALK_WEBHOOK="https://oapi.dingtalk.com/robot/send?access_token=your_access_token" | |
# 邮件配置 | |
#MAIL_TO="[email protected]" # 收件人的邮箱地址 | |
#MAIL_FROM="[email protected]" # 发件人的邮箱地址 | |
#MAIL_SUBJECT="Gin Application Port Alert" | |
#MAIL_BODY="Gin application port 8080 is not available. Please check the server." | |
# 检查的端口 | |
PORT=8080 | |
HOST=localhost | |
# 状态文件 | |
STATUS_FILE="/tmp/port_status" | |
# 发送钉钉通知 | |
send_dingtalk_alert() { | |
curl -s -X POST "$DINGTALK_WEBHOOK" \ | |
-H "Content-Type: application/json" \ | |
-d "{\"msgtype\": \"text\", \"text\": {\"content\": \"Gin application port $PORT is not available. Please check the server.\"}}" | |
} | |
# 发送邮件通知 | |
#send_email_alert() { | |
# echo "$MAIL_BODY" | mail -s "$MAIL_SUBJECT" "$MAIL_TO" #发送一封简单的邮件 | |
# # echo "This is the email body" | mail -r "MAIL_FROM" -s "$MAIL_SUBJECT" "$MAIL_TO" #可以使用 -r 选项指定发件人 | |
#} | |
# 发送警报 | |
send_alert() { | |
send_dingtalk_alert | |
# send_email_alert | |
} | |
# 检查端口状态 | |
check_port() { | |
timeout 5 telnet $HOST $PORT </dev/null 2>&1 | grep -q 'Connected' | |
return $? | |
} | |
# 主函数 | |
main() { | |
if [ ! -f "$STATUS_FILE" ]; then | |
echo "UP" > "$STATUS_FILE" | |
fi | |
check_port | |
CURRENT_STATUS=$? | |
LAST_STATUS=$(cat "$STATUS_FILE") | |
if [ $CURRENT_STATUS -ne 0 ] && [ "$LAST_STATUS" == "UP" ]; then | |
# 端口变为不可用 | |
send_alert | |
echo "DOWN" > "$STATUS_FILE" | |
elif [ $CURRENT_STATUS -eq 0 ] && [ "$LAST_STATUS" == "DOWN" ]; then | |
# 端口恢复可用 | |
echo "UP" > "$STATUS_FILE" | |
fi | |
} | |
main |
# 监控应用进程脚本
#!/bin/bash | |
# 钉钉 Webhook URL | |
DINGTALK_WEBHOOK="https://oapi.dingtalk.com/robot/send?access_token=your_access_token" | |
# 邮件配置 | |
#MAIL_TO="[email protected]" # 收件人的邮箱地址 | |
#MAIL_FROM="[email protected]" # 发件人的邮箱地址 | |
#MAIL_SUBJECT="Gin Application Alert" | |
#MAIL_BODY="Gin application process is not running. Please check the server." | |
# 应用程序名称(如 gin-app) | |
APP_NAME="gin-app" | |
# 发送钉钉通知 | |
send_dingtalk_alert() { | |
curl -s -X POST "$DINGTALK_WEBHOOK" \ | |
-H "Content-Type: application/json" \ | |
-d "{\"msgtype\": \"text\", \"text\": {\"content\": \"Gin application process is not running. Please check the server.\"}}" | |
} | |
# 发送邮件通知 | |
#send_email_alert() { | |
# echo "$MAIL_BODY" | mail -s "$MAIL_SUBJECT" "$MAIL_TO" #发送一封简单的邮件 | |
# # echo "This is the email body" | mail -r "MAIL_FROM" -s "$MAIL_SUBJECT" "$MAIL_TO" #可以使用 -r 选项指定发件人 | |
#} | |
# 发送警报 | |
send_alert() { | |
send_dingtalk_alert | |
# send_email_alert | |
} | |
# 检查进程状态 | |
check_process() { | |
pgrep -f "$APP_NAME" > /dev/null 2>&1 | |
return $? | |
} | |
# 主函数 | |
main() { | |
if [ ! -f "$STATUS_FILE" ]; then | |
echo "UP" > "$STATUS_FILE" | |
fi | |
check_process | |
CURRENT_STATUS=$? | |
LAST_STATUS=$(cat "$STATUS_FILE") | |
if [ $CURRENT_STATUS -ne 0 ] && [ "$LAST_STATUS" == "UP" ]; then | |
# 进程变为不可用,发送警报并更新状态文件 | |
send_alert | |
echo "DOWN" > "$STATUS_FILE" | |
elif [ $CURRENT_STATUS -eq 0 ] && [ "$LAST_STATUS" == "DOWN" ]; then | |
# 进程恢复可用,更新状态文件 | |
echo "UP" > "$STATUS_FILE" | |
fi | |
} | |
main |
# 定时运行脚本
使用 cron 定时任务来定期运行这个脚本。更多命令请阅读博文 Linux 命令大全
- 编辑
crontab文件 命令crontab -e - 添加以下行来每分钟运行一次脚本
* * * * * /path/to/your/script/SCRIPT_NAME.sh
过去无法挽回,未来可以改变,有的人成日殚精竭虑,却掀不起什么风浪,有的人却因一念之差,让世界天翻地覆,这就是命运权重。