Команда / сценарій Shell, щоб побачити, чи живий хост?


9

Я намагаюся знайти більше способів дізнатися, чи заданий хост працює, використовуючи виключно команди оболонки (в першу чергу bash). В ідеалі вона зможе працювати як з іменами хостів, так і з IP-адресами. Зараз єдиний рідний спосіб, про який я знаю, - це ping, можливо, інтегрований у сценарій, як описано тут. Будь-які інші ідеї?

Відповіді:


7

ping це спосіб перевірити, чи хост живий і підключений. (Якщо хост живий, але відключений або повільно реагує, ви не можете відрізнити це від його мертвого.)

Опції, що підтримуються pingкомандою, відрізняються від системи до системи. Ви хочете переконатися, що воно не циклічно вічно, а повернеться через кілька секунд, якщо на нього не надійшла відповідь.

За допомогою iputils FreeBSD та Linux ping -c 1 -W 1 >/dev/nullнадсилає один пінг і чекають 1 секунди. Вам не потрібно розбирати вихід: команда повертає 0, якщо вона отримала ping назад та ненульове значення в іншому випадку (невідоме ім'я хоста, немає маршруту до хосту, немає відповіді). Для деяких реалізацій можуть знадобитися різні прапори (наприклад, -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

Я знаю , що це шлях, я просто сподіваюся , що це не єдиний спосіб, навіть якщо інші способи дивні або непостійний або що у вас. Ну добре!
користувач67459

2
Ця відповідь НЕ повинна бути позначена як answeredвідповідь. ОП спеціально просила more ways to see if a given host is up, окрім випадків ping, на які ця відповідь не надає.
Йокай

Зі сторінки чоловіка 'ping':"Because of the load it can impose on the network, it is unwise to use ping during normal operations or from automated scripts."
1111161171159459134

@ 1111161171159459134 Цей параграф міг бути сформульований краще. Це надмірно тривожно. Не слід робити затоплення пінгвів або пінгерів з дуже високою швидкістю, але один пакет пінг раз у раз є мізерним.
Жил "ТАК - перестань бути злим"

2

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'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 не є ' t встановлено:

# 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.