/usr/share/doc/libproc-processtable-perl/examples/pswait is in libproc-processtable-perl 0.51-1.
This file is owned by root:root, with mode 0o755.
The actual contents of the file can be viewed below.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 | #!/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;
use Pod::Usage;
GetOptions(
'e|exit+' => \( my $endfirst = 0 ),
'v|verbose+' => \( my $verbose = 0 ),
'h|help+' => \( my $help = 0 ),
's|sleep=i' => \( my $sleeptime = 1 )
);
pod2usage(-verbose => 1) && exit if $help;
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 ...]
=head1 USAGE
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 end, it is usefull to easily manage a pool of proces with a shell script.
=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 second. On small machines (or overloaded machines) it could help to check 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 line).
=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
|