Cara lebih cepat daripada ping untuk memeriksa apakah komputer online?

20

Saya sedang menulis wake on script lan untuk satu set komputer lab kami. Kami memiliki sqlite db dengan daftar nama host komputer, IP, dan MAC dan saat ini saya melakukan ping masing-masing dengan '-c1' sehingga tidak berjalan tanpa henti - tetapi bahkan yang membutuhkan waktu menunggu, apakah ada cara yang lebih cepat untuk mendapatkan jawab daripada ping? Menggunakan ping tampaknya memperlambat script sedikit karena membutuhkan jawaban ping untuk melanjutkan.

Terima kasih banyak atas sarannya!

Jon Phenow
sumber

Jawaban:

20

Mengirim satu paket dan menunggu jawaban akan menjadi salah satu cara tercepat yang mungkin, dan ping adalah cara yang baik untuk melakukan itu. Sebenarnya, tergantung pada kasus penggunaan Anda, saya berpendapat bahwa itu terlalu cepat , karena tidak benar-benar memberitahu Anda jika sistem benar-benar melakukan sesuatu yang bermanfaat, hanya saja subsistem jaringan kernel masih hidup dan terkonfigurasi.

Tetapi dengan asumsi itu cukup bagus, Anda dapat melakukan beberapa perbaikan. Pertama, Anda bisa menggunakan -W1untuk mengurangi waktu ping menjadi satu detik. Kedua, Anda bisa membuat skrip Anda melakukan ping ke host yang berbeda secara tidak sinkron (di utas latar belakang), dan memeriksa hasilnya sesuai kebutuhan alih-alih menunggu.

Sebagai alternatif, Anda dapat memikirkan kembali pendekatannya dan meminta sistem jarak jauh untuk memeriksa kapan saja ketika mereka naik, dan jika suatu sistem belum masuk, Anda dapat menganggap itu turun.

mattdm
sumber
Panggilan yang baik pada penambahan -w, harus membuatnya dua meskipun menyebabkan banyak komputer tidak merespon cukup cepat. Bisa melihat menambahkan semacam check-in berkala juga atau berjabat tangan tetapi untuk sekarang ingin memiliki proses yang relatif eksternal untuk komputer yang saya nyalakan.
Jon Phenow
1
Saya juga menggunakan -s untuk mengirim paket yang lebih kecil.
Shawn J. Goff
3
Saya akan terkejut jika mengirim paket yang lebih kecil membuat perbedaan.
mattdm
Bukankah sudah cukup banyak dikirim pada ukuran paket minimum dekat?
Jon Phenow
4
Mereka cukup kecil; ada standar 56 byte data, yang dapat Anda kurangi. Tetapi bagaimanapun juga, ini lebih kecil dari MTU ethernet dan lebih besar daripada tidak sama sekali, jadi turun ke "satu paket".
mattdm
7

Inilah yang dirancang untuk fping. http://fping.sourceforge.net/

Anda perlu mem-parsing output sesudahnya alih-alih mengandalkan kode kembali, tetapi jauh lebih cepat daripada melakukan ping normal.

Thorbjørn Ravn Andersen
sumber
Saya pikir ini agak lucu deskripsi mengatakan "Tidak seperti ping, fping dimaksudkan untuk digunakan dalam skrip dan hasilnya mudah diurai." namun itu tidak memberikan kode kembali
Adam Plocher
Apa nilai yang baik untuk kode pengembalian?
Thorbjørn Ravn Andersen
3

Ini hanya akan berfungsi untuk satu atau dua komputer, tetapi jika Anda menghubungkannya langsung ke komputer yang bertanggung jawab untuk memeriksa statusnya, Anda dapat menggunakannya ethtooluntuk melihat apakah tautannya aktif atau tidak.

LawrenceC
sumber
Saya belum menggunakan ethtool untuk ini, apakah Anda ingin memberi contoh? (atau mungkin tautan)?
Johan
ethtool {network_interface} | grep "Link detected" | cut -f 3 -d ' 'akan kembali yesjika mesin terhubung, dan nojika tidak.
LawrenceC
2

Apa yang bisa Anda lakukan dengan melakukan ping ke alamat broadcast yang seharusnya menyebabkan semua komputer melakukan ping kembali. Kemudian Anda bisa mengecek daftar ini terhadap apa yang Anda miliki di SQLite untuk memastikan semua komputer menyala.

Selain itu, ping mungkin merupakan cara tercepat untuk memastikan komputer terjaga di jaringan. Seperti yang disebutkan oleh jawaban lain ini tidak memberikan data yang benar-benar berguna. Jika Anda memiliki kemampuan untuk menginstal skrip, Anda dapat menambahkan cronjob untuk melakukan ping ke server pusat, menjalankan tugas, atau hanya menggema daftar proses ke server pusat yang akan mencatat permintaan. Kemudian cukup memeriksa yang akan memberi tahu Anda jika Anda memiliki masalah tanpa perlu memeriksa secara manual setiap waktu.

Josh K.
sumber
1
Saya berasumsi maksud Anda ping alamat broadcast, bukan gateway. Pada sistem modern, itu mungkin tidak akan berhasil. Lihat unix.stackexchange.com/questions/7458/cant-ping-broadcast
mattdm
1
@mattdm: Multicast ? Saya tidak sadar kebanyakan orang mematikannya. Saya belum pernah mengalami masalah dengan itu sebelumnya.
Josh K
Haha ya terima kasih mattdm, masalah serupa yang Anda lihat saya bertemu. bukan berarti orang mematikannya tetapi mereka umumnya datang dengan siaran akhir-akhir ini rupanya.
Jon Phenow
Bisa menggunakan fping ( fping.sourceforge.net ) untuk melakukan ping daftar host secara paralel. Maka Anda tidak harus bergantung untuk bisa melakukan ping alamat broadcast.
mazianni
2

Ganglia menggunakan lalu lintas multicast untuk memantau banyak host dalam sebuah cluster, mungkin Anda bisa menggunakan sesuatu yang serupa? Ini mengasumsikan bahwa perangkat keras jaringan Anda memungkinkan lalu lintas multicast antara semua host dan sistem pemantauan Anda.

jsbillings
sumber
1
Sepertinya alat yang keren tapi untuk keperluan skrip kecil ini mungkin menambahkan beberapa potongan yang tidak perlu ke proyek, menyimpannya sebagai skrip yang cukup kecil untuk saat ini. Akan pasti akan mengawasi saya meskipun, sepertinya alat yang mungkin saya gunakan segera non-the-less.
Jon Phenow
0

Saya memiliki masalah yang sama dan muncul dengan skrip (cepat & kotor) berikut. Ini pada dasarnya mengeluarkan semua ping sebagai pekerjaan terpisah secara paralel dan akan memindai seluruh / 24 subnet dalam 3 detik; perhatikan bahwa karena alasan tertentu saya tidak repot-repot mencari tahu saya tidak bisa menggunakan kode hasil ping di sini tetapi grep -v melakukan pekerjaan:

#!/bin/bash
case $# in
1)
  case $1 in
  [1-9]*)
        echo
        echo Systems active in subnet: $1
        for (( K = 1 ; K < 255 ; K=$K+1 )); do
        # grep -v delivers 0 on no matches
                echo -ne "testing:" $1$K "...    \r"
                (if ping -c 1 -w 1 -n $1$K 2>&1 | grep -q '64 bytes' ; then
                echo $1$K alive "                "
                fi) &
        done
        sleep 3
        echo "                               "
        exit 0
        ;;
  esac;;
esac
Teman sebaya
sumber
0

Dalam C,

/* count = 1, wait interval = 1 second, no name lookup, */
/* 10 data bytes, 1 second timeout, 200 millisecond wait time */

sprintf(command,"ping -c1 -i1 -n -s10 -t1 -W200 %u" 
   , connection[port].IPAddress);
err = system(command);
/* err == 0 means OK */
Joe
sumber
0

Saya telah menemukan fping -r0 ...untuk memberikan respons tercepat.

Opsi -r(coba lagi) tampaknya lebih cepat daripada -c(hitungan) yang serupa . Menggunakan -r0hasil hanya dalam satu ping yang dikirim dan hasilnya jauh disingkat dibandingkan dengan opsi lain.

Di sistem saya ...

fping -r0 PRINTER LX00 LX01 LX02 LX03 HA01  2>&1

Hasil dalam ...

LX00 is alive
LX02 is alive
HA01 is alive
ICMP Host Unreachable from 192.168.1.5 for ICMP Echo sent to LX01
PRINTER is unreachable
LX01 is unreachable
LX03 is unreachable

Sedikit pemijatan untuk menghilangkan ICMPpesan memberi saya ...

fping -r0 PRINTER LX00 LX01 LX02 LX03 HA01  2>&1 | grep ' is ' | sort

HA01 is alive
LX00 is alive
LX01 is unreachable
LX02 is alive
LX03 is unreachable
PRINTER is unreachable

Adapun kecepatan, fpingpada Intel Dual-Core 1.8GHz tua ini dengan RAM 4GB adalah ...

time fping -r0 PRINTER LX00 LX01 LX02 LX03 HA01 2>&1

LX00 is alive
LX02 is alive
HA01 is alive
PRINTER is unreachable
LX01 is unreachable
LX03 is unreachable

real    0m0.554s
user    0m0.000s
sys     0m0.000s

Dan grepdan sorttampaknya hanya menambah 0,001-0,004 ke waktu ...

time fping -r0 PRINTER LX00 LX01 LX02 LX03 HA01 2>&1 | grep ' is ' | sort

HA01 is alive
LX00 is alive
LX01 is unreachable
LX02 is alive
LX03 is unreachable
PRINTER is unreachable

real    0m0.558s
user    0m0.000s
sys     0m0.000s

CATATAN

  • The ICMPpesan tidak terjadi pada setiap run.
  • Hal 2>&1ini diperlukan untuk mencegah agar ICMPpesan tidak muncul di output saat dikirim stderrsebagai gantinya stdout.
DocSalvager
sumber