#!/bin/bash
# 定义文件路径变量
LOG_FILE="base_sha512.log"
SHA512_FILE="base_sha512.txt"
# 应用映射表
declare -A apps_map=(
[a.war]="/app/app1"
[b.war]="/app/app2"
)
# 遍历应用映射表
for key in "${!apps_map[@]}"; do
value=${apps_map[$key]}
# 检查目录是否存在
if [ ! -d "$value" ]; then
echo "目录不存在:$value" >> "$LOG_FILE"
continue
fi
# 检查 war 文件是否存在
if [ ! -f "$value/$key" ]; then
echo "war文件不存在:$value/$key" >> "$LOG_FILE"
continue
fi
# 记录开始处理时间
echo "$(date '+%Y%m%d%H%M%S') 开始处理:$key" >> "$LOG_FILE"
# 计算 sha512 值
sha512_result=$(sha512sum "$value/$key")
if [ $? -ne 0 ]; then
echo "计算 sha512 失败:$value/$key" >> "$LOG_FILE"
continue
fi
# 记录 sha512 结果
echo "$sha512_result" > "$SHA512_FILE"
# 记录处理完成时间
echo "$(date '+%Y%m%d%H%M%S') 处理完毕:$key" >> "$LOG_FILE"
done
# 处理 sha512 文件
sort "$SHA512_FILE" | uniq > base_sha512_unique.txt
#!/bin/bash
run_script_dir=$(dirname "${BASH_SOURCE[0]}")
monitor_ip=$(hostname -I)
ACCESS_TOKEN="${DINGTALK_ACCESS_TOKEN:-012345678901234567890123456789012345678901234567890123456789}"
URL="${DINGTALK_URL:-http://xxxx/robot/send}"
function send_dingtalk_notification() {
local keyword="$1"
local content="$2"
local access_token="$3"
local url="$4"
local msg="{\"msgtype\": \"text\", \"text\": {\"content\": \"$content\"}}"
if ! curl -X POST -H "Content-Type: application/json" -d "$msg" "$url?access_token=$access_token"; then
echo "发送钉钉通知失败"
logger "发送钉钉通知失败: $msg"
fi
}
while read baseline
do
base_sha512_value=$(echo $baseline | cut -d ' ' -f 1)
base_sha512_app=$(echo $baseline | cut -d ' ' -f 2)
if [ ! -f "$base_sha512_app" ]; then
echo "war文件不存在:$base_sha512_app"
continue
fi
# 验证路径格式
if [[ ! $base_sha512_app =~ ^.*\/.*\/.*\/.*$ ]]; then
echo "无效的应用路径:$base_sha512_app"
continue
fi
app_key=$(echo ${base_sha512_app}| cut -d '/' -f4)
sha512sum_value=$(echo $(sha512sum $base_sha512_app)| cut -d ' ' -f 1)
if [ $sha512sum_value != $base_sha512_value ];then
echo '$base_sha512_app is changed'
DINGTALK_KEYWORD="生产报警:"
CONTENTMSG="服务器状态告警【文件被修改】-请立即确认。详情【${monitor_ip}-${base_sha512_app}】"
send_dingtalk_notification "${DINGTALK_KEYWORD}\n${CONTENTMSG}" "$CONTENTMSG" "$ACCESS_TOKEN" "$URL"
# 使用SIGTERM优雅地终止进程
pid=$(ps aux | grep ${app_key} | grep -v grep | cut -d ' ' -f2)
if [ -n "$pid" ]; then
kill -SIGTERM $pid
fi
fi
done < ${run_script_dir}/base_sha512_unique.txt
* * * * * sh 绝对路径/runbycrontab_monitor_baseline.sh >> 绝对路径/crontab_jobs/runbycrontab_monitor_baseline.log 2>&1 &