cron 运行时 top 的输出被截断为 80 列

cron 运行时 top 的输出被截断为 80 列

我有以下日志记录脚本:

#!/bin/bash
top -b -c -n 1 >> /var/log/toplog/top.log

我的 crontab 中记录如下:

*/1 * * * *     /home/clime/scripts/toplog.sh

问题是 top.log 中的行被削减为 80 个字符,例如:

 1512 root      20   0 80756 1436  572 S  0.0  0.1   0:05.92 /usr/libexec/postfi

如果我直接从控制台运行命令,则不会发生这种情况。

我尝试使用 COLUMNS 变量:

*/1 * * * *     COLUMNS=999 /home/clime/scripts/toplog.sh

但这导致每行都长 999 个字符 - 未使用的空间用空格填充,这不是我想要的。

如何解决这个奇怪的问题?我的系统是centos 6.3。

答案1

top始终显示空格,直到最后一个屏幕列。当它打印到终端时,您只是没有意识到这一点,因为您无法在视觉上区分带有尾随空格的行和没有尾随空格的行。如果您使用鼠标复制粘贴或在screen.

如果你想去掉空格,只需将它们过滤掉即可。

COLUMNS=9999 top -b -c -n 1 | sed 's/  *$//' >>/var/log/toplog/top.log

无论你为了什么而跑步top,可能都有更好的选择监控可用的工具。

答案2

我有一个类似的问题。 Bash 脚本在命令行中运行良好,但从 cron 运行时,“顶部”输出被截断为 80 个字符。

我首先通过设置 COLUMNS 环境变量在这里尝试了接受的解决方案。我无法让它工作(SLES 12.1)。我什至尝试写入文件、导出、源自定义配置文件。

有效的是使用 top 的 -w 选项。
这是我的脚本的核心内容,减去通知和终止安全内容。

#!/usr/bin/sh

PROC_FOUND=""
MAX_CPU=0

RETVAL="$(top -bc -n 1 -w 512 | tail -n+8 | awk -v cpulimit=$MAX_CPU '{if ($9>=cpulimit) print $1 " " $9 " " $12; }')"

IFS='
'
set -f
for line in ${RETVAL}; do
{
        echo "found [$line]" > /dev/tty

        IFS=', '
        read -r -a array <<< "$line"
        #echo "array is ... ${array[*]}"
        PID_VAL=${array[0]}
        CPU_VAL=${array[1]}
        PROC_FOUND=${array[2]}

        echo "Monitored a High CPU for process [${PROC_FOUND} ${PID_VAL}] on "${HOSTNAME}" where ${CPU_VAL}% >= ${MAX_CPU}%."
}
done
set +f
unset IFS
exit

相关内容