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 likewhile [ -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
|
---|
Replies are listed 'Best First'. | |
---|---|
Re: PleaSe WAIT for the process to end.
by BUU (Prior) on Jan 05, 2004 at 09:59 UTC | |
by dominix (Deacon) on Jan 05, 2004 at 10:32 UTC | |
by flyingmoose (Priest) on Jan 05, 2004 at 19:13 UTC | |
by dominix (Deacon) on Jan 05, 2004 at 19:40 UTC | |
by Aristotle (Chancellor) on Jan 07, 2004 at 16:29 UTC | |
| |
Re: PleaSe WAIT for the process to end.
by Anonymous Monk on Feb 13, 2004 at 23:02 UTC | |
by dominix (Deacon) on Feb 14, 2004 at 05:12 UTC |