Вывод top обрезается до 80 столбцов при запуске cron

Вывод top обрезается до 80 столбцов при запуске cron

У меня есть следующий скрипт ведения журнала:

#!/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

Связанный контент