Biorąc pod uwagę, że chcę przetestować niezablokowane odczyty z długiego polecenia, utworzyłem następujący skrypt, zapisałem go jako long
, uczyniłem go wykonywalnym z chmod 755
i umieściłem go na mojej ścieżce (zapisałem jako ~/bin/long
, gdzie ~/bin
jest na mojej ścieżce).Dlaczego IO :: WaitReadable jest inaczej podnoszone dla STDOUT niż STDERR?
Jestem w wersji * nix z ruby 1.9.2p290 (2011-07-09 revision 32553) [x86_64-darwin11.0.0]
skompilowanej z domyślnymi wartościami RVM. Nie używam systemu Windows i dlatego nie jestem pewien, czy skrypt testowy będzie działał dla ciebie, jeśli to zrobisz.
#!/usr/bin/env ruby
3.times do
STDOUT.puts 'message on stdout'
STDERR.puts 'message on stderr'
sleep 1
end
Dlaczego long_err
produkować każdą wiadomość stderr jak to jest wydrukowane przez „długi”
def long_err(bash_cmd = 'long', maxlen = 4096)
stdin, stdout, stderr = Open3.popen3(bash_cmd)
begin
begin
puts 'err -> ' + stderr.read_nonblock(maxlen)
end while true
rescue IO::WaitReadable
IO.select([stderr])
retry
rescue EOFError
puts 'EOF'
end
end
podczas long_out
pozostaje zablokowany, aż wszystkie komunikaty stdout są drukowane?
def long_out(bash_cmd = 'long', maxlen = 4096)
stdin, stdout, stderr = Open3.popen3(bash_cmd)
begin
begin
puts 'out -> ' + stdout.read_nonblock(maxlen)
end while true
rescue IO::WaitReadable
IO.select([stdout])
retry
rescue EOFError
puts 'EOF'
end
end
Zakładam, że przed wykonaniem którejś z tych funkcji uzyskasz require 'open3'
.
Dlaczego wartość IO::WaitReadable
jest podnoszona inaczej dla STDOUT niż STDERR?
Obejścia z zastosowaniem other ways to start subprocesses również doceniane, jeśli je masz.
dziękuję Casper, rozpocznie się, jak tylko dotrę do 15 przedstawicieli –