Bagaimana saya bisa mengatur batas waktu singkat dengan perintah ping?


49

Saya mencoba menulis skrip yang berisi daftar semua host di LAN saya (ada sekitar 20 di antaranya) dan menulis status ping di sebelah setiap host. Saya memiliki file penyewaan DHCP, jadi saya memiliki semua IP (katakanlah, 10.0.0.1, 10.0.0.2, dll.), Yang saya butuhkan hanyalah status ping untuk setiap host.

Jadi, skrip saya meluncurkan satu ping untuk setiap host:

ping -c 1 10.0.0.1

Sayangnya, ketika sebuah host sedang offline, ping membutuhkan waktu lama untuk habis. Saya memeriksa man ping, sepertinya ada dua opsi untuk mengatur waktu tunda: -w deadlinedan -W timeout. Saya pikir saya tertarik pada yang terakhir.

Jadi saya mencoba ini:

ping -c 1 -W 1 10.0.0.1

Tetapi menunggu satu detik per host offline masih terlalu lama. Saya mencoba mengaturnya di bawah satu detik, tetapi sepertinya tidak mempertimbangkan parameter sama sekali:

ping -c 1 -W 0.1 10.0.0.1  # timeout option is ignored, apparently

Apakah ada cara untuk mengatur batas waktu ke nilai yang lebih rendah? Jika tidak, apakah ada alternatif lain?

Sunting

  • OSnya adalah Debian Lenny.
  • Host yang saya coba ping sebenarnya adalah titik akses. Mereka berada di vlan dan subnet yang sama dengan pengguna (untuk kesederhanaan penempatan dan penggantian). Inilah sebabnya saya tidak ingin memindai semua subnet (dengan ping -bmisalnya).

Edit # 2

Saya menerima fpingsolusinya (terima kasih atas semua jawaban lain). Perintah ini melakukan persis apa yang saya cari:

fping -c1 -t500 10.0.0.1 10.0.0.2 10.0.0.3 10.0.0.4

Perintah ini membutuhkan paling banyak 500ms untuk menyelesaikan, dan memberi saya status ping semua host sekaligus:

10.0.0.1 : [0], 84 bytes, 5.71 ms (5.71 avg, 0% loss)
10.0.0.2 : [0], 84 bytes, 7.95 ms (7.95 avg, 0% loss)
10.0.0.3 : [0], 84 bytes, 16.1 ms (16.1 avg, 0% loss)
10.0.0.4 : [0], 84 bytes, 48.0 ms (48.0 avg, 0% loss)

10.0.0.1 : xmt/rcv/%loss = 1/1/0%, min/avg/max = 5.71/5.71/5.71
10.0.0.2 : xmt/rcv/%loss = 1/1/0%, min/avg/max = 7.95/7.95/7.95
10.0.0.3 : xmt/rcv/%loss = 1/1/0%, min/avg/max = 16.1/16.1/16.1
10.0.0.4 : xmt/rcv/%loss = 1/1/0%, min/avg/max = 48.0/48.0/48.0

Pada Debian Lenny, instalasi itu sepele:

aptitude update
aptitude install fping

Jawaban:


41

fping mungkin merupakan alat yang lebih baik daripada stock ping yang Anda gunakan. OS apa yang Anda pakai?

  • "fping berbeda dari ping di mana Anda dapat menentukan sejumlah target pada baris perintah, atau menentukan file yang berisi daftar target untuk melakukan ping."
  • "Alih-alih mengirim ke satu target sampai waktu habis atau balasan, fping akan mengirim paket ping dan pindah ke target berikutnya dengan cara round-robin."
  • "Tidak seperti ping, fping dimaksudkan untuk digunakan dalam skrip, jadi hasilnya dirancang agar mudah diurai."

1
Bagus sekali, terima kasih, inilah yang saya cari. Perintah ini berfungsi dengan baik: fping -c1 -t500 10.0.0.1 10.0.0.2 10.0.0.3 ... Semuanya berlangsung setengah detik, dan saya mendapatkan hasil untuk semua host sekaligus. Alat luar biasa. :-))
MiniQuark

38

Untuk orang yang mencari solusi yang melibatkan ping, gunakan -isaklar.

ping -i 0.2 www.google.com

Atau, jika Anda ingin menggunakan 0,1, Anda harus menjalankannya sebagai root

sudo ping -i 0.1 www.google.com

Tidak perlu mengunduh utilitas tambahan.


4
+1 dari saya. Ini adalah hasil pertama ketika googling "ping timeout", dan inilah yang saya cari.
Steven Jeffries

@ SevenJeffries Sama di sini!
Luc

1
Jika tuan rumah mati, solusi ini akan mencetak keluaran berguna pertama setelah sekitar 1 detik. Ini jelas jawaban yang salah karena @MarcelBurkhard sudah disebutkan.
Victor Yarema

1
Masalah dengan solusi ini adalah -i 0,1 TIDAK akan menunggu 100 ms, tetapi lebih lama, untuk ping yang membutuhkan lebih dari 100 ms, sehingga membuang waktu.
Llamageddon

2
Jawaban ini salah - tidak mengubah berapa lama pingakan menunggu jawaban - melainkan hanya mengirim ping berturut-turut lebih cepat ....
Mtl Dev

21

Anda dapat mengatur batas waktu singkat dengan timeoutperintah di Ubuntu / Debian:

timeout 0.2 ping -c1 fqdn || { do_work }

Jawaban yang bagus! Saya sekarang: timeout 1 ping -c 1
test.com

1
Versi batas waktu saya hanya menerima 1 detik. timeout (GNU coreutils) 8.4.
slm

saya suka solusi ini, ini dapat diterapkan ke semua perintah lain
datdinhquoc

@slm, aneh bahwa versi Anda tidak mendukung kurang dari satu detik. Ini berfungsi untuk saya: DURATION is a floating point number with an optional suffix: 's' for seconds (the default),... Dalam man timeoutlaporan kasus saya GNU coreutils 8.26. BWT, saya menggunakan Ubuntu 17.04.
Victor Yarema

Ini sebenarnya satu-satunya hal yang berfungsi jika Anda ingin mengurangi timeout (host tidak merespons) ... Anda harus melakukan perhitungan matematika: timeout harus lebih besar dari "-c" * "-i" dari perintah ping-
Marki

13

Saya akan menggunakan nmap untuk tugas ini.

nmap -sP --max-retries=1 --host-timeout=1500ms 10.0.0.1

Lihat Dokumentasi nmap untuk detail lebih lanjut tentang ini.


Panggilan bagus .. Ini adalah cara "Luar Biasa" untuk melakukannya: D +1
Arenstar

Hai, saya baru saja mencoba ini, tetapi saya mendapat pesan kesalahan berikut: "--host-timeout ditentukan dalam milidetik kecuali Anda memenuhi syarat dengan menambahkan 's', 'm', 'h', atau 'd'. Nilainya harus lebih besar dari 1500 milidetik ".
MiniQuark

Saya pikir masalahnya jelas, batas waktu tidak bisa lebih pendek dari 1500ms. Daripada Anda harus mencari opsi nmap mendapatkan kembali paralelisme saya pikir.
Pacey

Ini sepertinya hanya mengirim satu permintaan. Saya mencari deteksi kesalahan terus menerus, saya tiba di sini dengan Googling "ping millisecond timeout", Apakah nmap menawarkan ping kecil seperti ping ubuntu?
ThorSummoner

mengatur batas waktu untuk sesuatu yang lebih rendah dari satu detik akan melibatkan penggunaan pengguna istimewa seperti dalam @ victor-bjelkholm answer
thrau

4

Anda mungkin ingin melihat alat ping arp jika semua host Anda berada di LAN fisik. Ini melakukan hal yang sama tetapi menggunakan paket arp layer 2 untuk melakukan 'ping'. Anda dapat menggunakan kombinasi arpping dan icmp ping, atau bahkan tcp ping, untuk mengetahui kegagalannya. Contohnya adalah crash tcp stack, meskipun jarang hari ini, kami dapat menemukan jika mesin tcp stack mengalami crash, karena mesin tidak akan merespons ping, namun akan merespons ke arp (yang merupakan bagian kode berbeda pada host) .

menggunakan kombinasi arpping, tcpping, dan icmp ping Anda dapat mengetahui apakah layanan pada mesin mengalami kerusakan, tumpukan tcp macet, atau mesin telah terkunci sepenuhnya. Jika Anda telah mengatur sakelar ethernet, Anda dapat memperoleh data tautan fisik, mengungkapkan apakah mesin tersebut benar-benar dihidupkan, atau telah dicabut secara fisik. Kami memiliki situasi di mana mesin (klien di ruang publik) akan dimatikan, kami mengumpulkan data dan bangun yang dikirim pada paket LAN, untuk menyalakan mesin. :-)

Solusi apa pun yang Anda buat, jika jaringan Anda sibuk, pikirkan penerapan beberapa jenis qo, sehingga paket pemantauan Anda menjadi prioritas pada jaringan, kehilangan paket pengukuran karena kemacetan jaringan dapat memberikan alarm palsu. Jika memang menggunakan qo untuk memantau paket, maka Anda harus berpikir tentang mengumpulkan data tentang pemanfaatan jaringan.

Jadi, Anda dapat membuat solusi pemantauan Anda serumit atau semudah yang Anda suka. Kami menemukan bahkan sistem pemantauan paling dasar adalah langkah ke arah yang benar, setidaknya beberapa administrator mengawasi mesin :-).

semoga berhasil!


3

@ jordon-bedwell punya saran bagus.

@ laszlo-valko https://stackoverflow.com/questions/20359487/why-does-ping-not-timeout-in-linux menjelaskan bahwa waktu tunggu ping hanya dimulai setelah alamat ip telah ditentukan. Jika Anda menggunakan dns dan workstation Anda sedang luring maka ping tidak dapat menentukan alamat ip dan tampaknya menunggu sekitar 20 + detik default sebelum mengembalikan false.

Menggunakan alat 'batas waktu' linux memberikan lebih banyak kontrol saat menjalankan ping dengan nama domain.

Terima kasih kawan


2

Gunakan sakelar -w , baik pada Windows dan Debian.

Ini adalah cara cepat untuk memeriksa apakah mesin merespons sama sekali, dengan asumsi mesin akan merespons dalam waktu kurang dari jumlah detik yang ditentukan.

ping -w 1 192.168.80.105

PING 192.168.80.105 (192.168.80.105) 56(84) bytes of data.

--- 192.168.80.105 ping statistics ---
2 packets transmitted, 0 received, 100% packet loss, time 999ms

1

Jika Anda dapat memindai subnet Anda (atau bagian dari itu) tanpa memicu alarm keamanan, dan tidak keberatan sedikit data tambahan, Angry IP Scanner cepat, gratis, memungkinkan Anda mengklik untuk mengurutkan berdasarkan status, dan dapat memberikan informasi lebih rinci .


0

Mengapa tidak meluncurkan ping di latar belakang, dengan output ke file sementara, secara paralel untuk setiap host? Kemudian tidur selama satu detik, matikan semua proses ping yang masih berjalan, dan baca file untuk mengumpulkan output.


1
Saya kira itu akan berhasil, tetapi saya sedang mencari solusi yang lebih sederhana. Bagaimanapun, terima kasih.
MiniQuark

Metode ini tidak ditingkatkan.
Synetech

0

Batas waktu adalah nilai integer yang menunjukkan seberapa jauh dan lama paket dapat dikirim. Nilai di bawah 1 tidak ada artinya. Nilai 1 menunjukkan Anda hanya melakukan ping tetangga langsung.

Satu-satunya cara untuk mempercepat adalah menjalankan pemeriksaan latar belakang dan memanen hasilnya. Inilah yang dilakukan alat seperti nagios.


2
Maaf, tapi saya benar-benar tidak berpikir ini benar. Halaman manual cukup jelas bahwa -W menentukan "Waktu untuk menunggu respons, dalam detik"; itu tidak berdimensi, dan meskipun ping tidak menghormati nilai-nilai di bawah 1 (maka pertanyaannya) timeout sub-detik tidak berarti. Jika Anda memaafkan saya, Anda mungkin membingungkan -W dengan -t, yang terakhir mengatur bidang IP TTL (jumlah hop), yang berperilaku seperti yang Anda jelaskan, dan di mana nilai di bawah 1 memang tidak berarti.
MadHatter mendukung Monica

-W adalah saat proses ping menunggu tanggapan, dan mungkin masuk akal untuk mengaturnya jauh di bawah jumlah hop ketika jumlah hop tinggi, yang biasanya. Dengan tiga detik Anda biasanya masuk ke kondisi coba lagi. Beberapa alat memungkinkan penggunaan timer berbutir halus untuk menunggu, tetapi untuk sebagian besar penggunaan ping, detik adalah unit yang masuk akal.
BillThor

0

Anda dapat mencoba sesuatu seperti ini. Tapi butuh 15 menit untuk berlari.

a=258
while [ $a -ge 1 ]
do
    echo "10.0.0.$a"
    sudo ping -i 0.1 -c 1 "10.0.0.$a">>/home/$USER/output.log
   a=`expr $a - 1`
done
cat /home/$USER/output.log|grep -i "icmp_req=1"
cat /dev/null>/home/$USER/output.log

Sepertinya nmapakan menjadi alat yang tepat untuk pekerjaan itu.
kasperd


-1

ping memiliki opsi [-t timeout] dan [-W waittime] sehingga Anda dapat melakukan:

ping -c 1 -t 1 -W 1 google.com
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.