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

9

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

user67459
источник

Ответы:

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
Malvineous
источник