a saída do topo é truncada para 80 colunas quando executada pelo cron

7

Eu tenho o seguinte script de registro:

#!/bin/bash
top -b -c -n 1 >> /var/log/toplog/top.log

E o seguinte registro no meu crontab:

*/1 * * * *     /home/clime/scripts/toplog.sh

O problema é que as linhas no top.log estão sendo cortadas para 80 caracteres, por exemplo:

 1512 root      20   0 80756 1436  572 S  0.0  0.1   0:05.92 /usr/libexec/postfi

Isso não acontece se eu executar o comando diretamente do console.

Eu tentei usar a variável COLUMNS:

*/1 * * * *     COLUMNS=999 /home/clime/scripts/toplog.sh

Mas isso leva a que cada linha seja longa, exatamente com 999 caracteres - o espaço não utilizado é preenchido com espaços, o que não é o que eu quero.

Como consertar esse problema estranho? Meu sistema é centos 6.3.

    
por clime 13.10.2013 / 19:58

2 respostas

6

top sempre exibe espaços até a última coluna da tela. Você simplesmente não percebe quando está imprimindo no terminal porque não consegue distinguir visualmente uma linha com espaços à direita de uma linha sem espaço à direita. Você notará os espaços se copiar e colar com o mouse ou em screen .

Se você quiser se livrar dos espaços, basta filtrá-los.

COLUMNS=9999 top -b -c -n 1 | sed 's/  *$//' >>/var/log/toplog/top.log

Não importa o que você esteja executando top , provavelmente existem ferramentas de monitoramento muito melhores disponíveis.

    
por 14.10.2013 / 01:40
0

Eu tive um problema parecido. O script Bash funcionou bem na linha de comando, mas a saída 'top' foi dividida em 80 caracteres quando executada do cron.

Primeiramente, tentei a solução aceita aqui, definindo a variável de ambiente COLUMNS. Eu não consegui fazer isso funcionar (SLES 12.1). Eu até tentei gravar em um arquivo, exportação, perfil personalizado de origem.

O que funcionou foi usar a opção -w do top.
Aqui está a coragem do meu script, menos a notificação e matando coisas de segurança.

#!/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
    
por 09.01.2017 / 19:19

Tags