2010-08-24 6 views
12

Ich möchte eine Website in meinem Ruby-Code pingen und sah, dass Net-Ping eine nette Bibliothek war, um dies zu tun. Leider, als ich versuchte, gem net-ping installiere ich die folgende Fehlermeldung anzeigt:ruby ​​ping für 1.9.1

C:>gem install net-ping
ERROR: Error installing net-ping:
win32-open3 requires Ruby version < 1.9.0.

auf die weitere Forschung, fand ich, dass die Netto-ping war noch nicht verfügbar für 1.9.X. Hat irgendjemand einen guten Code, der pingt, den sie teilen würden?

+0

Wenn Sie wirklich ICMP-Ping durchführen müssen, können Sie immer native OS-Tools wie '' ping -c 1 host'' verwenden und Ergebnisse analysieren. – taro

Antwort

12

Sie können dies immer tun, und regexps verwenden um das Ergebnis zu analysieren oder prüfen nur den Exit-Status:

ping_count = 10 
server = "www.google.com" 
result = `ping -q -C#{ping_count} #{server}` 
if ($?.exitstatus == 0) do 
    puts "Device is up!" 
end 

Ping Rückgabewerte, die Sie gegen überprüfen:

The ping utility returns an exit status of zero if at least one response was heard from the specified host; a status of two if the transmission was successful but no responses were received; or another value (from <sysexits.h>) if an error occurred.

http://www.manpagez.com/man/8/ping

+0

Überprüfen Sie einfach, ob ein Gerät aktiv ist, bevor ich den Rest meines Codes ausführe. Versuchen Sie auch Ihren Code, wie sehe ich die Ergebnisse des Ping? – rahrahruby

+0

Siehe bearbeitete Antwort. – Mahmoud

+2

Das war der Hinweis, den ich brauchte, um '\ 'ping -t 1 ipinfodb.com \' 'zu verwenden, um eine funktionierende Zeitüberschreitung zu haben und herauszufinden, ob ipinfodb.com online ist. Timeout und SystemTimer funktionierten irgendwie nicht und warteten 60 Sekunden auf einen Fehler. Vielen Dank! –

14

Wenn Sie mit "Website" meine Website meinen, würde ich keinen Ping verwenden. Ping teilt Ihnen mit, ob der Host aktiv ist (es sei denn, ein Router oder eine Firewall blockiert ICMP), aber Sie erfahren nicht, ob Ihr Webserver oder Ihre Webanwendung richtig reagiert.

Wenn das der Fall ist, empfehle ich Net :: HTTP aus der Standardbibliothek oder einer der anderen HTTP-Bibliotheken. Eine Möglichkeit, es zu tun ist:

def up?(site) 
    Net::HTTP.new(site).head('/').kind_of? Net::HTTPOK 
end 

up? 'www.google.com' #=> true 
+1

Die Site kann auch Nicht-Browser-Anfragen ablehnen. Vergleichen Sie www.habrahabr.ru und www.google.ru. Sie müssen also näher auf die Antwort schauen und/oder mit User-Agents spielen. – Nakilon

+0

Ich habe Probleme mit diesem Code in Windows erfahren und ein "Bad Gateway" für eine funktionierende Site erhalten. Ich könnte es umgehen mit "Get" anstelle von "Kopf". Vielleicht hilft das jemandem bei Windows. – mit

+0

@mit Klingt, als ob du einen Proxy getroffen hättest, der nicht zur Spezifikation gehört und keine HEAD-Anfragen beantworten konnte. Freut mich, dass du mit 'get' gearbeitet hast. –

1

Verwendung von source

gem "net-ping", :git => 'git://github.com/djberg96/net-ping.git' 
# bundle install 

Jetzt können Sie von ihm verwenden Funktionen in 1.9.2

2

Für Fenster gehen Sie folgendermaßen vor:

download djberg96-net-ping-net-ping-1.5.3-0-g9252076.zip from github.com/djberg96/net-ping 
unzip, cd in the folder 
gem build net-ping.gemspec 
gem install net-ping-1.5.3-universal-mingw32.gem 
gem install win32-security 

es zu verwenden:

require 'net/ping' 
p Net::Ping::TCP.new('www.google.com', 'http').ping? 
p Net::Ping::TCP.new('foo.bar.baz').ping?