shell脚本实现文件自动清理并推送钉钉机器人告警
需求场景:
接上一篇shell脚本实现Linux磁盘空间超过阈值自动钉钉机器人告警
当磁盘空间超过阈值时,这时需要人为去清理一些不需要的历史大日志文件,那能否做成自动化呢?
解决思路
1、在磁盘空间超过阈值时自动执行清理脚本即可
2、某台特定服务器,需要清理的历史大日志文件的目录是固定的,这时可以写文件清理脚本来实现
3、清理的文件名称、路径、大小最好能通过告警通知发送出来,所见及所知
比如需要清理一个MySQL服务器的历史binlog日志,调试修改后的最终脚本如下largesizefile_delete.sh
#!/bin/bash # 监控目录和文件名 HOSTNAME=$(hostname) HOSTIP=$(hostname -I) dir_path="/var/lib/mysql" filelists=`ls -ltrh $dir_path | grep binlog | head -n 3 | awk '{print $NF}'` # webhook 地址 webhook_url="https://oapi.dingtalk.com/robot/send?access_token=XXXX" set_payload_file(){ cat > /opt/payload_result.json << \EOF { "msgtype": "actionCard", "actionCard": { "title":"binlog日志文件清理通知", "text":" ##### 服务器<font color=#67C23A>hostname</font>(<font color=#FF0000>hostip</font> )上MySQL binlog日志文件清理通知 \n > ##### <font color=#67C23A> 【文件路径】</font> :<font color=#FF0000> template1 </font> \n > ##### <font color=#67C23A> 【文件大小】</font> :<font color=#FF0000> template2</font> \n > ##### <font color=#67C23A> 此文件已经完成清理,请知悉</font> \n " } } EOF } delete_file(){ cd $dir_path for file in $filelists; do if [[ -f "$file" ]]; then # 获取文件大小(单位:字节) file_size=$(stat -c "%s" "$file") file_size_mb=$((file_size/(1024*1024))) rm -f $file # 发送告警到 webhook 机器人 message1="$dir_path/${file}" message2="${file_size_mb} MB" set_payload_file sed -i "s^template1^$message1^g" /opt/payload_result.json sed -i "s^template2^$message2^g" /opt/payload_result.json sed -i "s^hostname^$HOSTNAME^g" /opt/payload_result.json sed -i "s^hostip^$HOSTIP^g" /opt/payload_result.json response=$(curl -sS -H "Content-Type: application/json" -X POST -d @/opt/payload_result.json "${webhook_url}") if [ $? -eq 0 ]; then echo "Alert sent successfully" else echo "Failed to send alert: ${response}" fi fi done } delete_file
模拟测试
在之前的/opt/disk_usage_check.sh 基础上
添加一行sh /opt/largesizefile_delete.sh 调用此脚本
(图片点击放大查看)
最终的效果如下
我先生成测试的几个binlog文件,模拟某个分区磁盘空间高的告警
(图片点击放大查看)
(图片点击放大查看)
sh /opt/disk_usage_check.sh进行测试
告警效果如下
(图片点击放大查看)