f



Sending something from Perl program to close down a pipe?

This might be related to Todd's pipe thread?  I have a Perl program that 
outputs to stdout.  I run it like this:

tail -f verbose_trace_file | myprog.pl

where myprog.pl outputs just the information I am interested in from the 
trace file as the trace file is being written.  I want the pipe to close 
and return to prompt when the trace file is done.  myprog.pl can detect 
when its done based on a message in the file but I don't know how to exit 
this thing.  I am surprised that exit() from within myprog.pl does not do 
it because after exit, I would be pipeing to a program that no longer 
exists.  The pipe still seems active until I CRTL-C to get to prompt.  
Any suggestions of what I can do from within myprog.pl to close this 
thing down?  Thanks.

John Black

0
John
12/6/2016 6:56:42 PM
comp.lang.perl.misc 33233 articles. 2 followers. brian (1246) is leader. Post Follow

18 Replies
504 Views

Similar Articles

[PageSpeed] 46

John Black <jblack@nopam.com> writes:
> This might be related to Todd's pipe thread?  I have a Perl program that 
> outputs to stdout.  I run it like this:
>
> tail -f verbose_trace_file | myprog.pl
>
> where myprog.pl outputs just the information I am interested in from the 
> trace file as the trace file is being written.  I want the pipe to close 
> and return to prompt when the trace file is done.  myprog.pl can detect 
> when its done based on a message in the file but I don't know how to exit 
> this thing.  I am surprised that exit() from within myprog.pl does not do 
> it because after exit, I would be pipeing to a program that no longer 
> exists.  The pipe still seems active until I CRTL-C to get to prompt.

Works for me. Assuming I start

tail -f /var/log/syslog | wc -c

and then terminate the wc process via SIGTERM, the next logged message
cause the tail to be terminated via SIGPIPE.
0
Rainer
12/6/2016 7:50:11 PM
In article <87h96gx2fg.fsf@doppelsaurus.mobileactivedefense.com>, 
rweikusat@talktalk.net says...
> Works for me. Assuming I start
> 
> tail -f /var/log/syslog | wc -c
> 
> and then terminate the wc process via SIGTERM, the next logged message
> cause the tail to be terminated via SIGPIPE.

It does not work for me.  Your above example does the same thing in that 
it does not exit until I ctrl-c.

Is terminating the process "via SIGTERM" different than executing an 
"exit" command from within myprog.pl?  myprog.pl runs an exit() but I 
still  have to terminate the tail with a ctrl-c?

If it is not the same thing as exit, how do I do a SIGTERM?  Thanks.

John Black
0
John
12/6/2016 8:03:59 PM
On Tuesday, December 6, 2016 at 10:56:43 AM UTC-8, John Black wrote:
> This might be related to Todd's pipe thread?  I have a Perl program that 
> outputs to stdout.  I run it like this:
> 
> tail -f verbose_trace_file | myprog.pl
> 
> where myprog.pl outputs just the information I am interested in from the 
> trace file as the trace file is being written.  I want the pipe to close 
> and return to prompt when the trace file is done.  myprog.pl can detect 
> when its done based on a message in the file but I don't know how to exit 
> this thing.  I am surprised that exit() from within myprog.pl does not do 
> it because after exit, I would be pipeing to a program that no longer 
> exists.  The pipe still seems active until I CRTL-C to get to prompt.  
> Any suggestions of what I can do from within myprog.pl to close this 
> thing down?  Thanks.
> 

IIUC and you want to exit both ends of the pipe, the following
worked on Debian by backgrounding the tail and sending a ctrl-c
to the whole process group, eg.


(tail -f verbose_trace_file &) | 
    perl -E '... $linex=<>; #end mark;
              kill -2,$$ or die "kill failed" '



0
C
12/7/2016 1:28:17 AM
On Tuesday, December 6, 2016 at 5:28:20 PM UTC-8, C.DeRykus wrote:
> On Tuesday, December 6, 2016 at 10:56:43 AM UTC-8, John Black wrote:
> > This might be related to Todd's pipe thread?  I have a Perl program that 
> > outputs to stdout.  I run it like this:
> > 
> > tail -f verbose_trace_file | myprog.pl
> > 
> > where myprog.pl outputs just the information I am interested in from the 
> > trace file as the trace file is being written.  I want the pipe to close 
> > and return to prompt when the trace file is done.  myprog.pl can detect 
> > when its done based on a message in the file but I don't know how to exit 
> > this thing.  I am surprised that exit() from within myprog.pl does not do 
> > it because after exit, I would be pipeing to a program that no longer 
> > exists.  The pipe still seems active until I CRTL-C to get to prompt.  
> > Any suggestions of what I can do from within myprog.pl to close this 
> > thing down?  Thanks.
> > 
> 
> IIUC and you want to exit both ends of the pipe, the following
> worked on Debian by backgrounding the tail and sending a ctrl-c
> to the whole process group, eg.
> 
> 
> (tail -f verbose_trace_file &) | 
>     perl -E '... $linex=<>; #end mark;
>               kill -2,$$ or die "kill failed" '

Also, note you'll block if your "Get out of Dodge" marker
isn't found in the current buffer returned from tail. The
only remedy for that would be a alarm timeout, eg,

[untested]

perl -E 'eval{ local $SIG{ALRM} = sub{die "Timeout"}; 
               alarm(60);  # 60 sec. timeout
               while (<>) { 
                  alarm(0) and die("found: $_") if /marker/; 
               };
               say $@ and kill(-2,$$) if $@'
              
               
 
               
0
C
12/7/2016 6:11:18 AM
John Black <jblack@nopam.com> writes:
> In article <87h96gx2fg.fsf@doppelsaurus.mobileactivedefense.com>, 
> rweikusat@talktalk.net says...
>> Works for me. Assuming I start
>> 
>> tail -f /var/log/syslog | wc -c
>> 
>> and then terminate the wc process via SIGTERM, the next logged message
>> cause the tail to be terminated via SIGPIPE.
>
> It does not work for me.  Your above example does the same thing in that 
> it does not exit until I ctrl-c.
>
> Is terminating the process "via SIGTERM" different than executing an 
> "exit" command from within myprog.pl?

Not in this respect. But the tail process won't be terminated until it
tries to write to the broken pipe. Running this code

-----
use Sys::Syslog;

if (fork() == 0) {
	close(STDIN);
	sleep(2);
	syslog('NOTICE', '%s', 'blah');

	exit(0)
}

exit(0)
----

via

strace tail -f /var/log/syslog | perl a.pl

should show the tail being terminated by a SIGPIPE as soon as the forked
process (which closed its copy of the pipe descriptor) causes something
to be written to the file by invoking syslog.

It [the tail] may be terminated earlier if another process logs a
message first.
0
Rainer
12/7/2016 12:57:18 PM
"C.DeRykus" <derykus@gmail.com> writes:
> On Tuesday, December 6, 2016 at 10:56:43 AM UTC-8, John Black wrote:
>> This might be related to Todd's pipe thread?  I have a Perl program that 
>> outputs to stdout.  I run it like this:
>> 
>> tail -f verbose_trace_file | myprog.pl
>> 
>> where myprog.pl outputs just the information I am interested in from the 
>> trace file as the trace file is being written.  I want the pipe to close 
>> and return to prompt when the trace file is done.  myprog.pl can detect 
>> when its done based on a message in the file but I don't know how to exit 
>> this thing.  I am surprised that exit() from within myprog.pl does not do 
>> it because after exit, I would be pipeing to a program that no longer 
>> exists.  The pipe still seems active until I CRTL-C to get to prompt.  
>> Any suggestions of what I can do from within myprog.pl to close this 
>> thing down?  Thanks.
>> 
>
> IIUC and you want to exit both ends of the pipe, the following
> worked on Debian by backgrounding the tail and sending a ctrl-c
> to the whole process group, eg.
>
>
> (tail -f verbose_trace_file &) | 
>     perl -E '... $linex=<>; #end mark;
>               kill -2,$$ or die "kill failed" '

What about explicitly controlling the feeding process by starting it via
perl?
0
Rainer
12/7/2016 12:59:05 PM
On Wednesday, December 7, 2016 at 4:59:09 AM UTC-8, Rainer Weikusat wrote:
> "C.DeRykus" <derykus@gmail.com> writes:
> > On Tuesday, December 6, 2016 at 10:56:43 AM UTC-8, John Black wrote:
> >> This might be related to Todd's pipe thread?  I have a Perl program that 
> >> outputs to stdout.  I run it like this:
> >> 
> >> tail -f verbose_trace_file | myprog.pl
> >> 
> >> where myprog.pl outputs just the information I am interested in from the 
> >> trace file as the trace file is being written.  I want the pipe to close 
> >> and return to prompt when the trace file is done.  myprog.pl can detect 
> >> when its done based on a message in the file but I don't know how to exit 
> >> this thing.  I am surprised that exit() from within myprog.pl does not do 
> >> it because after exit, I would be pipeing to a program that no longer 
> >> exists.  The pipe still seems active until I CRTL-C to get to prompt.  
> >> Any suggestions of what I can do from within myprog.pl to close this 
> >> thing down?  Thanks.
> >> 
> >
> > IIUC and you want to exit both ends of the pipe, the following
> > worked on Debian by backgrounding the tail and sending a ctrl-c
> > to the whole process group, eg.
> >
> >
> > (tail -f verbose_trace_file &) | 
> >     perl -E '... $linex=<>; #end mark;
> >               kill -2,$$ or die "kill failed" '
> 
> What about explicitly controlling the feeding process by starting it via
> perl?

That'd be my choice except it'd require another chunk
of code to emulate 'tail -f'.

0
C
12/7/2016 4:50:33 PM
"C.DeRykus" <derykus@gmail.com> writes:
> On Wednesday, December 7, 2016 at 4:59:09 AM UTC-8, Rainer Weikusat wrote:
>> "C.DeRykus" <derykus@gmail.com> writes:
>> > On Tuesday, December 6, 2016 at 10:56:43 AM UTC-8, John Black wrote:
>> >> This might be related to Todd's pipe thread?  I have a Perl program that 
>> >> outputs to stdout.  I run it like this:
>> >> 
>> >> tail -f verbose_trace_file | myprog.pl
>> >> 
>> >> where myprog.pl outputs just the information I am interested in from the 
>> >> trace file as the trace file is being written.  I want the pipe to close 
>> >> and return to prompt when the trace file is done.  myprog.pl can detect 
>> >> when its done based on a message in the file but I don't know how to exit 
>> >> this thing.  I am surprised that exit() from within myprog.pl does not do 
>> >> it because after exit, I would be pipeing to a program that no longer 
>> >> exists.  The pipe still seems active until I CRTL-C to get to prompt.  
>> >> Any suggestions of what I can do from within myprog.pl to close this 
>> >> thing down?  Thanks.
>> >> 
>> >
>> > IIUC and you want to exit both ends of the pipe, the following
>> > worked on Debian by backgrounding the tail and sending a ctrl-c
>> > to the whole process group, eg.
>> >
>> >
>> > (tail -f verbose_trace_file &) | 
>> >     perl -E '... $linex=<>; #end mark;
>> >               kill -2,$$ or die "kill failed" '
>> 
>> What about explicitly controlling the feeding process by starting it via
>> perl?
>
> That'd be my choice except it'd require another chunk
> of code to emulate 'tail -f'.

Something like

$pid = open($fh, 'tail -f /var/log/syslog|')

or

$pid = open($fh, '-|', qw(tail -f /var/log/syslog))

might be sufficient[*].

[*] This will invoke die internally if the fork fails.
0
Rainer
12/7/2016 6:29:37 PM
In article <8737hzlhim.fsf@doppelsaurus.mobileactivedefense.com>, 
rweikusat@talktalk.net says...
> 
> "C.DeRykus" <derykus@gmail.com> writes:
> > On Wednesday, December 7, 2016 at 4:59:09 AM UTC-8, Rainer Weikusat wrote:
> >> "C.DeRykus" <derykus@gmail.com> writes:
> >> > On Tuesday, December 6, 2016 at 10:56:43 AM UTC-8, John Black wrote:
> >> >> This might be related to Todd's pipe thread?  I have a Perl program that 
> >> >> outputs to stdout.  I run it like this:
> >> >> 
> >> >> tail -f verbose_trace_file | myprog.pl
> >> >> 
> >> >> where myprog.pl outputs just the information I am interested in from the 
> >> >> trace file as the trace file is being written.  I want the pipe to close 
> >> >> and return to prompt when the trace file is done.  myprog.pl can detect 
> >> >> when its done based on a message in the file but I don't know how to exit 
> >> >> this thing.  I am surprised that exit() from within myprog.pl does not do 
> >> >> it because after exit, I would be pipeing to a program that no longer 
> >> >> exists.  The pipe still seems active until I CRTL-C to get to prompt.  
> >> >> Any suggestions of what I can do from within myprog.pl to close this 
> >> >> thing down?  Thanks.
> >> >> 
> >> >
> >> > IIUC and you want to exit both ends of the pipe, the following
> >> > worked on Debian by backgrounding the tail and sending a ctrl-c
> >> > to the whole process group, eg.
> >> >
> >> >
> >> > (tail -f verbose_trace_file &) | 
> >> >     perl -E '... $linex=<>; #end mark;
> >> >               kill -2,$$ or die "kill failed" '
> >> 
> >> What about explicitly controlling the feeding process by starting it via
> >> perl?
> >
> > That'd be my choice except it'd require another chunk
> > of code to emulate 'tail -f'.
> 
> Something like
> 
> $pid = open($fh, 'tail -f /var/log/syslog|')
> 
> or
> 
> $pid = open($fh, '-|', qw(tail -f /var/log/syslog))
> 
> might be sufficient[*].
> 
> [*] This will invoke die internally if the fork fails.

Thanks.  I tried this but it just hangs with no output until I ctrl-c:

   $pid = open($fh, '-|', 'tail -f *.trace');

   while ($line = <$fh>) {
      my code that filters the input and prints to stdout
      i.e. my original myprog.pl
   }

Is the idea to run 'tail -f *.trace' and pipe the output to $fh?

John Black
0
John
12/8/2016 8:08:09 PM
In article <MPG.32b379a78b382a7e989877@news.eternal-september.org>, 
jblack@nopam.com says...
> Thanks.  I tried this but it just hangs with no output until I ctrl-c:
> 
>    $pid = open($fh, '-|', 'tail -f *.trace');
> 
>    while ($line = <$fh>) {
>       my code that filters the input and prints to stdout
>       i.e. my original myprog.pl
>    }
> 
> Is the idea to run 'tail -f *.trace' and pipe the output to $fh?

Nevermind, that part was working.  This is what was hanging up:

   while (! -e "*.trace"){
      $i++;
      if ($i == 10) {
         print "10 minute timeout reached.\n";
         exit;
      }
      sleep(60);
   }

I put this in case I start my program before the trace file is created - 
it should wait up to 10 minutes for the file to appear.  The problem is I 
guess I can't use a wildcard with -e?  I can't hardcode the file name 
because its always different but it always ends in .trace.

I changed to this which seems to be working:

   @files = glob('*.trace');
   while (! -e $files[0]){
      $i++;
      if ($i == 10) {
         print "10 minute timeout reached.\n";
         exit;
      }
      sleep(60);
      @files = glob('*.trace');
   }

   $pid = open($fh, '-|', "tail -f $files[0]");
   while ($line = <$fh>) {
     ...

So all this works now, except... when my program exits I am still hung up 
until I ctrl-c.  Inside my while loop, this code executes:

      if ($line =~ /^result file/) {
         print "Testcase Done.\n";
         close $fh;
         exit;

Because I see "Testcase Done." printed but the close and the exit do not 
get me to prompt.  :-(

John Black
0
John
12/8/2016 9:07:19 PM
John Black <jblack@nopam.com> writes:
> In article <MPG.32b379a78b382a7e989877@news.eternal-september.org>, 
> jblack@nopam.com says...
>> Thanks.  I tried this but it just hangs with no output until I ctrl-c:
>> 
>>    $pid = open($fh, '-|', 'tail -f *.trace');
>> 
>>    while ($line = <$fh>) {
>>       my code that filters the input and prints to stdout
>>       i.e. my original myprog.pl
>>    }
>> 
>> Is the idea to run 'tail -f *.trace' and pipe the output to $fh?

[...]

> So all this works now, except... when my program exits I am still hung up 
> until I ctrl-c.  Inside my while loop, this code executes:
>
>       if ($line =~ /^result file/) {
>          print "Testcase Done.\n";
>          close $fh;
>          exit;
>
> Because I see "Testcase Done." printed but the close and the exit do not 
> get me to prompt.  :-(

That's likely the issue as with the explicit pipeline: The tail will run
until it tries to write something to the (now broken) pipe. But since
you have the pid (returned by open), it could be terminated with
something like

kill 15, $pid;
0
Rainer
12/8/2016 10:10:58 PM
In article <874m2e5ax9.fsf@doppelsaurus.mobileactivedefense.com>, 
rweikusat@talktalk.net says...
> > So all this works now, except... when my program exits I am still hung up 
> > until I ctrl-c.  Inside my while loop, this code executes:
> >
> >       if ($line =~ /^result file/) {
> >          print "Testcase Done.\n";
> >          close $fh;
> >          exit;
> >
> > Because I see "Testcase Done." printed but the close and the exit do not 
> > get me to prompt.  :-(
> 
> That's likely the issue as with the explicit pipeline: The tail will run
> until it tries to write something to the (now broken) pipe. But since
> you have the pid (returned by open), it could be terminated with
> something like
> 
> kill 15, $pid;

Yes!  It worked adding the kill, thank you!!!  I had to remove the "close 
$fh" to get it to work:

      if ($line =~ /^result file/) {
         print "Testcase Done.\n";
         kill 15, $pid;
         exit;
      }

John Black
0
John
12/8/2016 10:31:54 PM
On Thursday, December 8, 2016 at 2:31:52 PM UTC-8, John Black wrote:
> In article <874m2e5ax9.fsf@doppelsaurus.mobileactivedefense.com>, 
> rweikusat@talktalk.net says...
> > > So all this works now, except... when my program exits I am still hung up 
> > > until I ctrl-c.  Inside my while loop, this code executes:
> > >
> > >       if ($line =~ /^result file/) {
> > >          print "Testcase Done.\n";
> > >          close $fh;
> > >          exit;
> > >
> > > Because I see "Testcase Done." printed but the close and the exit do not 
> > > get me to prompt.  :-(
> > 
> > That's likely the issue as with the explicit pipeline: The tail will run
> > until it tries to write something to the (now broken) pipe. But since
> > you have the pid (returned by open), it could be terminated with
> > something like
> > 
> > kill 15, $pid;
> 
> Yes!  It worked adding the kill, thank you!!!  I had to remove the "close 
> $fh" to get it to work:
> 
>       if ($line =~ /^result file/) {
>          print "Testcase Done.\n";
>          kill 15, $pid;
>          exit;
>       }
> 

You had to remove the "close" because it waits on the tail -f to
close. See: perldoc -f close. BTW, as long as the pipe is intact
tail -f won't close.

That's why I had to send a "kill" to the process group.

I'm afraid the lure of internalizing the pipe has reached
a similar level of complexity :)





0
C
12/8/2016 11:38:20 PM
On Tuesday, December 6, 2016 at 10:56:43 AM UTC-8, John Black wrote:
> This might be related to Todd's pipe thread?  I have a Perl program that=
=20
> outputs to stdout.  I run it like this:
>=20
> tail -f verbose_trace_file | myprog.pl
>=20
> where myprog.pl outputs just the information I am interested in from the=
=20
> trace file as the trace file is being written.  I want the pipe to close=
=20
> and return to prompt when the trace file is done.

Then you don't want to use `tail -f`. The `-f` flag explicitly tells tail _=
not_ to exit when it reaches the end of the file, and to instead continuall=
y check the file for new content in case something else starts writing. In =
fact, you probably don't want to use tail at all=E2=80=A6

I'll take as read that you can't modify the process creating the file. If y=
ou can, the obvious solution is

the_writing_process | myprog.pl

where the_writing_process writes to stdout instead of to verbose_trace_file=
..

If you can't, can you modify the filesystem and replace verbose_trace_file =
with a fifo?

mkfifo verbose_trace_file
# start writing process
< verbose_trace_file myprog.pl

A fifo has the characteristics you want: your program can read it until the=
 writing process closes it, and will immediately receive EOF if it does so =
(or if it exits without closing the fifo). You wouldn't have to monitor the=
 content for an end-of-logs message and could use the OS directly.

(You can remove the tee call if you don't actually need to capture this to =
a file.)
0
ojacobson
12/9/2016 12:54:21 AM
"C.DeRykus" <derykus@gmail.com> writes:
> On Thursday, December 8, 2016 at 2:31:52 PM UTC-8, John Black wrote:

[...]

>>       if ($line =~ /^result file/) {
>>          print "Testcase Done.\n";
>>          kill 15, $pid;
>>          exit;
>>       }
>> 
>
> You had to remove the "close" because it waits on the tail -f to
> close. See: perldoc -f close. BTW, as long as the pipe is intact
> tail -f won't close.
>
> That's why I had to send a "kill" to the process group.
>
> I'm afraid the lure of internalizing the pipe has reached
> a similar level of complexity :)

The difference is that it's now done in The Right Way[tm]: If the Perl
program needs to control this process, it must control it completely,
ie, ensure that it's child of itself.
0
Rainer
12/10/2016 4:34:44 PM
On Saturday, December 10, 2016 at 8:34:51 AM UTC-8, Rainer Weikusat wrote:
> "C.DeRykus" <derykus@gmail.com> writes:
> > On Thursday, December 8, 2016 at 2:31:52 PM UTC-8, John Black wrote:
> 
> [...]
> 
> >>       if ($line =~ /^result file/) {
> >>          print "Testcase Done.\n";
> >>          kill 15, $pid;
> >>          exit;
> >>       }
> >> 
> >
> > You had to remove the "close" because it waits on the tail -f to
> > close. See: perldoc -f close. BTW, as long as the pipe is intact
> > tail -f won't close.
> >
> > That's why I had to send a "kill" to the process group.
> >
> > I'm afraid the lure of internalizing the pipe has reached
> > a similar level of complexity :)
> 
> The difference is that it's now done in The Right Way[tm]: If the Perl
> program needs to control this process, it must control it completely,
> ie, ensure that it's child of itself.

That's "False Control[tm]", a kind of fascist approach that you must
be in control. Perl is a "glue" language that pulls together other
components economically in the blessed spirit of "TIMTOWDI" and 
"Laziness[tm]". Go in peace, grasshopper.
0
C
12/10/2016 7:53:33 PM
"C.DeRykus" <derykus@gmail.com> writes:
> On Saturday, December 10, 2016 at 8:34:51 AM UTC-8, Rainer Weikusat wrote:
>> "C.DeRykus" <derykus@gmail.com> writes:
>> > On Thursday, December 8, 2016 at 2:31:52 PM UTC-8, John Black wrote:
>> 
>> [...]
>> 
>> >>       if ($line =~ /^result file/) {
>> >>          print "Testcase Done.\n";
>> >>          kill 15, $pid;
>> >>          exit;
>> >>       }
>> >> 
>> >
>> > You had to remove the "close" because it waits on the tail -f to
>> > close. See: perldoc -f close. BTW, as long as the pipe is intact
>> > tail -f won't close.
>> >
>> > That's why I had to send a "kill" to the process group.
>> >
>> > I'm afraid the lure of internalizing the pipe has reached
>> > a similar level of complexity :)
>> 
>> The difference is that it's now done in The Right Way[tm]: If the Perl
>> program needs to control this process, it must control it completely,
>> ie, ensure that it's child of itself.
>
> That's "False Control[tm]", a kind of fascist approach that you must
> be in control.

'Must control' was asked for. And the only way to control another
process easily and straight-forwardly is "make it a child of the
controlling process".

Mundane but works.


0
Rainer
12/10/2016 8:34:24 PM
In article <904008cc-c98a-49ee-9ddb-9c0f69069c5a@googlegroups.com>, 
ojacobson@heroku.com says...
> I'll take as read that you can't modify the process creating the file. 
If you can, the obvious solution is
> 
> the_writing_process | myprog.pl
> 
> where the_writing_process writes to stdout instead of to verbose_trace_file.

Yeah, I don't control the writing process - I'm just monitoring its 
output as it goes.
 
> If you can't, can you modify the filesystem and replace verbose_trace_file with a fifo?
> 
> mkfifo verbose_trace_file
> # start writing process
> < verbose_trace_file myprog.pl
> 
> A fifo has the characteristics you want: your program can read it until 
> the writing process closes it, and will immediately receive EOF if it
> does so (or if it exits without closing the fifo). You wouldn't have to
> monitor the content for an end-of-logs message and could use the OS
> directly.

Thanks.  This sounds good.  Ranier's solution is working great for me but 
I wanted to try this for education purposes.  When I tried your first 
step of running mkfifo on the trace file, I got an error saying "cannot 
create fifo" because "File exists".  I must have to run mkfifo before the 
trace file has been created?  But that is not possible because I don't 
even know the exact filename until it starts.

John Black
0
John
12/11/2016 3:41:46 AM
Reply: