
次のログ スクリプトがあります。
#!/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