проверить обновление ping для большого количества машин

При входе в ловушку EXIT$?содержит статус выхода. Это то же самое значение, которое вы найдете как $?после вызова этого скрипта в другой оболочке :, либо аргумент, переданный в exit(, усеченный до диапазона 0–255 ), либо состояние возврата предыдущей команды. В случае выхода из-за set -eэто статус возврата команды, которая вызвала неявный exit.

Обычно следует сохранить $?и снова выйти с тем же статусом.

cleanup () {
  if [ -n "$1" ]; then
    echo "Aborted by $1"
  elif [ $status -ne 0 ]; then
    echo "Failure (status $status)"
  else
    echo "Success"
  fi
}
trap 'status=$?; cleanup; exit $status' EXIT
trap 'trap - HUP; cleanup SIGHUP; kill -HUP $$' HUP
trap 'trap - INT; cleanup SIGINT; kill -INT $$' INT
trap 'trap - TERM; cleanup SIGTERM; kill -TERM $$' TERM
0
27.08.2018, 21:58
3 ответа

Вам нужен список имен, которые вы хотите отслеживать. Либо вы ведете этот список вручную, либо извлекаете список из того места, где кто-то другой ведет список машин, которые должны работать.

Вы можете упростить несколько вещей. Команда pingуже возвращает статус выхода, вы можете ее использовать. Также вам не нужно перенаправление для каждого эха, достаточно одного раза за цикл. Дополнительным преимуществом этого является то, что файл инициализируется и не содержит строк из последнего запуска.

for node in $(cat /tmp/node.txt); do
  if ! ping -c 3 $node &> /dev/null; then
    echo "$node"
  fi
done > /tmp/nodedown.txt

Если вам нужна статистика, вы можете либо подсчитать их, либо использовать wcдля подсчета строк в двух файлах.

echo "$(wc -l < /tmp/nodedown.txt) / $(wc -l < /tmp/node.txt)"
0
28.04.2021, 23:43

Альтернативы:

  • fping похож на ping, но специально разработан для проверки связи с несколькими хостами.
  • whatsup — это утилита, предназначенная для мониторинга работы компьютеров.
0
28.04.2021, 23:43

Может быть, оператор случая:

#!/bin/sh
glob=${1:-*}

for node in `cat /tmp/node.txt`
do
    case $node in
        $glob)  : ;;
        *)      continue ;;
    esac
    count=0
    count=$(ping -c 3 $node | grep "100%packet loss"|wc -l)
    if [ $count -ne 0 ]
    then
       echo "$node" >> /tmp/nodedown.txt
    fi
done

Назовите это как:

nodecheck.sh 'bs381*'

Убедитесь, что регулярное выражение заключено в кавычки, чтобы оболочка не расширила его.

0
28.04.2021, 23:43

Теги

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