前言
这个脚本是 Linux 系统上的 sysstat 工具的一部分,在/etc/cron.d/sysstat这个定时任务下执行,用来收集系统性能数据
。需要配合/etc/sysconfig/sysstat这个脚本设置HISTORY的值来确定saXX文件的保存位置,如果在/etc/sysconfig/sysstat脚本中设置HISTORY的值大于28,则原文件会按照月份以目录的形式保存在/var/log/sa/目录下的子目录中,在/var/log/sa/目录下存储的是链接文件,方便sar命令查看,否则,则会以文件的形式直接存储在/var/log/sa/下,如下图:
脚本原文
#!/bin/sh
HISTORY=0
SADC_OPTIONS=""
DDIR=/var/log/sa
DATE=`date +%d`
CURRENTFILE=sa${DATE}
CURRENTDIR=`date +%Y%m`
SYSCONFIG_DIR=/etc/sysconfig
umask 0022
[ -r ${SYSCONFIG_DIR}/sysstat ] && . ${SYSCONFIG_DIR}/sysstat
if [ ${HISTORY} -gt 28 ]
then
cd ${DDIR} || exit 1
[ -d ${CURRENTDIR} ] || mkdir -p ${CURRENTDIR}
[ ! -L ${CURRENTFILE} ] &&
[ -f ${CURRENTFILE} ] &&
[ "`date +%Y%m%d -r ${CURRENTFILE}`" = "${CURRENTDIR}${DATE}" ] &&
mv -f ${CURRENTFILE} ${CURRENTDIR}/${CURRENTFILE}
touch ${CURRENTDIR}/${CURRENTFILE}
rm -f ${CURRENTFILE}
ln -s ${CURRENTDIR}/${CURRENTFILE} ${CURRENTFILE}
else
[ -f ${CURRENTFILE} ] && [ "`date +%Y%m -r ${CURRENTFILE}`" -lt "${CURRENTDIR}" ] && rm -f ${CURRENTFILE}
fi
ENDIR=/usr/lib64/sa
cd ${ENDIR}
[ "$1" = "--boot" ] && shift && BOOT=y || BOOT=n
if [ $# = 0 ] && [ "${BOOT}" = "n" ]
then
exec ${ENDIR}/sadc -F -L ${SADC_OPTIONS} 1 1 -
else
exec ${ENDIR}/sadc -F -L ${SADC_OPTIONS} $* -
fi
脚本解释
#!/bin/sh
#/usr/lib64/sa/sa1
#© 1999-2012 Sebastien Godard (sysstat orange.fr)
#
#@(#) sysstat-10.1.5
#@(#) sa1: Collect and store binary data in system activity data file(收集二进制数据并将其存储在系统活动数据文件中。
).
#
# Set default value for some variables(为某些变量设置默认值
).
# Used only if ${SYSCONFIG_DIR}/sysstat doesn’t exist!(仅在${SYSCONFIG_DIR}/sysstat不存在时使用!
)
#下面这一段是为变量赋值
HISTORY=0
SADC_OPTIONS=“”
DDIR=/var/log/sa
DATE=`date +%d`
CURRENTFILE=sa${DATE}
CURRENTDIR= `date +%Y%m`
SYSCONFIG_DIR=/etc/sysconfig
#这里设置权限掩码0022,即默认文件权限644,目录权限755
umask 0022
#如果/etc/sysconfig/sysstat可读,那么就执行这个文件(脚本),通常可以在这个文件中更改 HISTORY 和 SADC_OPTIONS 变量的值。
[ -r ${SYSCONFIG_DIR}/sysstat ] && . ${SYSCONFIG_DIR}/sysstat
#如果HISTORY的值大于28,则切换到/var/log/sa/,(如果该目录不存在或者权限不足,则返回状态码为1,退出脚本),如果date +%Y%m目录不存在,则创建此目录
if [ ${HISTORY} -gt 28 ]
then
cd ${DDIR} || exit 1
[ -d ${CURRENTDIR} ] || mkdir -p ${CURRENTDIR}
# If ${CURRENTFILE} exists and is a regular file, then make sure
# the file was modified this day (and not e.g. month ago)
# and move it to ${CURRENTDIR}
#如果sa\${DATE}是一个普通文件不是链接文件,然后确定文件的修改日期是今天,如果是,将它移动到“date +%Y%m"这个目录下
#
(date 命令的 -r 选项用于显示指定文件的最后修改时间。它接受一个文件名作为参数,并显示该文件的最后修改时间,还可以使用 date 命令的其他选项来控制输出格式。例如,date +%Y%m%d -r file1 命令会以 YYYYMMDD 的格式显示 file1 的最后修改日期)
[ ! -L ${CURRENTFILE} ] &&
[ -f ${CURRENTFILE} ] &&
[ “`date +%Y%m%d -r ${CURRENTFILE}`” =“${CURRENTDIR}${DATE}” ] &&
mv -f ${CURRENTFILE} ${CURRENTDIR}/${CURRENTFILE}
touch ${CURRENTDIR}/${CURRENTFILE}
# Remove the “compatibility” link and recreate it to point to
# the (new) current file
#删除链接文件sa${DATE} 并重新创建它 以指向(新的)当前文件
rm -f ${CURRENTFILE}
ln -s ${CURRENTDIR}/${CURRENTFILE} ${CURRENTFILE}
#否则,如果HISTORY的值小于等于28,则执行下面的代码
else
# If ${CURRENTFILE} exists, is a regular file and is from a previous
# month then delete it so that it is recreated by sadc afresh
#如果\${CURRENTFILE}(sa${DATE})存在,是一个常规文件,并且来自上个月,则删除它,以便sadc重新创建它
[ -f ${CURRENTFILE} ] && [ “`date +%Y%m -r ${CURRENTFILE}`” -lt >“${CURRENTDIR}” ] && rm -f ${CURRENTFILE}
fi
ENDIR=/usr/lib64/sa
cd ${ENDIR}
#如果第一个命令行参数为 --boot,则将 BOOT变量的值设置为 y,否则为 n,
shift 是将参数左移一个位置的命令,例如一个脚本中有 $1, $2, $3, $4 参数,shift 命令执行一次以后,$1 会被 $2 的值替换,$2 会被 $3 的值替换,以此类推。这里的 shift 命令是为了将 "--boot" 参数丢弃,以便进一步处理其他的参数。
[ “$1” = “–boot” ] && shift && BOOT=y || BOOT=n
#如果没有传递任何参数,并且 BOOT变量的值为 n,则执行下面的代码块。
if [ $# = 0 ] && [ “${BOOT}” = “n” ]
then
#注意:仅当outfile 已在命令行中指定为“-”...(当有文件轮换时),统计数据写于上一个文件结束和在一个新文件的开始时
# Note: Stats are written at the end of previous file and at the
# beginning of the new one (when there is a file rotation) only if
# outfile has been specified as ‘-’ on the command line…
#运行 \${ENDIR}sadc 命令来开始收集性能数据。参数
-F指定输出格式为二进制格式。参数
-L指定以 KB,MB 或 GB 显示输出结果。参数1 1 表示采样周期和次数,指定以 1 秒时间间隔进行数据收集1次。参数
-表示输出到标准输出
exec ${ENDIR}/sadc -F -L ${SADC_OPTIONS} 1 1 -
else
#否则,如果有命令行参数或 BOOT变量值为 y,则执行下面的代码块。
exec ${ENDIR}/sadc -F -L ${SADC_OPTIONS} $* -
#运行 \${ENDIR}sadc命令来开始收集性能数据,也指定了其他命令行参数。\${SADC_OPTIONS} 变量可以用于指定其他选项,例如
-s用于指定采样时间。
$*表示将所有命令行参数传递给
sadc命令
fi
if [ $# = 0 ] && [ "${BOOT}" = "n" ]
then
exec ${ENDIR}/sadc -F -L ${SADC_OPTIONS} 1 1 -
else
exec ${ENDIR}/sadc -F -L ${SADC_OPTIONS} $* -
在这个脚本中:
- `$#` 是指传递给脚本的参数个数,`$#` 的值为 0 表示没有传递任何参数。
- `$*` 是指传递给脚本的所有参数,作为一个单词保存。`${ENDIR}/sadc -F -L ${SADC_OPTIONS} 1 1 -`是一个参数,需要注意。
因此,这段脚本的含义是:
- 如果没有传递任何参数,并且 `${BOOT}` 的值为 "n",则执行 `${ENDIR}/sadc -F -L ${SADC_OPTIONS} 1 1 -` 命令。
- 如果传递了参数,则将这些参数传递给 `${ENDIR}/sadc -F -L ${SADC_OPTIONS}` 命令执行。
附
/etc/sysconfig/sysstat 脚本
# sysstat-10.1.5 configuration file.
# How long to keep log files (in days).
# If value is greater than 28, then log files are kept in
# multiple directories, one for each month.
#指定保留日志文件的天数。如果该值大于28,则日志文件将保存在多个目录中,HISTORY值设置为28天,即sysstat将保留过去28天的系统性能数据。每个月一个目录。
HISTORY=28
# Compress (using gzip or bzip2) sa and sar files older than (in days):
#指定压缩(使用 gzip 或 bzip2)超过指定天数的 sa 和 sar 文件
COMPRESSAFTER=31
# Parameters for the system activity data collector (see sadc manual page)
# which are used for the generation of log files.
# 指定用于生成日志文件的系统活动数据收集器(请参阅 sadc 手册页)的参数。
#SADC_OPTIONS="-S DISK" 是用于配置 sadc 工具的选项。-S DISK 选项告诉 sadc 工具
#只收集磁盘数据。这意味着 sadc 只会在系统启动时和每隔一段时间收集磁盘使用情况的
#数据,而不会收集任何其他指标的数据。
#sar -d 命令与 SADC_OPTIONS="-S DISK" 选项类似
SADC_OPTIONS="-S DISK"
# Compression program to use.
#指定要使用的压缩程序。
ZIP="bzip2"
#根据这些参数,日志文件将保留28天,超过31天的 sa 和 sar 文件将被压缩,系统活动数据收集器将使用 -S DISK 选项,压缩程序将使用 bzip2
sadc命令和sar命令的区别
sadc命令和sar命令都是用于系统性能监控的命令,但它们的作用不同:
sadc命令(System Activity Data Collector)用于收集系统活动数据,主要用于系统性能信息的统计,并将数据保存到指定文件中供sar命令使用。
sar命令(System Activity Reporter)用于报告系统活动数据,例如CPU使用率、内存使用率、磁盘空间、网络流量等,可以使用该命令实时监控服务器的性能。
因此,sadc命令和sar命令是相辅相成的,sadc用于收集监控数据,sar用于查看和分析数据。
/usr/lib64/sa/sa1和/usr/lib64/sa/sa2有什么区别
/usr/lib64/sa/sa1是sar命令生成的性能数据二进制文件,它包含的是系统实时性能数据的1分钟平均值;
/usr/lib64/sa/sa2是sa命令生成的性能数据文本文件,在一天结束后由cron运行,它包含了在24小时内按小时采集的系统性能数据,也称为日志轮转文件。
总之,/usr/lib64/sa/sa1和/usr/lib64/sa/sa2都是用来收集和分析系统性能信息的工具,只是针对不同的时间段进行采集和生成性能数据文件。