如何为Bash追加写入脚本添加超100行自动新建序列文件功能
Bash 系统监控脚本自动切分日志实现
你可以通过在写入日志前判断当前最新日志文件的行数,实现自动按序号切分文件的需求,完整修改后的脚本如下:
#!/bin/bash # 日志存储目录 LOG_DIR="/home/neerajR" # 单文件最大行数 MAX_LINES=100 # 获取所有已存在的trail日志文件,按序号升序排序取最新的一个 current_log=$(ls -v ${LOG_DIR}/trail*.out 2>/dev/null | tail -n 1) # 无任何日志文件时初始化第一个日志文件 if [ -z "$current_log" ]; then current_log="${LOG_DIR}/trail.out" else # 统计当前最新日志的行数,超过阈值则生成新文件 line_count=$(wc -l < "$current_log") if [ $line_count -ge $MAX_LINES ]; then # 正则提取当前日志的序号,无序号默认从1开始生成 if [[ $current_log =~ trail([0-9]+)\.out ]]; then next_num=$(( ${BASH_REMATCH[1]} + 1 )) else next_num=1 fi current_log="${LOG_DIR}/trail${next_num}.out" fi fi # 原有监控数据采集逻辑 HOME_DISK=$(df --output=avail /home | awk 'FNR == 2 {print}') VAR_DISK=$(df --output=avail /var | awk 'FNR == 2 {print}') TOTAL_MEM=$(grep MemTotal /proc/meminfo | awk '{print $2}') DATE=$(date "+%Y-%m-%d %H:%M:") # 注:原脚本未定义CPU_USAGE变量,可补充top/sar相关采集逻辑后使用 # CPU采集示例:CPU_USAGE=$(top -bn1 | grep 'Cpu(s)' | sed 's/.*, *\([0-9.]*\)%* id.*/\1/' | awk '{print 100 - $1}') CPU_USAGE="$DATE CPU: $CPU_USAGE" # 写入到最终确认的日志文件 echo "$HOME_DISK, $VAR_DISK, $TOTAL_MEM" >> "$current_log"
关键逻辑说明
- 用
ls -v对日志文件按自然序号排序,可避免出现trail10.out排在trail2.out前面的排序异常问题 - 正则匹配自动识别当前最新日志的序号,首次切分时自动从1开始编号
- 每次写入前先判断行数阈值,满足条件自动生成下一个序号的新日志文件
内容的提问来源于stack exchange,提问作者Neeraj Rana
相关产品推荐
相关产品推荐

