Команду / скрипт оболочки, чтобы увидеть, жив ли хост?


9

Я пытаюсь найти больше способов проверить, работает ли данный хост, используя только команды оболочки (в первую очередь, bash). В идеале он мог бы работать как с именами хостов, так и с IP-адресами. Прямо сейчас единственный родной способ, которым я знаю, - это ping, возможно, интегрированный в скрипт, как описано здесь. Есть еще идеи?

Ответы:


7

ping это способ проверить , является ли жив и подключен хост. (Если хост жив, но отключен или медленно реагирует, вы не можете отличить его от мертвого.)

Параметры, поддерживаемые pingкомандой, различаются в зависимости от системы. Вы хотите убедиться, что он не зацикливается вечно, а возвращается через несколько секунд, если не получил ответ.

С FreeBSD и Linux iputils ping -c 1 -W 1 >/dev/nullотправляет один пинг и ждет 1 секунду. Вам не нужно анализировать выходные данные: команда возвращает 0, если она получила ответ, и ненулевое значение в противном случае (неизвестное имя хоста, нет маршрута к хосту, нет ответа). В некоторых реализациях могут потребоваться разные флаги (например, -wвместо -WFreeBSD), проверьте руководство в вашей системе.

if ping -c 1 -W 1 "$hostname_or_ip_address"; then
  echo "$hostname_or_ip_address is alive"
else
  echo "$hostname_or_ip_address is pining for the fjords"
fi

Я знаю , что это путь, я просто надеюсь , что это не единственный способ, даже если другие способы странны или непостоянный или что у вас. Ну что ж!
— user67459

2
Этот ответ НЕ должен быть помечен как answeredответ. ОП специально спросил more ways to see if a given host is up, кроме как, с pingкоторым этот ответ не дает.
— Yokai

Со страницы "Because of the load it can impose on the network, it is unwise to use ping during normal operations or from automated scripts."
— руководства

@ 1111161171159459134 Этот абзац мог бы быть сформулирован лучше. Это слишком паникер. Вы не должны выполнять проверки связи с высокой скоростью, но один пакет проверки время от времени незначителен.
— Жиль "ТАК - перестань быть злым"

2

Ping - отличный способ получить быстрый ответ о том, подключен ли хост к сети, но он часто не сообщает вам, жив хост или нет, или он все еще работает, как ожидалось. Это связано с тем, что ответы на пинг обычно обрабатываются ядром, поэтому даже если каждое приложение в системе аварийно завершилось (например, из-за сбоя диска или нехватки памяти), вы все равно часто будете получать ответы на пинг и можете предполагать, что компьютер работает нормально, когда ситуация совершенно противоположная.

Проверка услуг

Обычно вас не волнует, находится ли хост в сети или нет, но вас действительно волнует, выполняет ли машина какую-то задачу. Так что, если вы можете проверить задачу напрямую, то вы будете знать, что хост включен, и что задача все еще выполняется.

Например, для удаленного хоста, на котором работает веб-сервер, вы можете сделать что-то вроде этого:

# Add the -f option to curl if server errors like HTTP 404 should fail too
if curl -I "http://$TARGET"; then
  echo "$TARGET alive and web site is up"
else
  echo "$TARGET offline or web server problem"
fi

Если он работает по SSH и у вас настроены ключи для входа без пароля, у вас есть еще несколько вариантов, например:

if ssh "$TARGET" true; then
  echo "$TARGET alive and accessible via SSH"
else
  echo "$TARGET offline or not accepting SSH logins"
fi

Это работает путем SSH'ing на хост и запуска trueкоманды, а затем закрытия соединения. sshКоманда будет возвращать только успех , если эта команда может быть запущена успешно.

Удаленные тесты через SSH

Вы можете расширить это, чтобы проверить конкретные процессы, например, убедиться, что они mysqldзапущены на компьютере:

if ssh "$TARGET" bash -c 'ps aux | grep -q mysqld'; then
  echo "$TARGET alive and running MySQL"
else
  echo "$TARGET offline or MySQL crashed"
fi

Конечно, в этом случае вам лучше запустить что-то вроде monitцели, чтобы убедиться, что служба продолжает работать, но это полезно в сценариях, где вы хотите выполнить какую-то задачу только на машине A, если машина B готова к ней. ,

Это может быть что-то вроде проверки того, что на целевой машине смонтирована определенная файловая система, прежде чем выполнять rsyncее, чтобы случайно не заполнить основной диск, если вторичная файловая система не смонтирована по какой-либо причине. Например, /mnt/raidперед тем, как продолжить, убедитесь, что он установлен на целевой машине.

if ssh "$TARGET" bash -c 'mount | grep -q /mnt/raid'; then
  echo "$TARGET alive and filesystem ready to receive data"
else
  echo "$TARGET offline or filesystem not mounted"
fi

Услуги без клиента

Иногда нет простого способа подключиться к сервису, и вы просто хотите посмотреть, принимает ли он входящие TCP-соединения, но когда вы попадаете telnetк цели на рассматриваемом порту, он просто сидит там и не отключает вас, что означает выполнение этого. в сценарии может привести к зависанию.

Хотя это и не так чисто, вы можете сделать это с помощью программ timeoutи netcat. Например, он проверяет, принимает ли компьютер соединения SMB / CIFS через TCP-порт 445, и вы можете увидеть, работает ли на нем общий доступ к файлам Windows, даже если у вас нет пароля для входа или клиентские инструменты CIFS не ' т установлено:

# Wait 1 second to connect (-w 1) and if the total time (DNS lookups + connect
# time) reaches 5 seconds, assume the connection was successful and the remote
# host is waiting for us to send data.  Connecting on TCP port 445.
if echo 'x' | timeout --preserve-status 5 nc -w 1 "$TARGET" 445; then
  echo "$TARGET alive and CIFS service available"
else
  echo "$TARGET offline or CIFS unavailable"
fi
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.