
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
top
siempre 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