Команда/сценарий Shell, чтобы видеть, жив ли хост?

Раздел 'Special Features' домашней страницы XStow устарел; например, GNU Убирает теперь поддержки, несколько убирают каталоги, и поддерживает регулярные выражения в некоторых контекстах. 2.x выпуск был почти полным, переписывают, с основным рефакторингом, улучшенным двухфазным подходом и комплектом комплексного испытания. С тех пор я добавил и изменил много вещей включая поддержку черных списков, принятия файла, дополнительное отключение сворачивания (AFAICS XStow не поддерживает сворачивание вообще, которое не было бы слишком удивительно, потому что это - безусловно самая хитрая вещь разобраться).

По моему, несомненно, смещенному мнению исходная мотивация для записи XStow была сомнительна, или по крайней мере управляемая причинами, которые являются теперь устаревшими. Домашняя страница говорит, "Убирают, требует Perl. Но что находится в системах, где никакой Perl не доступен, или еще установленный? Я пытался компилировать, Убирают с perlcc, но он перестал работать", но в действительности сколько системы там там, которые поддерживают символьные ссылки и не предварительно установили Perl? Perl повсеместен. C++ кажется мне абсолютно ужасным выбором языка для этого вида утилиты, где производительность намного менее важна, чем надежность кода.

Тем не менее XStow действительно имеет, кажется, имеют несколько хороших приемов, и я намереваюсь украсть по крайней мере один из них для GNU, Убирают путем добавления, что установка сцепляется для обработки Информации dir слияние варианта использования, по крайней мере. Также код сохраняется в репозитории мерзавца, и я с удовольствием приму запросы получения по запросу против проекта GitHub.

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

9
14.03.2015, 18:02
2 ответа

ping is is is the way to test if a host is alive and connected. (Если хост жив, но отключен или медленно реагирует, вы не можете отличить его от мертвого)

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

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

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
7
27.01.2020, 20:07

Команда Ping отлично подходит для получения быстрого ответа о том, подключен ли хост к сети, но часто она не сообщает, активен хост или нет, и работает ли он по-прежнему должным образом. Это связано с тем, что ответы на запросы ping обычно обрабатываются ядром, поэтому, даже если каждое приложение в системе аварийно завершает работу (, т.е. из-за сбоя диска или нехватки памяти )вы часто по-прежнему получаете ответы на запросы 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-подключения к хосту и выполнения команды 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на цели, чтобы убедиться, что служба продолжает работать, но это полезно в сценариях, где вы хотите выполнить какую-то задачу только на машине А, пока машина 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
6
27.01.2020, 20:07

Теги

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