Сценарий оболочки для отправки аварийной почты, если использование диска превышает 90%

Я соглашаюсь с другими ответами, что это обычно не прекрасная идея.

Но можно вызвать оболочку из сценария. Если Вам записали сценарий в настоящее время для использования tcsh, и Вы хотите использовать несколько определенных для удара функций, можно вызвать удар явно. Например, удар делает намного легче перенаправить stdout и stderr независимо.

#!/bin/tcsh -f

echo Hello, tcsh
bash -c 'echo Hello, bash 1>&2' # writes to stderr
echo Good-bye, tcsh

В конечном счете, тем не менее, вероятно, лучше перевести весь сценарий для использования удара.

Обязательная ссылка: http://www.faqs.org/faqs/unix-faq/shell/csh-whynot/

11
25.11.2018, 17:02
6 ответов

Ошибка происходит из-за одного из аргументов -ge не быть числовым. С тех пор $ALERT является всегда числовым, $usep должен быть преступник. Существует несколько проблем со способом, из которого Вы анализируете вывод dh которые приводят к $usep не быть числовым.

В зависимости от длин файловых систем, dh может разделить его вывод на нескольких строках. Частичные строки будут пойманы в Вашем фильтре и результате в бессмысленных данных. Избежать этого поведения и получить parseable вывод от dh, передайте -P опция.

Также df печатает строку заголовка, которая снова приведет к бессмысленным данным.

Ваш фильтр довольно сложен. Я использовал бы единственную передачу awk. В этом отношении Вы могли сделать фильтрацию на проценте внутри awk (но я не сделал этого в следующем сценарии).

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 соответствует первой строке, таким образом, NR==1 {next} пропускает первую строку. Следующие несколько строк исключают некоторые файловые системы (обратите внимание, что в Вашем описании говорится, что Вы интересуетесь abc:/xyz/pqr, но Ваш код исключает его). Последняя awk строка удаляет % из столбца процента прежде, чем распечатать его.

Было бы более хорошо отправить единственную почту обо всех файловых системах. На этот раз я делаю весь анализ в 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 
13
27.01.2020, 19:57

вот мой вариант:

#!/bin/bash

ADMIN=yermail@yerdom.com
ALERT=90
df -H | grep -vE 'abc:/xyz/pqr | tmpfs |cdrom|Used' | awk '{ print $5 " " $1 }' | while read output; do 
usep=$(echo $output | awk '{ print $1}' | cut -d'%' -f1 ) 
echo $usep
partition=$(echo $output | awk '{ print $2 }' ) 
if [ $usep -ge $ALERT ]; then 
  echo  "Alert: Almost out of disk space $usep" 
  df -H | mail -s "Alert: out of disk space $usep"  $ADMIN
fi 
done
0
27.01.2020, 19:57

Если изменить вывод на печать с использованием %d, то процент станет целым числом. Попробуйте:

printf("%d", $5);

, которое будет преобразовывать 91% в 91. Итак, заключительная команда:

df -H | grep /dev/xvde1 | awk '{ printf "%d", $5}'

Вышеприведенная команда на английском языке: "Получить использование дискового пространства в читаемом человеком формате". Отфильтровать с помощью grep диск, на который мы хотим посмотреть. Пропустите эту строку и выведите 5-е слово, разделенное пробелом (пустоты удалены), и отформатируйте полученную строку как целое число. Для меня команда возвращает целое число 78, что означает, что диск заполнен на 78%.

6
27.01.2020, 19:57
$ df | tail +2 | sed s/%//g | awk '{ if($5 > 90) print "Alert "$0;}'
  • DF | Хвост +2 принимает все выходные после пропуска первых 2 строк
  • SED S /% // G полоски процентов знаков
  • awk ... Принты «оповещение ...» 5-е поле на выходе составляет число более 90
3
27.01.2020, 19:57

Я не могу комментировать ответ Жиля выше, но просто имейте в виду, что awk выполняет сравнение на основе строки -во второй части, где:

$5 >= ALERT

Я заметил это, когда тестировал однозначные -пороговые значения. Вы можете принудительно преобразовать тип в int, используя +0, поэтому сравнение становится:

$5+0 >= ALERT
0
27.01.2020, 19:57

Выполнено с помощью команды awk

df -Ph $f |awk 'NR >1{gsub("%","",$0);print }'| awk -v subject="$subject" '{if($(NF-1)>90){print "mailx -s out of space in "$NF  " praveenkumar.pearl@gmail.com |sh"} else{print "No disk space issu exsists"}}'| sed "s/out/'out/g" |sed "s/.* /&'  /g"
0
27.10.2020, 15:45

Теги

Похожие вопросы