Небольшой скрипт на bash для пингования хостов

    Как одновременно держать руку на пульсе у нескольких серверов и управляемых свичей? Я решил автоматизировать этот процесс. Вот что вышло.

    Сам скрипт


    1. #!/bin/bash
    2. #Версия 0.2pre alfa
    3. #Скрипт поддерживает четыре ключа: 1) -s режим тишины, 2) -d с результатом
    4. #показывать текущую дату, 3) -n нормальный режим, 4) -с режим для conky
    5. opt=$1
    6. if [[ "$opt" = "" ]]
    7. then
    8. opt='-n'
    9. else
    10. #Немного индийского кода:)
    11. echo $opt > /dev/null
    12. fi
    13. case $opt in
    14. -n)
    15. flag=0
    16. ;;
    17. -d)
    18. flag=1
    19. ;;
    20. -s)
    21. flag=2
    22. ;;
    23. -c)
    24. flag=3
    25. ;;
    26. *)
    27. echo "Введен неправильный ключ..."
    28. exit 0
    29. esac
    30. #Этот кейс можно было бы и опустить, но фильтровать входные данные (извините за тавтологию) на входе это есть хорошо
    31. i=0
    32. j=0
    33. for ip in '77.88.21.8' '217.69.128.42' '216.239.59.104' #'74.125.67.10' #Здесь
    34. #указываем IP пингуемых хостов
    35. do
    36. for rez in $(ping -c 1 $ip | grep % | cut -d ' ' -f6)
    37. do
    38. echo $rez > /dev/null
    39. done
    40. let "j = j + 1"
    41. if [[ "$rez" = "0%" ]]
    42. then
    43. let "i = i + 1"
    44. else
    45. #Ещё чуток индийского кода:)
    46. let "i = i + 0"
    47. fi
    48. done
    49. case $flag in
    50. 0)
    51. if [[ "$i" = "$j" ]]
    52. then
    53. echo "Всё пингуется нормально..."
    54. else
    55. echo "Что-то пошло не так..."
    56. fi
    57. ;;
    58. 1)
    59. if [[ "$i" = "$j" ]]
    60. then
    61. echo "$(date) Всё пингуется нормально..."
    62. else
    63. echo "$(date) Что-то пошло не так..."
    64. fi
    65. ;;
    66. 2)
    67. if [[ "$i" = "$j" ]]
    68. then
    69. #И индийский код напоследок:)
    70. echo "Всё пингуется нормально..." > /dev/null
    71. else
    72. echo "Что-то пошло не так..." > /dev/null
    73. fi
    74. ;;
    75. 3)
    76. if [[ "$i" = "$j" ]]
    77. then
    78. echo "Ok"
    79. else
    80. echo "Alarm"
    81. fi
    82. ;;
    83. *)
    84. echo "Критическая ошибка..."
    85. exit 0
    86. esac
    * This source code was highlighted with Source Code Highlighter.


    Линк на сабж



    Кусок /etc/crontab


    1. */10 * * * * root /путь/до/скрипта/./pinger.sh -d >> /путь/до/логов/pinger.log
    * This source code was highlighted with Source Code Highlighter.


    Так выглядит лог




    Кусок .conkyrc



    1. ${color lightgrey}Last pinger msg: ${color red} ${execi 2 ~/work/pinger.sh -c}
    * This source code was highlighted with Source Code Highlighter.


    А так выглядит conky




    Подробности для тех, кто в танке


    Прежде всего установим conky, в Debian based дистрибутивах (Ubuntu и т.д.) делается это так:
    $ sudo apt-get install conky
    Теперь нужен конфиг для conky, предлагаю скачать мой
    $ wget -P ~ troll-lox.narod.ru/conkyrc.troll
    Переименуем свежескачанный файлик
    $ mv ~/conkyrc.troll ~/.conkyrc
    Теперь качаем сабжевый скрипт
    $ wget -P ~ troll-lox.narod.ru/pinger.sh
    Редактируем 32-ую строку по своему вкусу
    $ nano ~/pinger.sh
    Даём скрипту права на исполнение
    $ sudo chmod +x ~/pinger.sh
    И запускаем conky
    $ conky&
    Всё, должно получиться как на скриншоте.


    P.S. Версия для товарищей в белых перчатках


    1. #!/bin/bash
    2. opt=$1
    3. i=0
    4. j=0
    5. for ip in '192.168.0.1' '192.168.0.2' 'habrahabr.ru' #'74.125.67.10'
    6. do
    7. for rez in $(ping -c 1 $ip | grep % | cut -d ' ' -f6)
    8. do
    9. echo $rez > /dev/null
    10. done
    11. let "j = j + 1"
    12. if [[ "$rez" = "0%" ]]; then
    13. let "i = i + 1"
    14. fi
    15. done
    16. if [[ "$opt" = "-c" ]]
    17. then
    18. if [[ "$i" = "$j" ]]
    19. then
    20. echo "Ok"
    21. else
    22. echo "Alarm"
    23. fi
    24. else
    25. if [[ "$i" = "$j" ]]
    26. then
    27. echo "$(date) Всё пингуется нормально..."
    28. else
    29. echo "$(date) Что-то пошло не так..."
    30. fi
    31. fi
    * This source code was highlighted with Source Code Highlighter.

    Комментарии 14

      0
      Conky: что такое и чем знаменит?
        0
          0
          Да… я все таки должен был открыть первее гугл чем окно комментария.
          Спасибо
        0
        86 строк. Ужос.
          –1
          ну я в коде откомментил почему
          0
          monit отменили?
            0
            А не слишком ли сурово для пары серверов? Микроскоп гвозди, все дела…
            +1
            86колесный индийский велосипед…

            p.s. реализация case и обилие Indus-кода убило наповал.
              –2
              Обновил специально для вас
                0
                ну можно было бы еще покороче, и с отступами :)

                но основной вопрос был про велосипед.
                  0
                  В чём велосипед то?
                    0
                    в идее. mrpsycho уже написал выше один из вариантов замены.
              0
              # if [[ "$rez" = «0%» ]]
              # then
              # let «i = i + 1»
              # else
              # let «i = i + 0»
              # fi

              what?
                –2
                это были элементы индийского кода:) но я всё исправил

              Только полноправные пользователи могут оставлять комментарии. Войдите, пожалуйста.

              Самое читаемое