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

相關內容