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