Re: HP-UX exec tee hanging/not working intermittently

2012-07-31 Thread Greg Wooledge
On Mon, Jul 30, 2012 at 02:17:15PM -0700, Andrew Resch wrote:
> I am attempting to use exec and tee to have my scripts
> stdout/stderr appended to a log file like such: exec > >(tee -a $LOG)
> 2>&1
> These scripts will often call other scripts with a similar
> exec statement, often writing to a separate log file.  On my GNU/Linux
> systems,
> these scripts will run just fine without any issue, but on
> HP-UX they seem to hang or not display any output.

The major difference here is that bash on HP-UX implements process
substitutions (the <() syntax) with a named pipe, whereas on Linux
it uses a /dev/fd/* file.

> $ cat test_exec1.sh
> #!/bin/bash
> 
> LOG="test_exec.log"
> exec > >(/usr/bin/tee -a $LOG) 2>&1
> 
> echo "i am exec1.."
> 
> ./test_exec2.sh
> 
> echo "i am done in exec1.."

> $ while true; do ./test_exec1.sh; done

You are opening a slew of named pipes and background jobs in rapid
succession, and not waiting for the jobs to finish.  (It might still be
considered a bug... I'm just pointing out the practical aspects.)

I would bet that putting a "sleep 1" in the loop would make the problem
stop happening, as horrible a hack as that may be.

I discuss this a bit on .  The
only way to ensure clean operation is to avoid the <() syntax altogether
and use your own explicit named pipe and background job.  Then you can
close the pipe and wait for the background job to terminate before
exiting.



Re: HP-UX exec tee hanging/not working intermittently

2012-07-31 Thread Andrew Resch
On Tue, Jul 31, 2012 at 4:55 AM, Greg Wooledge  wrote:
> On Mon, Jul 30, 2012 at 02:17:15PM -0700, Andrew Resch wrote:
>> I am attempting to use exec and tee to have my scripts
>> stdout/stderr appended to a log file like such: exec > >(tee -a $LOG)
>> 2>&1
>> These scripts will often call other scripts with a similar
>> exec statement, often writing to a separate log file.  On my GNU/Linux
>> systems,
>> these scripts will run just fine without any issue, but on
>> HP-UX they seem to hang or not display any output.
>
> The major difference here is that bash on HP-UX implements process
> substitutions (the <() syntax) with a named pipe, whereas on Linux
> it uses a /dev/fd/* file.
>
>> $ cat test_exec1.sh
>> #!/bin/bash
>>
>> LOG="test_exec.log"
>> exec > >(/usr/bin/tee -a $LOG) 2>&1
>>
>> echo "i am exec1.."
>>
>> ./test_exec2.sh
>>
>> echo "i am done in exec1.."
>
>> $ while true; do ./test_exec1.sh; done
>
> You are opening a slew of named pipes and background jobs in rapid
> succession, and not waiting for the jobs to finish.  (It might still be
> considered a bug... I'm just pointing out the practical aspects.)
> I would bet that putting a "sleep 1" in the loop would make the problem
> stop happening, as horrible a hack as that may be.

Yes, fair enough.  I did the loop to simply make the issue more apparent,
but many times I couldn't even run the test_exec1.sh script once successfully
on one of my hosts.  In those cases I'm not sure how large of a sleep
I'd need to make it work ;)

> I discuss this a bit on .  The
> only way to ensure clean operation is to avoid the <() syntax altogether
> and use your own explicit named pipe and background job.  Then you can
> close the pipe and wait for the background job to terminate before
> exiting.

Thank you for this.  I have removed the process substitution from my scripts
and replaced it with using explicit named pipes, and now everything is
working as expected.