I was working a few month(year? wow yes years) on some Sun Solaris 8 box. And I remenber That SunOs include a handy command which is pswait.

I used this quite a lot, specialy when working remotely over slow link to wait for the end of downloads for example. While on linux I was using a simple loop like
while [ -d /proc/$1 ];do sleep 1;done 
(handy /proc filesystem ) for replacing pswait, I was stuck whith specific shell scripts involving /bin/ps and grep on other platform like darwin or cygwin ... or whatever.

so when I discovered recently Proc::ProcessTable (thanks rob_au )I decided to write my multi-platform pswait, so now I can use the same command everywhere

#!/usr/bin/perl use strict; use Proc::ProcessTable; exit if ( $#ARGV == -1 ); $|++; my $ptable = new Proc::ProcessTable; my %waited = (); my %proc; $proc{ $_->pid }=$_->fname foreach (@{$ptable->table}); use Getopt::Long; GetOptions( 'e|exit+' => \( my $endfirst = 0 ), 's|sleep=i' => \( my $sleeptime = 1 ), 'v|verbose+' => \( my $verbose = 0), 'h|help' => sub { print "usage: $0 [proces ID|name][...]\n" . "\t-s x --sleep x second(S) to sleep between checks\n" . "\t-e --exit exit on first terminated process\n" . "\t-v --verbose verbose mode\n" . "\t-h --help this help\n"; exit; }); foreach (@ARGV) { next if ( $_ == $$ ); # DON'T wait for myself ! if (/\d+/) { if ( exists $proc{$_} ) { $waited{$_}++; } else { print "nothing like $_\n" if $verbose } next; } foreach my $p ( keys %proc ) { next if ( $p == $$ ); # DON'T wait for myself I said ! $waited{$p}++ if ( $proc{$p} =~ /$_/ ); } } if ($verbose) { print "I am process $$\n"; print "waiting after $_ \n" for ( keys %waited ); print "sleep time set to $sleeptime s\n"; print "will exit on first terminated process\n" if ( $endfirst ); } my $count = scalar keys(%waited); while ( scalar keys(%waited) ) { sleep $sleeptime; %proc = (); $proc{ $_->pid }++ foreach (@{$ptable->table}); foreach my $p ( keys %waited ) { if ( !exists $proc{$p} ) { print "gone $p\n" if $verbose; delete $waited{$p}; } } last if (( scalar keys(%waited) < $count ) && ($endfirst)); } __END__ =head1 PSWAIT pswait - waiting for process(es) to end before doing things =head1 SYNOPSIS pswait [options] [process ID|NAME ...] Options: -h --help brief help message -v --verbose be verbose -e --exit exit after first process end -s x --sleep x set sleep time to x second (default to 1) =head1 OPTIONS =over 8 =item B<-e, --exit> When giving a list of process to watch, exit when the first process en +d, it is usefull to easily manage a pool of proces with a shell scrip +t. =item B<-h. --help> Print a brief help message and exits. =item B<-s x, --sleep x> set sleep time to x seconds between process checking, default to 1 sec +ond. On small machines (or overloaded machines) it could help to chec +k process state only once every minutes instead, using for example -s + 60 =item B<-v, --verbose> Inform you on what happening ... which process ends, which process ID +are watched for state (usefull when using process names on command li +ne). =back =head1 DESCRIPTION B<pswait> will read the process table of the system and wait for some process to end =head1 AUTHOR DominiX <dominix@despammed.com> =cut

So as usual, I'll be waiting for your advised recommandations for security, improvement best practice ... and so on, thanks in advance
It looks like there is problem compiling Proc::ProcessTable on Mac Os X . have a look here if interested.
Update 1: more explicit variable name suggested by rob_au
Update 2: use of Getopt::Long and pod formatting as suggested by rob_au and others
--
dominix

In reply to PleaSe WAIT for the process to end. by dominix

Title:
Use:  <p> text here (a paragraph) </p>
and:  <code> code here </code>
to format your post, it's "PerlMonks-approved HTML":



  • Posts are HTML formatted. Put <p> </p> tags around your paragraphs. Put <code> </code> tags around your code and data!
  • Titles consisting of a single word are discouraged, and in most cases are disallowed outright.
  • Read Where should I post X? if you're not absolutely sure you're posting in the right place.
  • Please read these before you post! —
  • Posts may use any of the Perl Monks Approved HTML tags:
    a, abbr, b, big, blockquote, br, caption, center, col, colgroup, dd, del, details, div, dl, dt, em, font, h1, h2, h3, h4, h5, h6, hr, i, ins, li, ol, p, pre, readmore, small, span, spoiler, strike, strong, sub, summary, sup, table, tbody, td, tfoot, th, thead, tr, tt, u, ul, wbr
  • You may need to use entities for some characters, as follows. (Exception: Within code tags, you can put the characters literally.)
            For:     Use:
    & &amp;
    < &lt;
    > &gt;
    [ &#91;
    ] &#93;
  • Link using PerlMonks shortcuts! What shortcuts can I use for linking?
  • See Writeup Formatting Tips and other pages linked from there for more info.