基于 Bash 脚本的系统信息定时收集方案

一、引言

在系统运维和监控工作中,及时且全面地收集系统信息至关重要。通过对系统信息的分析,我们可以了解系统的运行状态、资源使用情况等,以便及时发现潜在问题并采取相应措施。本文将详细介绍一个基于 Bash 脚本实现的系统信息定时收集方案,该方案能够收集多种系统信息并将其存储在指定目录,同时通过 cron 实现定时执行。

二、脚本功能概

此脚本具备以下主要功能:

  1. 用户权限检查 :保证脚本以 root 用户身份运行,避免因权限不足导致部分功能无法正常执行。
  2. 日志目录创建:创建用于存储系统信息日志的目录,若目录已存在则给出提示。
  3. 信息收集脚本生成:生成一个用于收集系统信息的脚本,并赋予其可执行权限。
  4. 系统信息收集 :收集包括 top 信息(CPU 和内存使用率最高的进程)、slabtop 信息、电源模式、dbus 连接数量、xclients 连接数和屏幕刷新率等多种系统信息。
  5. 日志清理:定期清理旧的日志文件,以节省磁盘空间。
  6. 定时任务设置 :将信息收集任务添加到 cron 中,实现每分钟执行一次信息收集。

三、脚本代码详细解析

1. 用户权限检查

bash 复制代码
user=`whoami`
if [ $user != "root" ] ; then
    echo "执行失败,请切换root用户执行!"
    exit 1
fi

借助 whoami 命令获取当前用户,若不是 root 用户,输出错误信息并退出脚本。这一步骤能确保脚本后续操作具备足够的权限。

2. 日志保存目录创建

bash 复制代码
info_collect_path=/opt/info_collect
if [ ! -d "$info_collect_path" ]; then
    mkdir -p $info_collect_path
else
    echo "$info_collect_path 日志搜集目录已存在,无需再次创建!"
fi

设定日志保存目录为 /opt/info_collect,若该目录不存在就创建,若已存在则给出提示。mkdir -p 选项可确保父目录也会被创建。

3. 信息收集脚本创建与权限设置

bash 复制代码
touch ${info_collect_path}/top_info_collect.sh
chmod +x  ${info_collect_path}/top_info_collect.sh

创建 top_info_collect.sh 脚本文件并赋予可执行权限,为后续信息收集脚本的编写和执行做准备。

4. 信息收集脚本内容编写

bash 复制代码
cat  << "EOF" > ${info_collect_path}/top_info_collect.sh
...
EOF

运用 cat << "EOF" > ${info_collect_path}/top_info_collect.sh 把多行代码写入 top_info_collect.sh 文件,具体内容如下:

变量定义与目录创建

bash 复制代码
today=`date +%Y%m%d`
nowhour=`date +%Y%m%d%H`
info_collect_path=/opt/info_collect
today_info=${info_collect_path}/${today}
top_info_path=${today_info}/top_info
slabtop_info_path=${today_info}/slabtop_info
other_info_path=${today_info}/other_info

借助 date 命令获取当前日期和小时,创建按天存储信息的目录以及不同信息的存储目录,方便对日志进行分类管理。

日志文件清理

bash 复制代码
deleteday=`date +%Y%m%d --date '3 days ago'`
for i in `ls ${info_collect_path} | grep -v sh`;do 
    if [ ! $i -ge $deleteday ];then
        rm -rf ${info_collect_path}/$i
    fi
done

算出 3 天前的日期,遍历 /opt/info_collect 目录下的文件(排除 .sh 文件),删除早于该日期的目录,实现日志文件的定期清理。

bash 复制代码
times=4
sleep=$((60/$times))
while true 
do
    if [ ${times} -gt '0' ];then
        ...
        times=$((times-1))
    else
        exit
    fi
    sleep $sleep
done

每分钟收集 4 次信息,每次收集间隔为 15 秒。在每次循环中,收集不同类型的系统信息。

具体信息收集部分
  • top 信息收集
bash 复制代码
echo ""   >>  ${top_logfile}
echo ""   >>  ${top_logfile}
echo ""   >>  ${top_logfile}
echo "==================$(date +%Y-%m-%d\ %H:%M:%S)==================="  >>   ${top_logfile}
echo ""   >>  ${top_logfile}
echo "######################## CPU使用率最高的40个进程 ################## "   >>  ${top_logfile}
echo ""   >>  ${top_logfile}
COLUMNS=200 top -b -o +%CPU -n1 -c| head -n 47  >>  ${top_logfile}
echo ""   >>  ${top_logfile}
echo "######################## 内存使用率最高的40个进程 ################## "   >>  ${top_logfile}
echo ""   >>  ${top_logfile}
COLUMNS=200 top -b -o +%MEM -n1 -c| head -n 47  >>  ${top_logfile}
  • 获取 CPU 和内存使用率最高的 40 个进程信息,并添加时间戳和分隔符后保存到日志文件。

  • slabtop 信息收集

bash 复制代码
echo ""   >>  ${slabtop_logfile}
date >> ${slabtop_logfile}
slabtop -s c -o|head -n 60 >> ${slabtop_logfile}

获取 slabtop 信息并保存到日志文件。

  • 其他信息收集
    包含 CPU 频率、电源模式、dbus 连接数量、xclients 连接数和屏幕刷新率等信息,通过不同的命令获取并保存到相应的日志文件。

5. cron 任务设置

bash 复制代码
sed -i '/.\/top_info_collect.sh/d' /etc/crontab
sed -i '$a\*/1 * * * * root sh /opt/info_collect/top_info_collect.sh' /etc/crontab
if  grep -iq "info_collect" /etc/crontab;then
    echo "添加任务成功!"
else
    echo "执行失败!"
fi
```
先从 `/etc/crontab` 里删除旧的信息收集脚本任务,再添加新任务,使其每分钟执行一次信息收集脚本。最后检查任务是否添加成功并输出相应提示。

## 四、脚本优缺点分析

### 优点



1. **功能全面**:能够收集多种系统信息,为系统监控和分析提供了丰富的数据。
2. **自动化执行**:通过 `cron` 实现定时执行,减少了人工干预,提高了工作效率。
3. **日志管理**:定期清理旧的日志文件,避免了磁盘空间的过度占用。

### 缺点



1. **硬编码问题**:部分参数(如信息收集频率和日志保存周期)采用硬编码方式,不利于灵活调整。
2. **错误处理不足**:对于一些可能出现的错误(如命令执行失败、文件不存在等),缺乏完善的错误处理机制。
3. **性能问题**:在信息收集频率较高时,大量的 `echo` 操作可能会影响系统性能。

## 五、改进建议



1. **参数化配置**:将信息收集频率、日志保存周期等参数作为脚本的输入参数,提高脚本的灵活性。
2. **完善错误处理**:在关键命令执行处添加错误处理逻辑,如捕获命令执行失败的情况并输出相应的错误信息。
3. **性能优化**:使用 `printf` 或直接将信息存储在变量中,最后一次性输出,减少 `echo` 操作的次数。

## 六、结论



该基于 Bash 脚本的系统信息定时收集方案能够有效地收集多种系统信息并实现定时执行,为系统运维和监控提供了有力支持。虽然存在一些不足之处,但通过相应的改进措施,可以进一步提高脚本的灵活性、健壮性和性能。在实际应用中,可以根据具体需求对脚本进行定制和优化,以满足不同场景下的系统信息收集需求。
相关推荐
milk_yan4 分钟前
MinIO的安装与使用
linux·数据仓库·spring boot
胡耀超4 分钟前
CentOS 7.9(linux) 设置 MySQL 8.0.30 开机启动详解
linux·mysql·centos
yyytucj16 分钟前
python--列表list切分(超详细)
linux·开发语言·python
AI创世纪32 分钟前
WIN11 UEFI漏洞被发现, 可以绕过安全启动机制
网络·安全
Gemma's diary38 分钟前
Ubuntu开发中的问题
linux·运维·ubuntu
徊忆羽菲42 分钟前
Linux下php8安装phpredis扩展的方法
linux·运维·服务器
PH_modest2 小时前
【Linux跬步积累】——thread封装
linux·运维·服务器
秋说2 小时前
本地Ubuntu轻松部署高效性能监控平台SigNoz与远程使用教程
linux·运维·ubuntu
Joeysoda2 小时前
Java数据结构 (从0构建链表(LinkedList))
java·linux·开发语言·数据结构·windows·链表·1024程序员节
一个处女座的暖男程序猿2 小时前
MyBatis Plus 中常用的 Service 功能
linux·windows·mybatis