[Chicago-talk] Broken Pipe
Steven Lembark
lembark at wrkhors.com
Mon Dec 12 16:46:10 PST 2005
-- "Young, Darren" <Darren.Young at ChicagoGSB.edu>
> Have a script that does an open() for read on a pipe. The particular
> binary can take a while to run (1-2 hours) and causes the Perl open() to
> eventually timeout and spew back 'broken pipe'. Can I do something as
> simple as:
>
> $SIG{PIPE} = 'IGNORE';
> To get around this? Or, should I be thinking about a different IPC open
> mechanism (open2, open3, etc)?
You can try open3, but in general you should be able to
get by without it.
> if ( open(STORED, "$cmd |") ) {
A blocking read should sit there forever if necessary. The
problem is that $cmd isn't putting out any data and is then
closing its stdout.
You can try:
open my $fh, "$cmd > /var/tmp/thingy.log |" ...
and tail -f /var/tmp/thingy.log to -- hopefully -- find
out why the command is exiting without sending you any
data.
You can also try running the command from the command
line into a named pipe and reading from the named one
into perl (just a regular open my $fh, "< $pipe"). That
makes it easier to watch the writing job and see if it
spews out any errors:
mknod /tmp/named_pipe p;
/path/to/cmd --blah 2>&1 > /tmp/named_pipe | tee /tmp/error.log;
will show you the stderr output from the command and tee
it to a log file for you (not the order of redirections).
--
Steven Lembark 85-09 90th Street
Workhorse Computing Woodhaven, NY 11421
lembark at wrkhors.com 1 888 359 3508
More information about the Chicago-talk
mailing list