Я соглашаюсь с другими ответами, что это обычно не прекрасная идея.
Но можно вызвать оболочку из сценария. Если Вам записали сценарий в настоящее время для использования 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/
Ошибка происходит из-за одного из аргументов -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
вот мой вариант:
#!/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
Если изменить вывод на печать с использованием %d, то процент станет целым числом. Попробуйте:
printf("%d", $5);
, которое будет преобразовывать 91% в 91. Итак, заключительная команда:
df -H | grep /dev/xvde1 | awk '{ printf "%d", $5}'
Вышеприведенная команда на английском языке: "Получить использование дискового пространства в читаемом человеком формате". Отфильтровать с помощью grep диск, на который мы хотим посмотреть. Пропустите эту строку и выведите 5-е слово, разделенное пробелом (пустоты удалены), и отформатируйте полученную строку как целое число. Для меня команда возвращает целое число 78
, что означает, что диск заполнен на 78%.
$ df | tail +2 | sed s/%//g | awk '{ if($5 > 90) print "Alert "$0;}'
DF | Хвост +2
принимает все выходные после пропуска первых 2 строк SED S /% // G
полоски процентов знаков awk ...
Принты «оповещение ...» 5-е поле на выходе составляет число более 90 Я не могу комментировать ответ Жиля выше, но просто имейте в виду, что awk выполняет сравнение на основе строки -во второй части, где:
$5 >= ALERT
Я заметил это, когда тестировал однозначные -пороговые значения. Вы можете принудительно преобразовать тип в int, используя +0, поэтому сравнение становится:
$5+0 >= ALERT
Выполнено с помощью команды 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"