问题背景
在之前这个场景中 调用钉钉机器人API接口将堡垒机安全运维告警单发给运维人员
监控/var/log/graylog-server/server.log文件,当触发了告警时/var/log/graylog-server/server.log中会出现[LoggingAlert] POST-BODY的日志
监控脚本会自动提取POST-BODY后的内容输出到/tmp/message.json,然后调send_dingtalk_robot函数自动发送告警到用户
当时是后台运行这个shell脚本
nohup ./monitor_alertjson_sendtodingdingrobot.sh > monitor_alertjson_sendtodingdingrobot.log 2>&1 &
但是发现这个shell脚本在后台运行一段时间后,会发现这个脚本在后台不再运行,异常退出了
排查过程
由于不太好排查,可能是/var/log/graylog-server/server.log发生了轮转,或者其他原因
(图片点击放大查看)
(图片点击放大查看)
为了避免这样的问题发生,借助chatgpt修改了脚本,再结合crontab,做了脚本优化
修改后的monitor_alertjson_sendtodingdingrobot.sh
#!/bin/bash send_dingtalk_robot(){ Token=`curl -s -X POST 'https://api.dingtalk.com/v1.0/oauth2/accessToken' -H 'Content-Type: application/json' -d '{"appKey": "dingeXXXXX","appSecret": "XXXXXXXX"}' | jq -r .accessToken` curl -s -X POST 'https://api.dingtalk.com/v1.0/robot/oToMessages/batchSend' -H 'Content-Type: application/json' -H "x-acs-dingtalk-access-token:$Token" -d@/tmp/message.json } logfile="/var/log/graylog-server/server.log" outputfile="/tmp/message.json" keyword="POST-BODY" # 检查标记文件是否存在 if [ -f "/tmp/file_monitor_running" ]; then # 如果标记文件存在,则表示上一次监控还未完成,退出脚本 echo "Monitoring is already running. Exiting..." exit 0 fi # 创建标记文件 touch /tmp/file_monitor_running # 实时监控日志文件 tail -n 0 -F "$logfile" | while read -r line; do if [[ $line == *"$keyword"* ]]; then # 提取关键字后面的内容 content=$(echo "$line" | awk -F"$keyword" '{print $2}') # 存储到文件 echo "$content" > "$outputfile" echo "------------------Alert Start--------------------------------------" echo "已提取并保存内容到 $outputfile" echo "告警产生时间如下" echo `date "+%Y-%m-%d %H:%M:%S"` echo "告警内容如下" echo `cat $outputfile` send_dingtalk_robot echo "已发送钉钉机器人" echo "------------------Alert Finished-----------------------------------" fi done # 删除标记文件 rm -rf /tmp/file_monitor_running
结合crontab
crontab -e */5 * * * * /etc/graylog/server/monitor_alertjson_sendtodingdingrobot.sh >> /etc/graylog/server/monitor_alertjson_sendtodingdingrobot.log
(图片点击放大查看)
查看脚本后台运行状态
ps -faux
(图片点击放大查看)
Tips: 脚本中的appKey": "dingeXXXXX","appSecret": "XXXXXXXX"请自行替换
告警效果
(图片点击放大查看)
Tips:Linux文件创建时间的问题
在解决这个问题的过程想去确认 /var/log/graylog-server/server.log的文件的创建时间
但发现stat /var/log/graylog-server/server.log命令中无Birth信息
(图片点击放大查看)
这个问题引申出来Linux文件创建时间的问题
通过搜索相关知识,最终针对xfs ext4不同的文件系统,编写了一个shell脚本,来获取某个文件的创建时间. xfs ext4类型的文件系统均支持
vim get_file_creation_time.sh 脚本如下 #!/bin/bash file="$1" # 文件名作为参数传递给脚本 # 获取文件所在文件系统类型 filesystem=$(df --output=fstype "$file" | tail -n 1) if [ "$filesystem" == "xfs" ]; then # XFS 文件系统 inode=$(ls -i "$file" | awk '{print $1}') dfinfo=$(df --output=source "$file" | tail -n 1) if [ -z "$inode" ]; then echo "文件不存在或无法访问" exit 1 fi crtime=$(xfs_db -r -c "inode $inode" -c "p v3.crtime.sec" "$dfinfo") if [ -z "$crtime" ]; then echo "无法获取文件的创建时间" else echo "$file 文件的创建时间: $crtime" fi elif [ "$filesystem" == "ext4" ]; then # ext4 文件系统 inode=$(ls -i "$file" | awk '{print $1}') dfinfo=$(df --output=source "$file" | tail -n 1) if [ -z "$inode" ]; then echo "文件不存在或无法访问" exit 1 fi crtime=$(debugfs -R "stat <$inode>" "$dfinfo" 2>/dev/null | grep crtime | awk '{print $4,$5,$6, $7, $8}') if [ -z "$crtime" ]; then echo "无法获取文件的创建时间" else echo "$file 文件的创建时间: $crtime" fi else echo "不支持的文件系统类型: $filesystem" fi
脚本效果如下
- xfs 文件系统下
(图片点击放大查看)
- ext4文件系统下
(图片点击放大查看)