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