Ping hebat untuk mendapatkan respons cepat tentang apakah host terhubung ke jaringan, tetapi sering tidak memberi tahu Anda apakah host masih hidup atau tidak, atau apakah masih beroperasi seperti yang diharapkan. Ini karena respons ping biasanya ditangani oleh kernel, jadi meskipun setiap aplikasi pada sistem mengalami crash (mis. Karena kegagalan disk atau kehabisan memori), Anda akan sering masih mendapatkan respons ping dan mungkin menganggap mesin beroperasi secara normal ketika situasinya berlawanan.
Memeriksa layanan
Biasanya Anda tidak terlalu peduli apakah host masih online atau tidak, yang benar-benar Anda pedulikan adalah apakah mesin masih melakukan beberapa tugas. Jadi, jika Anda dapat memeriksa tugas secara langsung, maka Anda akan tahu bahwa tuan rumah sudah selesai dan tugas itu masih berjalan.
Untuk host jarak jauh yang menjalankan server web misalnya, Anda dapat melakukan sesuatu seperti ini:
# 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
Jika menjalankan SSH dan Anda memiliki kunci yang diatur untuk login tanpa kata sandi, maka Anda memiliki beberapa opsi lagi, misalnya:
if ssh "$TARGET" true; then
echo "$TARGET alive and accessible via SSH"
else
echo "$TARGET offline or not accepting SSH logins"
fi
Ini berfungsi dengan SSH'ing ke host dan menjalankan true
perintah dan kemudian menutup koneksi. The ssh
perintah saja akan kembali sukses jika perintah yang bisa berjalan dengan sukses.
Tes jarak jauh melalui SSH
Anda dapat memperluas ini untuk memeriksa proses tertentu, seperti memastikan bahwa mysqld
itu berjalan pada mesin:
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
Tentu saja dalam hal ini Anda akan lebih baik menjalankan sesuatu seperti monit
pada target untuk memastikan layanan tetap berjalan, tetapi ini berguna dalam skrip di mana Anda hanya ingin melakukan beberapa tugas pada mesin A selama mesin B siap untuk itu .
Ini bisa seperti memeriksa bahwa mesin target memiliki sistem file tertentu yang dipasang sebelum melakukan rsync
itu, sehingga Anda tidak sengaja mengisi disk utama jika sistem file sekunder tidak dipasang karena alasan tertentu. Misalnya ini akan memastikan bahwa /mnt/raid
sudah terpasang pada mesin target sebelum melanjutkan.
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
Layanan tanpa klien
Kadang-kadang tidak ada cara mudah untuk terhubung ke layanan dan Anda hanya ingin melihat apakah ia menerima koneksi TCP yang masuk, tetapi ketika Anda telnet
ke target pada port yang bersangkutan hanya duduk di sana dan tidak memutuskan Anda, yang berarti melakukan itu dalam skrip akan menyebabkannya hang.
Meskipun tidak begitu bersih, Anda masih bisa melakukan ini dengan bantuan program timeout
dan netcat
. Misalnya, ini memeriksa untuk melihat apakah mesin menerima koneksi SMB / CIFS pada port TCP 445, sehingga Anda dapat melihat apakah mesin itu menjalankan berbagi file Windows bahkan jika Anda tidak memiliki kata sandi untuk login, atau alat klien CIFS tidak tersedia t diinstal:
# 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