一、引言
在系统运维和监控工作中,及时且全面地收集系统信息至关重要。通过对系统信息的分析,我们可以了解系统的运行状态、资源使用情况等,以便及时发现潜在问题并采取相应措施。本文将详细介绍一个基于 Bash 脚本实现的系统信息定时收集方案,该方案能够收集多种系统信息并将其存储在指定目录,同时通过 cron
实现定时执行。
二、脚本功能概
此脚本具备以下主要功能:
- 用户权限检查 :保证脚本以
root
用户身份运行,避免因权限不足导致部分功能无法正常执行。 - 日志目录创建:创建用于存储系统信息日志的目录,若目录已存在则给出提示。
- 信息收集脚本生成:生成一个用于收集系统信息的脚本,并赋予其可执行权限。
- 系统信息收集 :收集包括
top
信息(CPU 和内存使用率最高的进程)、slabtop
信息、电源模式、dbus
连接数量、xclients
连接数和屏幕刷新率等多种系统信息。 - 日志清理:定期清理旧的日志文件,以节省磁盘空间。
- 定时任务设置 :将信息收集任务添加到
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 脚本的系统信息定时收集方案能够有效地收集多种系统信息并实现定时执行,为系统运维和监控提供了有力支持。虽然存在一些不足之处,但通过相应的改进措施,可以进一步提高脚本的灵活性、健壮性和性能。在实际应用中,可以根据具体需求对脚本进行定制和优化,以满足不同场景下的系统信息收集需求。