2010-06-18 8 views
3

Si je cours ouvert avec:Comment détecter un processus sans fin avec Ruby open3

entrée

, sortie, erreur = Open3.popen3 "nikto -host someip -port 80 -output xml"

Comment puis-je détecter si nikto est fait? L'analyse prend un certain temps.

Si quelque chose ne va pas, je suppose que je dois vérifier périodiquement l'erreur pour voir si quelque chose a été écrit?

Existe-t-il des documents décents pour open3? Non, les ruby-docs sont loin d'être décents.

Répondre

3
input, output, error = Open3.popen3 "nikto -host someip -port 80 -output xml" 

if select([output], nil, nil, 0.1) and output.eof? 
    # process exited and doesn't have output queued. 
else 
    # still running or has output not read yet. 
end 

Aussi, voici une bonne documentation que j'ai trouvé par googler: http://www.ensta.fr/~diam/ruby/online/ruby-doc-stdlib/libdoc/open3/rdoc/index.html

+0

Merci cette solution ne fonctionne pas, mais je suis sûr que vous me mettre sur la bonne voie. Ces docs sont les ruby-docs et ça craint absolument. – user370731

+0

@beavis - Vous pensez probablement que la documentation "craint" car elle ne contient que de la documentation pour le module. C'est parce que les variables retournées ne font pas partie de cette bibliothèque - ce sont des objets IO, et toutes leurs méthodes sont documentées sur http://ruby-doc.org/core-1.9/classes/IO.html. Il n'y a vraiment rien d'autre à documenter à propos de Open3 sans copier depuis ce lien. Les objets IO sont assez génériques. – Adrian

+0

Je comprends votre point de vue, mais ça craint parce qu'ils n'ont pas pris la peine de faire autre chose que de montrer 2 exemples simples. Je suppose qu'ils pensaient que personne ne l'utiliserait pour ajouter des entrées pendant une longue période de temps, ou même avoir une longue durée de vie. Peut-être que je vais utiliser une lecture non bloquante et attendre que l'exception EOF soit levée, car l'exemple de sélection ne fonctionne pas. Merci pour votre temps. – user370731

1

Si vous utilisez l'un * nix OS, votre processus recevra SIGCHLD quand un sort de sous-processus. Selon que vous avez ou non plus d'un sous-processus à la fois, cela peut être utilisé pour détecter quand il se termine.

De plus, les canaux IO vers le sous-processus sont implémentés sous le capot avec des tuyaux, donc vous obtiendrez définitivement un EOF à la fin de la sortie et éventuellement SIGPIPE quand il se ferme aussi.

Dans Ruby, l'installation d'un gestionnaire de signal est juste:

Signal.trap("CHLD") do 
    Process.wait 
    $child_died = true 
end 
0

sortie est vu après l'exécution de la commande se termine

Open3.popen3(cmd) do |stdin, stdout, stderr, wait_thr| 
    puts "stdout is:" + stdout.read 
    puts "stderr is:" + stderr.read 
end 

sortie est vu progressivement

Open3.popen3(cmd) do |stdin, stdout, stderr, wait_thr| 
    while line = stderr.gets 
    puts line 
    end 
end 

Cocher cette Plus d'options http://blog.bigbinary.com/2012/10/18/backtick-system-exec-in-ruby.html

Questions connexes