niceload: multiple -p

This commit is contained in:
Ole Tange 2012-12-10 21:57:00 +01:00
parent c6b955eb7d
commit 80d83aa489
6 changed files with 47 additions and 17 deletions

View file

@ -40,6 +40,7 @@ if($opt::factor and $opt::suspend) {
help(); help();
exit; exit;
} }
if(not (defined $opt::start_io or defined $opt::run_io if(not (defined $opt::start_io or defined $opt::run_io
or defined $opt::start_load or defined $opt::run_load or defined $opt::start_load or defined $opt::run_load
or defined $opt::start_mem or defined $opt::run_mem or defined $opt::start_mem or defined $opt::run_mem
@ -63,8 +64,9 @@ if(defined $opt::load) { multiply_binary_prefix($opt::load); }
my $limit = Limit->new(); my $limit = Limit->new();
my $process = Process->new($opt::nice,@ARGV); my $process = Process->new($opt::nice,@ARGV);
if($opt::pid) { $::exitstatus = 0;
$process->set_pid($opt::pid); if(@opt::pid) {
$process->set_pid(@opt::pid);
} elsif (@ARGV) { } elsif (@ARGV) {
# Wait until limit is below start_limit and run_limit # Wait until limit is below start_limit and run_limit
while($limit->over_start_limit() while($limit->over_start_limit()
@ -91,6 +93,11 @@ while($process->is_alive()) {
exit($::exitstatus); exit($::exitstatus);
sub uniq {
# Remove duplicates and return unique values
return keys %{{ map { $_ => 1 } @_ }};
}
sub multiply_binary_prefix { sub multiply_binary_prefix {
# Evalualte numbers with binary prefix # Evalualte numbers with binary prefix
# k=10^3, m=10^6, g=10^9, t=10^12, p=10^15, e=10^18, z=10^21, y=10^24 # k=10^3, m=10^6, g=10^9, t=10^12, p=10^15, e=10^18, z=10^21, y=10^24
@ -291,10 +298,22 @@ sub new {
}, ref($class) || $class; }, ref($class) || $class;
} }
sub pgrp {
my $self = shift;
my @pgrp;
if(not $self->{'pgrp'}) {
for(@{$self->{'pids'}}) {
push @pgrp,-getpgrp($_);
}
@pgrp = uniq(@pgrp);
@{$self->{'pgrp'}} = @pgrp;
}
return @{$self->{'pgrp'}};
}
sub set_pid { sub set_pid {
my $self = shift; my $self = shift;
$self->{'pid'} = shift; push(@{$self->{'pids'}},@_);
push(@{$self->{'pids'}},$self->{'pid'});
$self->{'running'} = 1; $self->{'running'} = 1;
$::exitstatus = 0; $::exitstatus = 0;
} }
@ -313,7 +332,6 @@ sub start {
$SIG{TSTP}=\&kill_child_TSTP; $SIG{TSTP}=\&kill_child_TSTP;
$SIG{CONT}=\&kill_child_CONT; $SIG{CONT}=\&kill_child_CONT;
sleep 1; # Give child time to setpgrp(0,0); sleep 1; # Give child time to setpgrp(0,0);
$self->{'pgrp'} = getpgrp $self->{'pid'};
} else { } else {
setpgrp(0,0); setpgrp(0,0);
::debug("Child pid: $$, pgrp: ",getpgrp $$,"\n"); ::debug("Child pid: $$, pgrp: ",getpgrp $$,"\n");
@ -345,15 +363,15 @@ sub REAPER {
sub kill_child_CONT { sub kill_child_CONT {
my $self = $Global::process; my $self = $Global::process;
::debug("SIGCONT received. Killing $self->{'pid'}\n"); ::debug("SIGCONT received. Killing @{$self->{'pgrp'}}\n");
kill CONT => -getpgrp($self->{'pid'}); kill CONT => $self->pgrp();
} }
sub kill_child_TSTP { sub kill_child_TSTP {
my $self = $Global::process; my $self = $Global::process;
::debug("SIGTSTP received. Killing $self->{'pid'} and self ($$)\n"); ::debug("SIGTSTP received. Killing $self->{'pid'} and self ($$)\n");
kill TSTP => -getpgrp($self->{'pid'}); kill TSTP => $self->pgrp();
kill STOP => -$$; kill STOP => -$$;
kill STOP => $$; kill STOP => $$;
} }
@ -362,7 +380,7 @@ sub kill_child_TSTP {
sub kill_child_INT { sub kill_child_INT {
my $self = $Global::process; my $self = $Global::process;
::debug("SIGINT received. Killing $self->{'pid'} Exit\n"); ::debug("SIGINT received. Killing $self->{'pid'} Exit\n");
kill INT => -getpgrp($self->{'pid'}); kill INT => $self->pgrp();
exit; exit;
} }

View file

@ -1965,6 +1965,10 @@ can be written like this:
@strong{cat list | parallel do_something | process_output} @strong{cat list | parallel do_something | process_output}
For example: Find which host name in a list has IP address 1.2.3 4:
@strong{cat hosts.txt | parallel -P 100 host | grep 1.2.3.4}
If the processing requires more steps the for-loop like this: If the processing requires more steps the for-loop like this:
@verbatim @verbatim
@ -2194,14 +2198,6 @@ GNU @strong{parallel} can often speed this up.
This will run 1.5 job per core, and give 1000 arguments to @strong{grep}. This will run 1.5 job per core, and give 1000 arguments to @strong{grep}.
To grep a big file in parallel use @strong{--pipe}:
@strong{cat bigfile | parallel --pipe grep foo}
Depending on your disks and CPUs it may be faster to read larger blocks:
@strong{cat bigfile | parallel --pipe --block 10M grep foo}
@chapter EXAMPLE: Using remote computers @chapter EXAMPLE: Using remote computers
@anchor{EXAMPLE: Using remote computers} @anchor{EXAMPLE: Using remote computers}

View file

@ -7,5 +7,7 @@ cat <<'EOF' | stdout parallel -j0 -L1
echo '### --soft -f and test if child is actually suspended and thus takes longer' echo '### --soft -f and test if child is actually suspended and thus takes longer'
niceload --soft -t 0.2 -f 0.5 'seq 1000000 | wc;echo This should finish last' niceload --soft -t 0.2 -f 0.5 'seq 1000000 | wc;echo This should finish last'
(sleep 1; seq 1000000 | wc;echo This should finish first) (sleep 1; seq 1000000 | wc;echo This should finish first)
echo '### niceload with no arguments should give no output'
niceload
EOF EOF

View file

@ -0,0 +1,12 @@
#!/bin/bash
# force load > 10
while uptime | grep -v age:.[1-9][0-9].[0-9][0-9] >/dev/null ; do (timeout 5 nice burnP6 2>/dev/null &) done
sleep 1 &
PID1=$!
sleep 1 &
PID2=$!
sleep 1 &
PID3=$!
stdout /usr/bin/time -f %e niceload -l 8 -H -p $PID1 -p $PID2 -p $PID3 | perl -ne '$_ >= 5 and print "OK\n"'

View file

@ -1,4 +1,5 @@
### --soft -f and test if child is actually suspended and thus takes longer ### --soft -f and test if child is actually suspended and thus takes longer
### niceload with no arguments should give no output
1000000 1000000 6888896 1000000 1000000 6888896
This should finish first This should finish first
1000000 1000000 6888896 1000000 1000000 6888896

View file

@ -0,0 +1 @@
OK