Bilgisayarın çevrimiçi olup olmadığını kontrol etmek için pingten daha hızlı bir yol var mı?


20

Laboratuar bilgisayarlarımız için lan senaryosunda bir uyanma yazıyorum. Bilgisayar ana bilgisayar adları, IP'ler ve MAC'ların bir listesini içeren sqlite db var ve şu anda her birine '-c1' ile ping atıyorum, bu yüzden sonsuz çalışmaz - ama bu biraz beklemek bile, daha hızlı bir yol var mı ping yerine cevap? Ping kullanımı, devam etmek için ping cevaplarına ihtiyaç duyduğu için komut dosyasını biraz yavaşlatıyor.

Herhangi bir öneri için çok teşekkürler!

Yanıtlar:


20

Tek bir paket göndermek ve bir yanıt beklemek mümkün olan en hızlı yollardan biri olacaktır ve ping bunu yapmanın iyi bir yoludur. Aslında, kullanım durumunuza bağlı olarak, bunun çok hızlı olduğunu iddia ediyorum , çünkü sistemin gerçekten yararlı bir şey yapıp yapmadığını gerçekten söylemez, sadece çekirdeğin ağ alt sisteminin canlı ve yapılandırılmış olduğunu söyler.

Ancak bunun yeterince iyi olduğunu varsayarsak, bazı iyileştirmeler yapabilirsiniz. İlk olarak, -W1ping zaman aşımını bir saniyeye düşürmek için kullanabilirsiniz . İkinci olarak, komut dosyanız farklı ana bilgisayarlara eşzamansız olarak (bir arka plan iş parçacığında) ping yapabilir ve sonuçları beklemek yerine gerektiği gibi kontrol edebilirsiniz.

Alternatif olarak, yaklaşımı yeniden düşünebilir ve uzaktaki sistemlerin ne zaman hazır olduklarını bir şekilde kontrol etmelerini sağlayabilirsiniz ve bir sistem check-in yapmadıysa, bunun kapalı olduğunu varsayabilirsiniz.


-W ek iyi çağrı, bir grup bilgisayar yeterince hızlı yanıt vermedi neden olsa iki yapmak zorunda kaldı. Bir tür periyodik check-in veya el sallamak eklemeye bakabiliriz, ancak şimdilik süreci açtığım bilgisayarlara nispeten harici yapmak istiyorum.
Jon Phenow

1
Ayrıca daha küçük bir paket göndermek için -s kullanıyorum.
Shawn J. Goff

3
Daha küçük bir paket göndermek fark yaratırsa şok olurum.
mattdm

Zaten minimum paket boyutunda gönderilmiyorlar mı?
Jon Phenow

4
Oldukça küçükler; varsayılan olarak azaltabileceğiniz 56 veri baytı vardır. Ama her durumda, ethernet MTU'dan daha küçük ve hiçbir şeyden daha büyük, bu yüzden her iki şekilde de "tek bir pakete" iniyor.
mattdm

7

Fping bunun için tasarlandı. http://fping.sourceforge.net/

Bir dönüş koduna güvenmek yerine çıkışı daha sonra ayrıştırmanız gerekir, ancak normal ping yapmaktan çok daha hızlıdır.


Bence bu açıklama komik "ping aksine, fping komut dosyalarında kullanılmak üzere tasarlanmıştır ve çıktı ayrıştırmak kolaydır." ve yine de bir dönüş kodu sağlamaz
Adam Plocher

Dönüş kodu için iyi değerler ne olurdu?
Thorbjørn Ravn Andersen

3

Bu yalnızca bir veya iki bilgisayar için çalışır, ancak bunları doğrudan durumlarını kontrol etmekten sorumlu bilgisayara bağlarsanız ethtool, bağlantının etkin olup olmadığını görmek için kullanabilirsiniz .


Bunun için ettool kullanmadım, bir örnek vermek ister misiniz? (veya bir bağlantı)?
Johan

ethtool {network_interface} | grep "Link detected" | cut -f 3 -d ' 'yesbir makine bağlıysa ve bağlı değilse geri dönecektir no.
LawrenceC

2

Yapabileceğiniz şey, tüm bilgisayarların geri ping göndermesine neden olması gereken yayın adresine ping atmaktır. Daha sonra tüm bilgisayarların çalıştığından emin olmak için bu listeyi SQLite'takilere karşı kontrol edebilirsiniz.

Diğer bir ping muhtemelen bir bilgisayarın bir ağda uyanık olmasını sağlamak için en hızlı yoludur. Diğer cevapta belirtildiği gibi, bu gerçekten yararlı bir veri sağlamaz. Komut dosyaları yükleme olanağınız varsa, merkezi bir sunucuya ping atmak için bir cronjob ekleyebilir, bir görevi çalıştırabilir veya işlem listesini isteği kaydeden merkezi bir sunucuya yansıtabilirsiniz. Daha sonra bunu kontrol etmek, her seferinde manuel olarak kontrol etmeye gerek kalmadan herhangi bir sorununuz olup olmadığını söyleyecektir.


1
Sanırım ağ geçidine değil, yayın adresine ping atmak istiyorsun. Modern sistemlerde, bu muhtemelen işe yaramaz. Bkz. Unix.stackexchange.com/questions/7458/cant-ping-broadcast
mattdm

1
@mattdm: Çok noktaya yayın ? Çoğu insanın bunu kapattığının farkında değildim. Daha önce bununla ilgili bir sorunla karşılaşmadım.
Josh K

Haha evet teşekkürler mattdm, gördüğüm benzer bir problemle karşılaştım. bu insanların onları kapatması değil, ancak görünüşe göre son zamanlarda yayın ile geliyorlar.
Jon Phenow

Paralel bir ana bilgisayar listesine ping işlemi yapmak için fping ( fping.sourceforge.net ) kullanabilirsiniz. O zaman yayın adresine ping atmak zorunda değilsiniz.
mazianni

2

Ganglia , bir kümedeki birçok ana bilgisayarı izlemek için çok noktaya yayın trafiğini kullanır, belki de benzer bir şey kullanabilirsiniz? Bu, ağ donanımınızın tüm ana bilgisayarlar ve izleme sisteminiz arasında çok noktaya yayın trafiğine izin verdiğini varsayar.


1
Harika bir araç gibi görünüyor, ancak bu küçük komut dosyasının amaçları için projeye gereksiz bir yığın ekleyebilir ve şimdilik küçük bir komut dosyası olarak tutabilir. Kesinlikle gözüme devam edecek, yakında az kullanabileceğim bir araç gibi görünüyor.
Jon Phenow

0

Aynı sorunu vardı ve aşağıdaki (hızlı ve kirli) komut dosyası ile geldi. Bu, tüm pingleri paralel olarak ayrı işler olarak verir ve tüm / 24 alt ağı 3 saniye içinde tarar; Nedense burada ping sonuç kodunu kullanamadı bulmak için uğraşmadı unutmayın ama grep -v işi yaptı:

#!/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

0

C dilinde,

/* 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 */

0

Bulduğum fping -r0 ...en hızlı şekilde yanıt verebilmek.

-r( Tekrar dene) seçeneği benzer -c(sayım) seçeneğinden daha hızlı görünür . Kullanımı -r0sadece bir ping sonuçları gönderiliyor ve çıkış çok diğer seçeneklere göre kısaltılır.

Sistemimde ...

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

Sonuçlar ...

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

ICMPMesajlardan kurtulmak için biraz masaj yapmak bana ...

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

Hız gelince, fping4GB RAM ile bu eski 1.8GHz Intel Çift Çekirdekli ...

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

Ve grepve sortsadece zaman 0.001-0.004s eklemek gibi görünüyor ...

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

NOTLAR

  • ICMPMesaj her kaçak oluşmaz.
  • 2>&1Önlemek için gerekli ICMPmesajı da gönderilir olarak çıktı gösterilmesini stderryerine stdout.
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.