email - registro y correo de cola y grep(linux)
shell tail (2)
Voy a probar esto. Tal vez aprenda algo si mi código malicioso de bash es escudriñado. Existe la posibilidad de que ya haya un millón de soluciones para hacer esto, pero no voy a averiguarlo, ya que estoy seguro de que ha explorado las profundidades y el ancho del cyberocean. Parece que lo que desea puede separarse en dos bits: 1) a intervalos regulares obtenga la ''última cola'' del archivo, 2) si la última cola realmente existe, envíela por correo electrónico. Para los intervalos regulares en 1), use cron. Para obtener la última cola en 2), tendrá que hacer un seguimiento del tamaño del archivo. El script bash a continuación lo hace: es una solución a 2) que puede invocarse cron. Utiliza el tamaño del archivo en caché para calcular el fragmento del archivo que necesita enviar. Tenga en cuenta que para un archivo myfile se crea otro archivo .offset.myfile. Además, la secuencia de comandos no permite componentes de ruta en el nombre del archivo. Reescriba o corrija en la invocación [por ejemplo, (cd / foo / bar && segtail.sh zut), suponiendo que se llame segtail.sh].
#!/usr/local/bin/bash
file=$1
size=0
offset=0
if [[ $file =~ / ]]; then
echo "$0 does not accept path components in the file name" 2>&1
exit 1
fi
if [[ -e .offset.$file ]]; then
offset=$(<".offset.$file")
fi
if [[ -e $file ]]; then
size=$(stat -c "%s" "$file") # this assumes GNU stat, possibly present as gstat. CHECK!
# (gstat can also be Ganglias Status tool - careful).
fi
if (( $size < $offset )); then # file might have been reduced in size
echo "reset offset to zero" 2>&1
offset=0
fi
echo $size > ".offset.$file"
if [[ -e $file && $size -gt $offset ]]; then
tail -c +$(($offset+1)) "$file" | head -c $(($size - $offset)) | mail -s "tail $file" foo@bar
fi
Quiero cola archivo de registro con grep y lo envió por correo como:
tail -f /var/log/foo.log | grep error | mail -s subject [email protected]
¿Cómo puedo hacer esto?
¿Desea enviar un correo electrónico cuando se producen errores de correo electrónico? Eso podría fallar;)
Sin embargo, puedes intentar algo como esto:
tail -f $log |
grep --line-buffered error |
while read line
do
echo "$line" | mail -s subject "$email"
done
Que para cada línea en la salida grep envía un correo electrónico.
Ejecutar sobre script de shell con
nohup ./monitor.sh &
por lo que seguirá ejecutándose en segundo plano.