
我有以下日誌記錄腳本:
#!/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