【问题标题】:Linux `mpstat` doesn't work as expected from a crontab scriptLinux `mpstat` 无法从 crontab 脚本中按预期工作
【发布时间】:2020-05-12 17:49:32
【问题描述】:

我有一个从根 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

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

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

【问题讨论】:

  • 在脚本中采购.bash_profile 就可以了。现在丢失的文件出现了。不确定为什么会有这种行为?保持问题仍然开放以进行一些解释。
  • mpstat 表示要报告自系统启动(引导)以来的处理器统计信息。这就是为什么你总是得到 7.3。在终端上运行,间隔像这样 mpstat 1 然后你会得到不同的值。

标签: linux bash crontab


【解决方案1】:

我知道这有点旧,但我今天才遇到这个。正如您所指出的,采购 .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。

【讨论】:

    【解决方案2】:

    你需要使用:

    mpstat 1 1
    

    这里解释为什么:mpstat with parameters 这将只给你 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
    

    【讨论】:

      猜你喜欢
      • 2021-11-03
      • 1970-01-01
      • 2021-12-20
      • 1970-01-01
      • 2016-02-21
      • 2013-09-30
      • 2013-11-25
      • 2015-06-26
      相关资源
      最近更新 更多