48 votes

Comment rediriger stderr et stdout vers un fichier pour un script Ruby ?

Comment rediriger stderr et stdout vers un fichier pour un script Ruby ?

1 votes

70voto

Mark Rushakoff Points 97350

De dans un script Ruby vous pouvez rediriger stdout y stderr avec le IO#reopen método.

# a.rb
$stdout.reopen("out.txt", "w")
$stderr.reopen("err.txt", "w")

puts 'normal output'
warn 'something to stderr'

$ ls
a.rb
$ ruby a.rb
$ ls
a.rb    err.txt out.txt
$ cat err.txt 
something to stderr
$ cat out.txt 
normal output

2 votes

Comment peut-on rétablir un $stdout normal par la suite ?

0 votes

Pourquoi devrions-nous utiliser la méthode reopen ? cela signifie que si "out.txt" n'existe pas, il sera créé ?

0 votes

Jetez un coup d'œil à cette réponse sur la façon de restaurer $stdout après.

13voto

argent_smith Points 193

Note : la réouverture des flux standards vers /dev/null est une bonne vieille méthode pour aider un processus à devenir un démon. Par exemple :

# daemon.rb
$stdout.reopen("/dev/null", "w")
$stderr.reopen("/dev/null", "w")

3 votes

Que voulez-vous dire par "aider un processus à devenir un démon" ?

4 votes

Sous UNIX, pour qu'un programme devienne un démon, le programmeur ne doit pas seulement le faire passer en arrière-plan, mais aussi rediriger ses flux d'entrée/sortie standard. Cela vous est-il familier ?

0 votes

Remarque : Si vous utilisez des Process.daemon il peut le faire pour vous. Voir documents ici .

10voto

grosser Points 4300
def silence_stdout
  $stdout = File.new( '/dev/null', 'w' )
  yield
ensure
  $stdout = STDOUT
end

1 votes

Bon, mais ceci est mieux, au cas où STDOUT serait autre chose. stackoverflow.com/a/4459463/26604

4voto

Richard Fearn Points 11631
./yourscript.rb 2>&1 > log.txt

redirigera stdout et stderr vers le même fichier.

4 votes

En supposant que vous travaillez sur *nix

0 votes

@Steve : Je pense > fonctionne sous Windows, mais je ne suis pas sûr que ce soit le cas. 2> cependant.

2 votes

Cette réponse fait également des suppositions sur le shell utilisé par l'utilisateur, même dans *nix. Certains shells ont des styles de redirection différents, par exemple le comportement par défaut de zsh.

3voto

Atika Points 31

Un exemple complet avec $stdout et $stderr redirigés vers un fichier et comment restaurer le comportement initial.

#!/usr/bin/ruby

logfile = "/tmp/testruby.log"

@original_stdout = $stderr.dup
@original_stderr = $stderr.dup
$stdout.reopen(logfile, "w")
$stdout.sync = true
$stderr.reopen($stdout)

def restore_stdout
  $stdout.reopen(@original_stdout)
  $stderr.reopen(@original_stderr)
end

def fail_exit(msg)
  puts "- #{msg}" # to the logfile
  restore_stdout
  $stderr.puts "+ #{msg}" # to standard error
  exit!
end

def success_exit(msg)
  puts "- #{msg}" # to the logfile
  restore_stdout  
  $stdout.puts "+ #{msg}" # to standard output
  exit
end

puts "This message goes to the file"

success_exit "A successful exit message"

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X