繁体   English   中英

Linux `mpstat` 无法从 crontab 脚本中按预期工作

[英]Linux `mpstat` doesn't work as expected from a crontab script

我有一个从 root crontab 运行的脚本:

05 * * * * /bin/bash /root/systat_kpi_tools/systat_kpi.sh

该脚本有一个mpstat输出格式,并以 CSV 格式保存在一个文件中:

[[ -e ${BASE_DIR}/cpu_stat_${NOW}.csv ]] || echo "Year,Month,Day,Hr,Min,Sec,%user,%nice,%sys,%iowait,%irq,%soft,%steal,%idle,intr/s" >> ${BASE_DIR}/cpu_stat_${NOW}.csv
mpstat | awk 'NR>3{ print substr($0, index($0,$4)) }' | awk -v dt=$(date +'%Y,%m,%d,%H,%M,%S') -v OFS=, '{$1=dt OFS $1; print}' >> ${BASE_DIR}/cpu_stat_${NOW}.csv

文件的输出:

# cat cpu_stat_160526.csv
Year,Month,Day,Hr,Min,Sec,%user,%nice,%sys,%iowait,%irq,%soft,%steal,%idle,intr/s
2016,05,26,14,05,01,0.00,2.17,0.08,0.01,0.14,0.00,90.29,1093.83
2016,05,26,15,05,02,0.00,2.19,0.08,0.01,0.14,0.00,90.25,1093.82

当我从脚本中运行命令时:

# echo "Year,Month,Day,Hr,Min,Sec,%user,%nice,%sys,%iowait,%irq,%soft,%steal,%idle,intr/s" > tmp
# mpstat | awk 'NR>3{ print substr($0, index($0,$4)) }' | awk -v dt=$(date +'%Y,%m,%d,%H,%M,%S') -v OFS=, '{$1=dt OFS $1; print}' >> tmp
# mpstat | awk 'NR>3{ print substr($0, index($0,$4)) }' | awk -v dt=$(date +'%Y,%m,%d,%H,%M,%S') -v OFS=, '{$1=dt OFS $1; print}' >> tmp
# mpstat | awk 'NR>3{ print substr($0, index($0,$4)) }' | awk -v dt=$(date +'%Y,%m,%d,%H,%M,%S') -v OFS=, '{$1=dt OFS $1; print}' >> tmp

我得到这个输出:

# cat tmp

Year,Month,Day,Hr,Min,Sec,%user,%nice,%sys,%iowait,%irq,%soft,%steal,%idle,intr/s
2016,05,26,15,04,54,7.33,0.00,2.19,0.08,0.01,0.14,0.00,90.25,1093.82
2016,05,26,15,04,57,7.33,0.00,2.19,0.08,0.01,0.14,0.00,90.25,1093.82
2016,05,26,15,04,58,7.33,0.00,2.19,0.08,0.01,0.14,0.00,90.25,1093.82

当从脚本执行同一7.33,7.33,7.33 ,请注意具有值7.33,7.33,7.33的列%user ,该列会从先前的输出中丢失。 为什么会有这种奇怪的行为?

我的 Linux 风格是RHEL5.10 64 bitskernel-2.6.18-371.el5

我知道这有点旧,但我今天刚遇到这个。 正如您所指出的,采购 .bash_profile 解决了这个问题。 在手册页中,我找到了这句话:

环境 mpstat 命令考虑了以下环境变量:

 S_TIME_FORMAT If this variable exists and its value is ISO then the current locale will be ignored when printing the date in the report header. The mpstat command will use the ISO 8601 format (YYYY-MM-DD) instead.

对我来说,主要区别是 12 小时制和 24 小时制,因此需要 awk 字段 $4、$6 和 $3、$5。

您需要使用:

mpstat 1 1

这里解释为什么: 带参数的 mpstat这只会给你 1 行,以及底部的平均值。 然后,您需要解析那一行(第 4 行)。 此外,无需解析mpstat给出的日期(或时间),您可以使用$(date +'FORMAT')获取系统的当前日期。

这是我制作的脚本,它对我有用。 如果文件不存在,它会创建一个文件,然后添加来自mpstat 1 1的结果。 我使用\\t作为分隔符; 如果您愿意,可以使用,并将文件的扩展名更改为*.csv 然后,您可以将此脚本添加到 crontab 以每 x 分钟运行一次。

#! /bin/bash
DIR=/somepath
FN=$(date +'CPU-%Y-%m.log')
FN=$DIR/$FN
if [ ! -f $FN ]
then
    touch $FN
    chmod 644 $FN
    printf "Server\tDate\t\t\t%%usr\t%%nice\t%%sys\t%%iowait\t%%irq\t%%soft\t%%steal\t%%guest\t%%gnice\t%%idle\n" > $FN
fi
DATE=$(date +'%Y-%m-%d %H:%M:%S')
SERVER="Jupyter"
STAT=$(mpstat 1 1 | awk 'NR==4{printf "%.2f\t%.2f\t%.2f\t%.2f\t%.2f\t%.2f\t%.2f\t%.2f\t%.2f\t%.2f\t", $4, $5, $6, $7, $8, $9, $10, $11, $12, $13}')
echo -e "$SERVER\t$DATE\t$STAT" >> $FN

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM