2010-08-24 12 views
12

Quiero hacer ping a un sitio en mi código de ruby ​​y vi que net-ping era una buena biblioteca para hacer esto. Por desgracia, cuando traté de instalar la gema neta de ping-Tengo el siguiente error:ruby ​​ping para 1.9.1

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

tras una posterior investigación, me encontré con que la red de ping-aún no estaba disponible para 1.9.X. ¿Alguien tiene un buen código que dice que estaría dispuesto a compartir?

+0

Si realmente necesita hacer ping ICMP, siempre puede usar la herramienta nativa del sistema operativo como '' ping -c 1 host'' y analizar el resultado. – taro

Respuesta

12

Siempre se puede hacer esto y utilizar expresiones regulares para analizar el resultado o simplemente comprobar el estado de salida:

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

valores de retorno de ping que se puede comprobar en contra:

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

Simplemente comprobando si un dispositivo está activo antes de ejecutar el resto de mi código. Además, intenté tu código, ¿cómo veo los resultados del ping? – rahrahruby

+0

Ver respuesta editada. – Mahmoud

+2

Esta fue la pista que necesitaba para usar '\' ping -t 1 ipinfodb.com \ '' para tener un tiempo de espera activo en funcionamiento y para averiguar si ipinfodb.com está en línea. Timeout y SystemTimer no funcionaron de alguna manera y esperaron 60 segundos completos para arrojar un error. ¡Gracias! –

14

Si por 'sitio' quieres decir sitio web, entonces no usaría ping. Ping le dirá si el host está activo (a menos que un enrutador o un firewall esté bloqueando ICMP), pero no le indicará si su servidor web o aplicación web está respondiendo correctamente.

Si ese es el caso, recomendaría Net :: HTTP de la biblioteca estándar o cualquiera de las otras bibliotecas HTTP. Una forma de hacerlo es:

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

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

También el sitio puede denegar solicitudes que no sean del navegador. Compare www.habrahabr.ru y www.google.ru. Por lo tanto, debe examinar la respuesta más de cerca y/o jugar con los agentes de usuario. – Nakilon

+0

Tuve problemas con este código en Windows y recibí una "Mala puerta de enlace" para un sitio en funcionamiento. Podría solucionarlo usando "get" en lugar de "head". Tal vez esto ayude a alguien en Windows. – mit

+0

@mit Suena como si golpeara un proxy que no fuera de especificación y no pudiera manejar las solicitudes 'HEAD'. Me alegra que lo haya conseguido trabajando con 'get'. –

1

Uso de source

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

Ahora puede utilizar las funciones de éste en 1.9.2

2

En Windows, siga estas instrucciones:

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 

para usarlo:

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