Perintah / skrip Shell untuk melihat apakah host masih hidup?

9

Saya mencoba mencari cara lain untuk melihat apakah host yang diberikan sudah habis, hanya menggunakan perintah shell (terutama bash). Idealnya, ini dapat bekerja dengan nama host dan alamat IP. Saat ini satu-satunya cara asli yang saya tahu adalah ping, mungkin diintegrasikan ke dalam skrip seperti yang dijelaskan di sini. Ada ide lain?

pengguna67459
sumber

Jawaban:

7

ping adalah cara untuk menguji apakah suatu host masih hidup dan terhubung. (Jika host masih hidup tetapi terputus atau lambat merespons, Anda tidak dapat membedakannya dari yang mati.)

Opsi yang didukung oleh pingperintah bervariasi dari satu sistem ke sistem lainnya. Anda ingin memastikan bahwa itu tidak berulang selamanya tetapi kembali setelah beberapa detik jika tidak menerima balasan.

Dengan FreeBSD dan Linux iputils, ping -c 1 -W 1 >/dev/nullkirim satu ping dan tunggu 1 detik. Anda tidak perlu menguraikan output: perintah mengembalikan 0 jika menerima ping kembali dan bukan nol sebaliknya (nama host tidak dikenal, tidak ada rute untuk menjadi tuan rumah, tidak ada jawaban). Beberapa implementasi mungkin memerlukan tanda yang berbeda (mis. -wAlih-alih -Wpada FreeBSD), periksa manual pada sistem Anda.

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
Gilles 'SANGAT berhenti menjadi jahat'
sumber
Aku tahu itu dengan cara, saya hanya berharap itu bukan satu-satunya cara, bahkan jika cara-cara lain yang aneh atau berubah-ubah atau apa pun. Baiklah!
user67459
2
Jawaban ini TIDAK seharusnya ditandai sebagai answeredjawabannya. OP secara khusus meminta more ways to see if a given host is up, selain dengan ping, yang tidak disediakan jawaban ini.
Yokai
Dari halaman manual '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 Paragraf itu bisa saja lebih baik. Ini terlalu mengkhawatirkan. Anda tidak boleh melakukan ping banjir atau ping dengan tingkat yang sangat tinggi, tetapi satu paket ping sekarang dan kemudian diabaikan.
Gilles 'SANGAT berhenti menjadi jahat'
2

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 trueperintah dan kemudian menutup koneksi. The sshperintah 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 mysqlditu 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 monitpada 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 rsyncitu, sehingga Anda tidak sengaja mengisi disk utama jika sistem file sekunder tidak dipasang karena alasan tertentu. Misalnya ini akan memastikan bahwa /mnt/raidsudah 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 telnetke 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 timeoutdan 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
Malvine
sumber