2009-12-29 4 views
3

Je courais le code (de sauvegarde) suivante dans un script Ruby:Comment imprimer la sortie de exec() en temps réel?

for directory in directories 
    print `s3sync.rb --exclude="#{EXCLUDE_REGEXP}" --delete --progress -r #{directory} my.amazon.backup.bucket:#{directory}` 
end 

Je voudrais que la sortie du sous-processus exécuté à être répercuté au terminal en temps réel (par opposition à avoir à attendre jusqu'à ce que le retours de sous-processus). Comment je fais ça?

Répondre

2

Si vous n'avez pas besoin de votre code pour voir stdout, et il est suffisant que l'homme voit, que le système est très bien. Si vous avez besoin de votre code pour le voir, il existe de nombreuses solutions, popen étant la plus simple, donnant accès à votre code à stdout, et Open3 donnant à votre code l'accès à la fois stdout et stderr. Voir: Ruby Process Management

0

Oups, tout de suite compris. Je devais utiliser exec() au lieu de ``

Cela fait ce que je veux:

for directory in directories 
     exec `s3sync.rb --exclude="#{EXCLUDE_REGEXP}" --delete --progress -r #{directory} my.amazon.backup.bucket:#{directory}` 
end 
+1

Êtes-vous sûr que cela fait ce que vous voulez? La documentation indique que exec * remplace * le processus en cours, ainsi votre programme terminera l'exécution après l'exécution de s3sync.rb pour le premier répertoire. Je pense que vous voudrez utiliser le système Kernel # à la place. Plus d'infos sur http://blog.jayfields.com/2006/06/ruby-kernel-system-exec-and-x.html – DataWraith

+0

Oh, bon appel. J'ai seulement 1 répertoire qui est sauvegardé jusqu'ici, donc j'ai raté ça! –

4

IO.popen crée un processus et retourne un objet IO pour stdin et stdout de ce processus.

IO.popen("s3sync.rb …").each do |line| 
    print line 
end 
+0

Est-ce que cela fonctionne avec une sortie colorée? – hfossli