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 から実行すると「top」出力が 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

関連情報