El error se debe a que uno de los argumentos -ge
no es numérico. Como $ALERT
siempre es numérico, $usep
tiene que ser el culpable. Hay varios problemas con la forma en que analiza la salida dh
que resultan en $usep
no ser numéricos.
Dependiendo de la longitud de los sistemas de archivos, dh
puede dividir su salida en varias líneas. Las líneas parciales quedarán atrapadas en su filtro y generarán datos sin sentido. Para evitar este comportamiento y obtener un resultado analizable dh
, pase la -P
opción.
También df
imprime una línea de encabezado que nuevamente generará datos sin sentido.
Tu filtro es bastante complejo. Usaría un solo pase de awk. Para el caso, podría filtrar el porcentaje dentro de awk (pero no lo he hecho en el siguiente script).
df -H | awk '
NR == 1 {next}
$1 == "abc:/xyz/pqr" {next}
$1 == "tmpfs" {next}
$1 == "/dev/cdrom" {next}
1 {sub(/%/,"",$5); print $1, $5}
' | while read filesystem percentage; do
if [ "$percentage" -ge "$ALERT" ]; then
mail -s "Alert: Almost out of disk space ($usep%) on $filesystem" "$ADMIN"
fi
done
NR==1
coincide con la primera línea, por lo que NR==1 {next}
omite la primera línea. Las siguientes líneas excluyen algunos sistemas de archivos (tenga en cuenta que su descripción dice que le interesa abc:/xyz/pqr
, pero su código lo excluye). La última línea awk elimina el %
de la columna de porcentaje antes de imprimirlo.
Sería mejor enviar un solo correo sobre todos los sistemas de archivos. Esta vez estoy haciendo todo el análisis en awk.
message=$(df -h | awk -v ALERT="$ALERT" '
NR == 1 {next}
$1 == "abc:/xyz/pqr" {next}
$1 == "tmpfs" {next}
$1 == "/dev/cdrom" {next}
1 {sub(/%/,"",$5)}
$5 >= ALERT {printf "%s is almost full: %d%%\n", $1, $5}
')
if [ -n "$message" ]; then
echo "$message" | mail -s "Alert: Almost out of disk space" "$ADMIN"
fi
Gilles 'SO- deja de ser malvado'
fuente
Aquí está mi variante:
fuente
No puedo comentar la respuesta de Gilles anterior, pero solo tenga en cuenta que awk está haciendo una comparación basada en cadenas en la segunda parte, donde:
Me di cuenta de esto cuando estaba probando umbrales de un solo dígito. Puede forzar una conversión a int usando +0, por lo que la comparación se convierte en:
fuente