la salida de top se trunca a 80 columnas cuando se ejecuta mediante cron

la salida de top se trunca a 80 columnas cuando se ejecuta mediante cron

Tengo el siguiente script de registro:

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

Y el siguiente registro en mi crontab:

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

El problema es que las líneas en top.log se cortan a 80 caracteres, por ejemplo:

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

Esto no sucede si ejecuto el comando directamente desde la consola.

He intentado utilizar la variable COLUMNAS:

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

Pero eso lleva a que cada línea tenga exactamente 999 caracteres: el espacio no utilizado se rellena con espacios, que no es lo que quiero.

¿Cómo solucionar este extraño problema? Mi sistema es centos 6.3.

Respuesta1

topsiempre muestra espacios hasta la última columna de la pantalla. Simplemente no te das cuenta cuando se imprime en la terminal porque no puedes distinguir visualmente una línea con espacios finales de una línea sin espacios finales. Notarás los espacios si copias y pegas con el mouse o en formato screen.

Si desea deshacerse de los espacios, simplemente filtrelos.

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

Sea lo que sea por lo que estés postulando top, probablemente haya mejoressupervisiónherramientas disponibles.

Respuesta2

Tuve un problema similar. El script Bash funcionó bien desde la línea de comando, pero la salida "superior" se redujo a 80 caracteres cuando se ejecutó desde cron.

Primero probé la solución aceptada aquí, configurando la variable de entorno COLUMNAS. No pude hacer que esto funcionara (SLES 12.1). Incluso intenté escribir en un archivo, exportar, generar un perfil personalizado.

Lo que funcionó fue usar la opción -w de top.
Aquí está el núcleo de mi script, menos la notificación y la eliminación de elementos de seguridad.

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

información relacionada