redirecting STDOUT

J

Joe Van Dyk

Why doesn't this work?

(#executable is a function that returns a string that contains a test
application that spits out some data)

def start
pid =3D fork=20
if pid.nil? # In child
log =3D File.open(executable + ".log", "w")
STDOUT.reopen(log)
STDERR.reopen(log)
exec executable # Start program
exit
else # In parent
@pid =3D pid # Record new process id
Process.detach @pid # If the process dies, let it die =20
monitor # Start monitoring the process' status
end
end


Well, it works for the most part. The log file gets created, but
nothing gets written to it. Am I not redirecting output correctly?

Thanks,
Joe

Thanks,
Joe
 
G

Gennady Bystritksy

Joe said:
Why doesn't this work?

(#executable is a function that returns a string that contains a test
application that spits out some data)

def start
pid = fork
if pid.nil? # In child
log = File.open(executable + ".log", "w")
STDOUT.reopen(log)
STDERR.reopen(log)
exec executable # Start program
exit
else # In parent
@pid = pid # Record new process id
Process.detach @pid # If the process dies, let it die
monitor # Start monitoring the process' status
end
end


Well, it works for the most part. The log file gets created, but
nothing gets written to it. Am I not redirecting output correctly?

Thanks,
Joe

Thanks,
Joe

Are you sure your "executable" is producing anything when launched the
way you do it? You may try some STDERR.puts before "exec executable" to
know for sure that something must be there. Also, I would do log.close
before exec as the file descriptor is cloned anyway for stdout and stderr.

Gennady.
 
G

gwtmp01

Why doesn't this work?

Disclaimer: I'm pretty good with Unix System stuff
but still learning on the Ruby so...
(#executable is a function that returns a string that contains a test
application that spits out some data)

def start
pid = fork
if pid.nil? # In child
log = File.open(executable + ".log", "w")
STDOUT.reopen(log)
STDERR.reopen(log)
exec executable # Start program
exit
else # In parent
@pid = pid # Record new process id
Process.detach @pid # If the process dies, let it die
monitor # Start monitoring the process' status
end
end

This worked for me (Mac OS X 10.4, Ruby 1.8.2). Check the permissions
on the log file. If was created in earlier tests as a read-only file
maybe
that is why the program fails now.

If you have something like ktrace or truss on your system, trace
the ruby program and then look at the dump. You can see exactly
what system calls are being made (open/read/write/etc) and also
what errors, if any, are being returned.

Try using some standard program such as /bin/date instead of executable
just to make sure it isn't a problem with your test program. You'll
probably want a different path for the log file in that case.

If 'monitor' is going to watch the child process then just incorporate
calls to Process.wait(@pid) as part of 'monitor' instead of
Process.detach. If you have both Process.detach and monitor
periodically
calling Process.wait, you'll never be sure which thread is going to
catch the exiting child.



Gary Wright
 
J

Joe Van Dyk

Nevermind, it does work! =20

My test application was the following Ruby application:

#!/bin/env ruby
while true
puts "pid: #{Process.pid}, time: #{Time.now}"
sleep 0.2
puts=20
end

Does #puts not write to STDOUT by default?
 
G

gwtmp01

Nevermind, it does work!

My test application was the following Ruby application:

#!/bin/env ruby
while true
puts "pid: #{Process.pid}, time: #{Time.now}"
sleep 0.2
puts
end

Does #puts not write to STDOUT by default?

Buffering. When you run this program with output
associated with the terminal, STDOUT is line buffered
so you see each line right after puts executes.

When you redirect STDOUT to a file, the IO is not
line buffered but instead buffered into blocks.
When I tested your program, I didn't see any output
in the file until puts had generated 4k worth of
data at which point it was flushed to the file
system.

You'll have to put in explicit calls to flush if
you expect to see the output in a different way or
change STDOUT to be line buffered.


Gary Wright
 
A

Ara.T.Howard

Nevermind, it does work!

My test application was the following Ruby application:

#!/bin/env ruby STDOUT.sync = true
while true
puts "pid: #{Process.pid}, time: #{Time.now}"
sleep 0.2
puts
end

Does #puts not write to STDOUT by default?

you would've seen it eventually...

you also could do

STDOUT.flush

after each write

cheers.

-a
--
===============================================================================
| email :: ara [dot] t [dot] howard [at] noaa [dot] gov
| phone :: 303.497.6469
| My religion is very simple. My religion is kindness.
| --Tenzin Gyatso
===============================================================================
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Members online

No members online now.

Forum statistics

Threads
473,744
Messages
2,569,484
Members
44,903
Latest member
orderPeak8CBDGummies

Latest Threads

Top