
У меня есть следующий скрипт ведения журнала:
#!/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 работал нормально из командной строки, но вывод 'top' обрезался до 80 символов при запуске из cron.
Сначала я попробовал принятое здесь решение, установив переменную окружения COLUMNS. Я не смог заставить это работать (SLES 12.1). Я даже пытался записать в файл, экспортировать, исходный пользовательский профиль.
Что сработало, так это использование опции -w в top.
Вот внутренности моего скрипта, за исключением уведомлений и убивающих штуковин безопасности.
#!/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