Сценарій Shell для надсилання сповіщення електронною поштою, якщо використання диска перевищує 90%


11

Я хочу реалізувати на моєму сервері сценарій, який автоматично надсилатиме сповіщення електронною поштою, якщо використання диска перевищує 90%, а сповіщення про другу електронну пошту, коли воно перевищує 95%. Моя файлова система є, abc:/xyz/abcі точка монтажу є /pqr.

Я спробував це:

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

Але я отримую помилку, яка говорить

line 7: [: Use: integer expression expected 

Відповіді:


14

Помилка пов'язана з одним із аргументів того, що вона -geне є числовою. Оскільки $ALERTвін завжди чисельний, $usepвін повинен бути винуватцем. Існує кілька проблем з тим, як ви аналізуєте вихід, dhякий призводить до того, що він $usepне буде числовим.

Залежно від довжини файлової системи, dhможе розділити її вихід на кілька рядків. Часткові лінії будуть потрапляти у ваш фільтр і призводять до безглуздих даних. Щоб уникнути такої поведінки та отримати синтаксичний вихід 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 видаляє %з відсоткового стовпця перед його друком.

Було б приємніше надсилати одну пошту про всі файлові системи. Цього разу я роблю весь аналіз дивним чином.

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 

6

Якщо змінити print на printf, використовуючи% d, відсоток стане цілим числом. Спробуйте:

printf("%d", $5);

що перетворить 91% до 91. Отже, остаточна команда така:

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

Наведена вище команда англійською мовою: "Отримайте дисковий простір у читаному для людини форматі. Фільтруйте з грепом на той диск, на який ми хочемо подивитися. Трубопровід, щоб пробудити і надрукувати 5-е слово, відмічене пробілом (випорожнення видалено), та формат результуюча рядок як ціле число. Для мене команда повертає ціле число, 78що означає, що диск на 78% заповнений.


3
$ df | tail +2 | sed s/%//g | awk '{ if($5 > 90) print "Alert "$0;}'
  • df | tail +2 приймає весь результат після пропуску перших 2 рядків
  • sed s/%//g знаки відсотка смужки
  • awk ... друкує "Попередження ...", якщо 5-е поле у ​​висновку є числом більше 90

1
Ласкаво просимо на обмін стеками! Ми шукаємо довгі відповіді, які дають певні пояснення та контекст. Не просто дайте однорядну відповідь; поясніть, як це працює. Відповіді, які не містять пояснень, можуть бути видалені.
G-Man каже: "Відновіть Моніку"

0

ось мій варіант:

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

Я не в змозі коментувати відповідь Гілла вище, але просто пам’ятайте, що awk проводить порівняння на основі рядків у другій частині, де:

$5 >= ALERT

Я помітив це, коли тестував однозначні пороги. Ви можете примусити заголовок до int, використовуючи +0, тому порівняння стає:

$5+0 >= ALERT
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.