2016-10-24 1 views
3

Je dois exécuter un script ruby ​​en arrière-plan, mais je veux voir sa sortie en temps réel.Bash - Comment obtenir STDOUT à partir d'un script ruby ​​de fond

j'ai écrit un test simple appelé loop.rb:

#!/usr/bin/env ruby 

(1..4).each do 
    puts "loop!" 
    sleep 1 
end 

dont la sortie est de premier plan:

[email protected]:~/test$ ./loop.rb 
loop! 
loop! 
loop! 
loop! 

Mais je ne peux pas le voir en arrière-plan:

[email protected]:~/test$ ./loop.rb & 
[2] 3935 
[email protected]:~/test$ 

Cependant, je peut voir la sortie ping en arrière-plan:

[email protected]:~/test$ ping google.com & 
[2] 3734                                                                  
[email protected]:~/test$ PING google.com (64.233.190.113) 56(84) bytes of data.                                                 
64 bytes from ce-in-f113.1e100.net (64.233.190.113): icmp_seq=1 ttl=42 time=79.6 ms                                               
64 bytes from ce-in-f113.1e100.net (64.233.190.113): icmp_seq=2 ttl=42 time=79.5 ms                                               
64 bytes from ce-in-f113.1e100.net (64.233.190.113): icmp_seq=3 ttl=42 time=81.7 ms                    

Alors, deux questions:

  1. Pourquoi puis-je voir la sortie de ping et non la sortie de loop.rb?

  2. Comment obtenir la sortie de loop.rb en arrière-plan dans Bash?

MISE À JOUR

@TomLord dans le commentaire est juste: il y a une certaine configuration du système impair. Localement, mon ruby n'est pas un interpréteur de rubis simple installé; C'est un script qui exécute ruby dans un conteneur Docker. Cela peut donc être un problème Docker. J'ai testé sur une machine avec un interpréteur de rubis simple-installé et cela a fonctionné bien. J'explorerai les problèmes de tamponnage de Docker.

+0

Fonctionne pour moi très bien. – Stefan

+1

Fonctionne bien pour moi aussi. Peut-être avez-vous une configuration système bizarre? (Mais même alors, je ne sais pas pourquoi 'ping' fonctionnerait si ce n'est pas le cas ?!) –

+0

https://superuser.com/questions/972968/why-does-a-background-process-started-in- bash-print-stdout-to-screen # answer-972980 – bjhaid

Répondre

2

J'ai trouvé le problème et la solution.

Le problème:

  1. Pourquoi puis-je voir la sortie de ping et non la sortie de loop.rb?

Parce que mon ruby locale n'est pas un interprète véritable rubis, mais il est un script qui va ruby l'intérieur d'un conteneur de docker (plus facile à gérer que d'utiliser rvm à mon humble avis). C'est donc un problème de tampon de tuyau docker.

La solution:

  1. Comment obtenir la sortie de loop.rb en arrière-plan dans Bash?

En utilisant le unbuffer command:

[email protected]:~/test$ unbuffer ./loop.rb & 
[3] 7262 
[email protected]:~/test$ loop! 
loop! 
loop! 
loop! 
2

Essayez de mettre cela au début de votre script:

STDOUT.sync = true 

Cela devrait désactiver mise en mémoire tampon sur la sortie standard du script Ruby.Cette mise en mémoire tampon est normalement effectuée par la libc de votre système si elle détecte qu'elle n'est pas exécutée dans un environnement interactif.