
Eu tenho o seguinte script de log:
#!/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 em top.log estão sendo reduzidas 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 faz com que cada linha tenha exatamente 999 caracteres - o espaço não utilizado é preenchido com espaços, o que não é o que eu quero.
Como corrigir esse problema estranho? Meu sistema é centos 6.3.
Responder1
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 formato 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
Seja lá o que você esteja concorrendo top
, provavelmente há opções muito melhoresmonitoramentoferramentas disponíveis.
Responder2
Eu tive um problema semelhante. O script Bash funcionou bem na linha de comando, mas a saída 'top' foi reduzida para 80 caracteres quando executada a partir do cron.
Tentei primeiro a solução aceita aqui, definindo a variável de ambiente COLUMNS. Não consegui fazer isso funcionar (SLES 12.1). Até tentei gravar em um arquivo, exportar, perfil personalizado de origem.
O que funcionou foi usar a opção -w do top.
Aqui está a essência do meu script, sem a notificação e a eliminação de itens 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