From: Sylvain Viart Date: 2008-10-01T00:36:11+09:00 Subject: Re: exception in thread? in Net::SSH::Multi Hi, Sylvain Viart a écrit : >> It would seem reasonable for session.exec to collect the status of >> each of the threads and return an array of them. I don't know if it >> does so. Perhaps you can use something like this: >> >> errs = [] >> ... >> :on_error => lambda { |server| errs << server } >> ... >> session.exec "hostname" >> unless errs.empty? >> puts "The command failed on #{errs.size} hosts" >> end > Hum, nice, I'm gonna try. :-) > Would it catch the Errno::EHOSTUNREACH? It didn't catch the exception a workaround, using a closure and Net::SSH::Multi::DynamicServer behavior, instead of specifying the server. It's evaluated by attempting the ssh connection first. Which mean the server, is connected twice, during the test and later in the session. Note that I discard the 'options' to test the connection. errs = [] def test_server(errs, server) lambda do |options| begin server =~ /(.+)@(.+)/ server_name, user = $2, $1 puts server_name s = Net::SSH.start(server_name, user) s.close s = server rescue Errno::EHOSTUNREACH, SocketError puts "echec connexion #{server} : #{$!}" errs << server s = nil end return s end end Net::SSH::Multi.start(:on_error => :warn) do |session| # define the servers we want to use session.use &test_server(errs, 'root@srv-04') session.use &test_server(errs, 'root@srv-07') session.use &test_server(errs, 'root@srv-08') session.use &test_server(errs, 'root@fail-08.local') # execute commands on all servers session.exec( "hostname" ) # run the aggregated event loop session.loop end unless errs.empty? puts "The command failed on #{errs.size} hosts" end #srv-04 #srv-07 #echec connexion root@srv-07 : No route to host - connect(2) #srv-08 #fail-08.local #echec connexion root@fail-08.local : getaddrinfo: Name or service not known #[srv-04] srv-04 #[srv-08] srv-08 #The command failed on 2 hosts Works, but I still don't know why the exception are not handled in the lib Net::SSH::Multi which may be specific to this lib. I still appreciate some more hint. Regards, Sylvain.