mirror of
https://git.savannah.gnu.org/git/parallel.git
synced 2024-11-22 22:17:54 +00:00
parallel: --tmux needs LC_CTYPE set.
parallel: '--halt done'.
This commit is contained in:
parent
426ea9b372
commit
77da672741
|
@ -195,7 +195,7 @@ to:parallel@gnu.org, bug-parallel@gnu.org
|
||||||
|
|
||||||
Subject: GNU Parallel 20170422 ('Санкт-Петербу́рг') released <<[stable]>>
|
Subject: GNU Parallel 20170422 ('Санкт-Петербу́рг') released <<[stable]>>
|
||||||
|
|
||||||
GNU Parallel 20170422 ('Stockholm/London/Санкт-Петербу́рг') <<[stable]>> has been released. It is available for download at: http://ftpmirror.gnu.org/parallel/
|
GNU Parallel 20170422 ('Paris/Stockholm/London/Санкт-Петербу́рг') <<[stable]>> has been released. It is available for download at: http://ftpmirror.gnu.org/parallel/
|
||||||
|
|
||||||
<<No new functionality was introduced so this is a good candidate for a stable release.>>
|
<<No new functionality was introduced so this is a good candidate for a stable release.>>
|
||||||
|
|
||||||
|
@ -218,6 +218,9 @@ https://128.84.21.199/pdf/1703.09026.pdf
|
||||||
https://wiki.ncsa.illinois.edu/display/ROGER/Using+GNU+Parallel
|
https://wiki.ncsa.illinois.edu/display/ROGER/Using+GNU+Parallel
|
||||||
|
|
||||||
https://github.com/lucascbeyeler/zmbackup
|
https://github.com/lucascbeyeler/zmbackup
|
||||||
|
http://helpful.knobs-dials.com/index.php/Find_and_xargs_and_parallel#Parallel
|
||||||
|
|
||||||
|
https://github.com/mlangill/microbiome_helper/wiki/Quick-Introduction-to-GNU-Parallel
|
||||||
|
|
||||||
http://journals.plos.org/plosone/article?id=10.1371/journal.pone.0174575
|
http://journals.plos.org/plosone/article?id=10.1371/journal.pone.0174575
|
||||||
|
|
||||||
|
|
|
@ -182,84 +182,6 @@ env_parallel() {
|
||||||
fi
|
fi
|
||||||
}
|
}
|
||||||
|
|
||||||
_parset() {
|
|
||||||
# $1 = variable NAME
|
|
||||||
# If ${"$1"} is an array: Then put the output into variables with those names
|
|
||||||
# else put the output into an array named ${"$1"}
|
|
||||||
# e.g.:
|
|
||||||
# # Create array named myvar
|
|
||||||
# parset myvar echo ::: {1..10}
|
|
||||||
# echo ${myvar[5]}
|
|
||||||
#
|
|
||||||
# # Put output into $var_a $var_b $var_c
|
|
||||||
# varnames=(var_a var_b var_c)
|
|
||||||
# parset -a varnames echo ::: {1..3}
|
|
||||||
# echo $var_c
|
|
||||||
#
|
|
||||||
# # Put output into $var_a2 $var_b2 $var_c2
|
|
||||||
# varname=var_a2,var_b2,var_c2
|
|
||||||
# parset -a varname echo ::: {1..3}
|
|
||||||
# echo $var_c2
|
|
||||||
#
|
|
||||||
# # Put output into $var_a3 $var_b3 $var_c3
|
|
||||||
# varname="var_a3 var_b3 var_c3"
|
|
||||||
# parset -a varname echo ::: {1..3}
|
|
||||||
# echo $var_c3
|
|
||||||
|
|
||||||
# Variable name to store in
|
|
||||||
local _parset_vname
|
|
||||||
local _parset_vnames
|
|
||||||
# Array to fetch names from
|
|
||||||
local _parset_aname
|
|
||||||
_parset_vname="$1"
|
|
||||||
_parset_aname="_nO_sUch_vAr"
|
|
||||||
shift
|
|
||||||
if [[ "-a" == "$_parset_vname" ]] ; then
|
|
||||||
# Option -a given
|
|
||||||
echo '-a given'
|
|
||||||
_parset_vname="$1"
|
|
||||||
_parset_aname="$1"
|
|
||||||
shift
|
|
||||||
if [[ "$(declare -p $_parset_vname 2>/dev/null)" =~ "declare -a" ]]; then
|
|
||||||
# OK
|
|
||||||
true
|
|
||||||
else
|
|
||||||
# error
|
|
||||||
echo "$_parset_vname" must be an array
|
|
||||||
return 1
|
|
||||||
fi
|
|
||||||
else
|
|
||||||
local _parset_splitable
|
|
||||||
_parset_splitable="$(eval echo '$'$_parset_vname)"
|
|
||||||
if echo "$_parset_splitable" | grep -E ',| ' >/dev/null ; then
|
|
||||||
# Split on , and space
|
|
||||||
_parset_vnames=( $(perl -e 'print map { s/,| /\n/g; $_ } @ARGV' "$_parset_splitable" ) )
|
|
||||||
_parset_aname="_parset_vnames"
|
|
||||||
echo first ${_parset_vnames[0]}
|
|
||||||
else
|
|
||||||
# _parset_vname should be used as an array
|
|
||||||
true
|
|
||||||
fi
|
|
||||||
fi
|
|
||||||
|
|
||||||
|
|
||||||
if [[ "$(declare -p $_parset_aname 2>/dev/null)" =~ "declare -a" ]]; then
|
|
||||||
# vname refers to an array
|
|
||||||
# The array elements refers to variable names to put output into
|
|
||||||
eval $(
|
|
||||||
parallel --files "$@" |
|
|
||||||
perl -pe 'chop;$_="\"\`cat $_; rm $_\`\"\n"' |
|
|
||||||
parallel echo {2}={1} :::: - :::+ $(eval echo '${'$_parset_aname'[@]}')
|
|
||||||
)
|
|
||||||
unset _parset_aname
|
|
||||||
else
|
|
||||||
# Put output into array ${$_parset_vname}
|
|
||||||
eval $_parset_vname="( $( parallel --files "$@" |
|
|
||||||
perl -pe 'chop;$_="\"\`cat $_; rm $_\`\" "' ) )"
|
|
||||||
fi
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
parset() {
|
parset() {
|
||||||
# If $1 contains ',' or space:
|
# If $1 contains ',' or space:
|
||||||
# Split on , to get the destination variable names
|
# Split on , to get the destination variable names
|
||||||
|
@ -286,7 +208,7 @@ parset() {
|
||||||
# Split on , or space to get the names
|
# Split on , or space to get the names
|
||||||
eval "$(
|
eval "$(
|
||||||
# Compute results into files
|
# Compute results into files
|
||||||
parallel --files "$@" |
|
parallel --files -k "$@" |
|
||||||
# var1=`cat tmpfile1; rm tmpfile1`
|
# var1=`cat tmpfile1; rm tmpfile1`
|
||||||
# var2=`cat tmpfile2; rm tmpfile2`
|
# var2=`cat tmpfile2; rm tmpfile2`
|
||||||
parallel -q echo {2}='`cat {1}; rm {1}`' :::: - :::+ $(
|
parallel -q echo {2}='`cat {1}; rm {1}`' :::: - :::+ $(
|
||||||
|
@ -297,7 +219,7 @@ parset() {
|
||||||
else
|
else
|
||||||
# $1 contains no space or ,
|
# $1 contains no space or ,
|
||||||
# => $1 is the name of the array to put data into
|
# => $1 is the name of the array to put data into
|
||||||
eval $_parset_name="( $( parallel --files "$@" |
|
eval $_parset_name="( $( parallel --files -k "$@" |
|
||||||
perl -pe 'chop;$_="\"\`cat $_; rm $_\`\" "' ) )"
|
perl -pe 'chop;$_="\"\`cat $_; rm $_\`\" "' ) )"
|
||||||
fi
|
fi
|
||||||
}
|
}
|
||||||
|
|
78
src/parallel
78
src/parallel
|
@ -279,7 +279,8 @@ sub pipe_tee_setup {
|
||||||
# cat t4 | grep 4
|
# cat t4 | grep 4
|
||||||
# cat t5 | grep 5
|
# cat t5 | grep 5
|
||||||
# Remove the tmpfifo as soon as it is open
|
# Remove the tmpfifo as soon as it is open
|
||||||
@Global::cat_prepends = map { "(rm $_;cat) < $_" } @fifos;
|
# 'exec' saves a process
|
||||||
|
@Global::cat_prepends = map { "(rm $_; exec cat) < $_" } @fifos;
|
||||||
}
|
}
|
||||||
|
|
||||||
sub pipe_part_files {
|
sub pipe_part_files {
|
||||||
|
@ -1474,6 +1475,8 @@ sub parse_halt {
|
||||||
$Global::halt_fail = 1;
|
$Global::halt_fail = 1;
|
||||||
} elsif($fail_success eq "success") {
|
} elsif($fail_success eq "success") {
|
||||||
$Global::halt_success = 1;
|
$Global::halt_success = 1;
|
||||||
|
} elsif($fail_success eq "done") {
|
||||||
|
$Global::halt_done = 1;
|
||||||
} else {
|
} else {
|
||||||
::error("--halt $when must be followed by ,success or ,fail.");
|
::error("--halt $when must be followed by ,success or ,fail.");
|
||||||
::wait_and_exit(255);
|
::wait_and_exit(255);
|
||||||
|
@ -3812,7 +3815,7 @@ sub reaper {
|
||||||
# Free the jobslot
|
# Free the jobslot
|
||||||
$job->free_slot();
|
$job->free_slot();
|
||||||
if($opt::timeout and not $job->exitstatus()) {
|
if($opt::timeout and not $job->exitstatus()) {
|
||||||
# Update average runtime for timeout
|
# Update average runtime for timeout only for successful jobs
|
||||||
$Global::timeoutq->update_median_runtime($job->runtime());
|
$Global::timeoutq->update_median_runtime($job->runtime());
|
||||||
}
|
}
|
||||||
if($opt::keeporder) {
|
if($opt::keeporder) {
|
||||||
|
@ -4224,7 +4227,10 @@ sub qqx {
|
||||||
# that /bin/sh does not understand
|
# that /bin/sh does not understand
|
||||||
my $PATH = $ENV{'PATH'};
|
my $PATH = $ENV{'PATH'};
|
||||||
my %env;
|
my %env;
|
||||||
my @keep = qw(PATH SSH_AUTH_SOCK SSH_AGENT_PID);
|
# ssh with ssh-agent needs PATH SSH_AUTH_SOCK SSH_AGENT_PID
|
||||||
|
# ssh with Kerberos needs KRB5CCNAME
|
||||||
|
# tmux needs LC_CTYPE
|
||||||
|
my @keep = qw(PATH SSH_AUTH_SOCK SSH_AGENT_PID KRB5CCNAME LC_CTYPE);
|
||||||
@env{@keep} = @ENV{@keep};
|
@env{@keep} = @ENV{@keep};
|
||||||
local(%ENV);
|
local(%ENV);
|
||||||
%ENV = %env;
|
%ENV = %env;
|
||||||
|
@ -8774,13 +8780,7 @@ sub set_exitsignal {
|
||||||
# Should we halt? Immediately? Gracefully?
|
# Should we halt? Immediately? Gracefully?
|
||||||
# Returns: N/A
|
# Returns: N/A
|
||||||
my $job = shift;
|
my $job = shift;
|
||||||
# --halt # => 1..100 (number of jobs failed, 101 means > 100)
|
my $limit;
|
||||||
# --halt % => 1..100 (pct of jobs failed)
|
|
||||||
if($Global::halt_pct and not $Global::halt_count) {
|
|
||||||
$total_jobs ||= $Global::JobQueue->total_jobs();
|
|
||||||
# From the pct compute the number of jobs that must fail/succeed
|
|
||||||
$Global::halt_count = $total_jobs * $Global::halt_pct;
|
|
||||||
}
|
|
||||||
if($job->exitstatus() or $job->exitsignal()) {
|
if($job->exitstatus() or $job->exitsignal()) {
|
||||||
# Job failed
|
# Job failed
|
||||||
$Global::exitstatus++;
|
$Global::exitstatus++;
|
||||||
|
@ -8788,46 +8788,56 @@ sub set_exitsignal {
|
||||||
if($Global::halt_fail) {
|
if($Global::halt_fail) {
|
||||||
::status("$Global::progname: This job failed:",
|
::status("$Global::progname: This job failed:",
|
||||||
$job->replaced());
|
$job->replaced());
|
||||||
if($Global::halt_count <= $Global::total_failed) {
|
$limit = $Global::total_failed;
|
||||||
# At least N jobs had failed
|
}
|
||||||
|
} elsif($Global::halt_success) {
|
||||||
|
::status("$Global::progname: This job succeeded:",
|
||||||
|
$job->replaced());
|
||||||
|
$limit = $Global::total_completed-$Global::total_failed;
|
||||||
|
}
|
||||||
|
if($Global::halt_done) {
|
||||||
|
::status("$Global::progname: This job finished:",
|
||||||
|
$job->replaced());
|
||||||
|
$limit = $Global::total_completed;
|
||||||
|
}
|
||||||
|
if(not defined $limit) {
|
||||||
|
return ""
|
||||||
|
}
|
||||||
|
# --halt # => 1..100 (number of jobs failed, 101 means > 100)
|
||||||
|
# --halt % => 1..100 (pct of jobs failed)
|
||||||
|
if($Global::halt_pct and not $Global::halt_count) {
|
||||||
|
$total_jobs ||= $Global::JobQueue->total_jobs();
|
||||||
|
# From the pct compute the number of jobs that must fail/succeed
|
||||||
|
$Global::halt_count = $total_jobs * $Global::halt_pct;
|
||||||
|
}
|
||||||
|
if($limit >= $Global::halt_count) {
|
||||||
|
# At least N jobs have failed/succeded/completed
|
||||||
|
# or at least N% have failed/succeded/completed
|
||||||
|
# So we should prepare for exit
|
||||||
|
if($Global::halt_fail or $Global::halt_done) {
|
||||||
|
# Set exit status
|
||||||
if(not defined $Global::halt_exitstatus) {
|
if(not defined $Global::halt_exitstatus) {
|
||||||
if($Global::halt_pct) {
|
if($Global::halt_pct) {
|
||||||
# --halt now,fail=X% or soon,fail=X%
|
# --halt now,fail=X% or soon,fail=X%
|
||||||
|
# --halt now,done=X% or soon,done=X%
|
||||||
$Global::halt_exitstatus =
|
$Global::halt_exitstatus =
|
||||||
::ceil($Global::total_failed / $total_jobs * 100);
|
::ceil($Global::total_failed / $total_jobs * 100);
|
||||||
} elsif($Global::halt_count) {
|
} elsif($Global::halt_count) {
|
||||||
# --halt now,fail=X or soon,fail=X
|
# --halt now,fail=X or soon,fail=X
|
||||||
|
# --halt now,done=X or soon,done=X
|
||||||
$Global::halt_exitstatus = ::min($Global::total_failed,101);
|
$Global::halt_exitstatus = ::min($Global::total_failed,101);
|
||||||
}
|
}
|
||||||
if($Global::halt_count and $Global::halt_count == 1) {
|
if($Global::halt_count and $Global::halt_count == 1) {
|
||||||
# --halt now,fail=1 or soon,fail=1
|
# --halt now,fail=1 or soon,fail=1
|
||||||
|
# --halt now,done=1 or soon,done=1
|
||||||
$Global::halt_exitstatus = $job->exitstatus();
|
$Global::halt_exitstatus = $job->exitstatus();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
::debug("halt","Pct: ",$Global::halt_pct,
|
::debug("halt","Pct: ",$Global::halt_pct,
|
||||||
" count: ",$Global::halt_count,"\n");
|
" count: ",$Global::halt_count,"\n");
|
||||||
if($Global::halt_when eq "soon"
|
} elsif($Global::halt_success) {
|
||||||
and scalar(keys %Global::running) > 0) {
|
|
||||||
::status
|
|
||||||
("$Global::progname: Starting no more jobs. ".
|
|
||||||
"Waiting for ". (keys %Global::running).
|
|
||||||
" jobs to finish.");
|
|
||||||
$Global::start_no_new_jobs ||= 1;
|
|
||||||
}
|
|
||||||
return($Global::halt_when);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
if($Global::halt_success) {
|
|
||||||
::debug("halt","Pct: ",$Global::halt_pct,"<=",
|
|
||||||
" count: ",$Global::halt_count,"\n");
|
|
||||||
::status("$Global::progname: This job succeeded:",
|
|
||||||
$job->replaced());
|
|
||||||
if($Global::halt_count <=
|
|
||||||
$Global::total_completed-$Global::total_failed) {
|
|
||||||
# At least N jobs had success
|
|
||||||
# or at least N% had success
|
|
||||||
$Global::halt_exitstatus = 0;
|
$Global::halt_exitstatus = 0;
|
||||||
|
}
|
||||||
if($Global::halt_when eq "soon"
|
if($Global::halt_when eq "soon"
|
||||||
and scalar(keys %Global::running) > 0) {
|
and scalar(keys %Global::running) > 0) {
|
||||||
::status
|
::status
|
||||||
|
@ -8838,8 +8848,6 @@ sub set_exitsignal {
|
||||||
}
|
}
|
||||||
return($Global::halt_when);
|
return($Global::halt_when);
|
||||||
}
|
}
|
||||||
}
|
|
||||||
}
|
|
||||||
return "";
|
return "";
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -760,10 +760,10 @@ I<when> can be 'now' which means kill all running jobs and halt
|
||||||
immediately, or it can be 'soon' which means wait for all running jobs
|
immediately, or it can be 'soon' which means wait for all running jobs
|
||||||
to complete, but start no new jobs.
|
to complete, but start no new jobs.
|
||||||
|
|
||||||
I<why> can be 'fail=X', 'fail=Y%', 'success=X', or 'success=Y%' where
|
I<why> can be 'fail=X', 'fail=Y%', 'success=X', 'success=Y%',
|
||||||
X is the number of jobs that has to fail or succeed before halting,
|
'done=X', or 'done=Y%' where X is the number of jobs that has to fail,
|
||||||
and Y is the percentage of jobs that has to fail or succeed before
|
succeed, or be done before halting, and Y is the percentage of jobs
|
||||||
halting.
|
that has to fail, succeed, or be done before halting.
|
||||||
|
|
||||||
Example:
|
Example:
|
||||||
|
|
||||||
|
@ -793,6 +793,18 @@ exit when 3 jobs succeeds, but wait for running jobs to complete.
|
||||||
|
|
||||||
exit when 3% of the jobs have succeeded. Kill running jobs.
|
exit when 3% of the jobs have succeeded. Kill running jobs.
|
||||||
|
|
||||||
|
=item Z<> --halt now,done=1
|
||||||
|
|
||||||
|
exit when one of the jobs finishes. Kill running jobs.
|
||||||
|
|
||||||
|
=item Z<> --halt soon,done=3
|
||||||
|
|
||||||
|
exit when 3 jobs finishes, but wait for running jobs to complete.
|
||||||
|
|
||||||
|
=item Z<> --halt now,done=3%
|
||||||
|
|
||||||
|
exit when 3% of the jobs have finished. Kill running jobs.
|
||||||
|
|
||||||
=back
|
=back
|
||||||
|
|
||||||
For backwards compability these also work:
|
For backwards compability these also work:
|
||||||
|
@ -2281,8 +2293,8 @@ Time out for command. If the command runs for longer than I<secs>
|
||||||
seconds it will get killed as per B<--termseq>.
|
seconds it will get killed as per B<--termseq>.
|
||||||
|
|
||||||
If I<secs> is followed by a % then the timeout will dynamically be
|
If I<secs> is followed by a % then the timeout will dynamically be
|
||||||
computed as a percentage of the median average runtime. Only values
|
computed as a percentage of the median average runtime of successful
|
||||||
> 100% will make sense.
|
jobs. Only values > 100% will make sense.
|
||||||
|
|
||||||
|
|
||||||
=item B<--verbose>
|
=item B<--verbose>
|
||||||
|
|
|
@ -685,7 +685,7 @@ par_tagstring_pipe() {
|
||||||
|
|
||||||
par_link_files_as_only_arg() {
|
par_link_files_as_only_arg() {
|
||||||
echo 'bug #50685: single ::::+ does not work'
|
echo 'bug #50685: single ::::+ does not work'
|
||||||
parallel echo ::::+ <(seq 10) <(seq 3) <(seq 4)
|
parallel -k echo ::::+ <(seq 10) <(seq 3) <(seq 4)
|
||||||
}
|
}
|
||||||
|
|
||||||
export -f $(compgen -A function | grep par_)
|
export -f $(compgen -A function | grep par_)
|
||||||
|
|
|
@ -16,6 +16,7 @@ par_retries_unreachable() {
|
||||||
}
|
}
|
||||||
|
|
||||||
par_outside_file_handle_limit() {
|
par_outside_file_handle_limit() {
|
||||||
|
ulimit -n 1024
|
||||||
echo "### Test Force outside the file handle limit, 2009-02-17 Gave fork error"
|
echo "### Test Force outside the file handle limit, 2009-02-17 Gave fork error"
|
||||||
(echo echo Start; seq 1 20000 | perl -pe 's/^/true /'; echo echo end) |
|
(echo echo Start; seq 1 20000 | perl -pe 's/^/true /'; echo echo end) |
|
||||||
stdout parallel -uj 0 | egrep -v 'processes took|adjusting' |
|
stdout parallel -uj 0 | egrep -v 'processes took|adjusting' |
|
||||||
|
|
|
@ -201,32 +201,33 @@ par_parset() {
|
||||||
. `which env_parallel.bash`
|
. `which env_parallel.bash`
|
||||||
|
|
||||||
echo 'Put output into $myarray'
|
echo 'Put output into $myarray'
|
||||||
parset myarray seq 10 ::: 14 15 16
|
parset myarray -k seq 10 ::: 14 15 16
|
||||||
echo "${myarray[1]}"
|
echo "${myarray[1]}"
|
||||||
|
|
||||||
echo 'Put output into vars "$seq, $pwd, $ls"'
|
echo 'Put output into vars "$seq, $pwd, $ls"'
|
||||||
parset "seq pwd ls" ::: "seq 10" pwd ls
|
parset "seq pwd ls" -k ::: "seq 10" pwd ls
|
||||||
echo "$seq"
|
echo "$seq"
|
||||||
|
|
||||||
echo 'Put output into vars ($seq, $pwd, $ls)':
|
echo 'Put output into vars ($seq, $pwd, $ls)':
|
||||||
into_vars=(seq pwd ls)
|
into_vars=(seq pwd ls)
|
||||||
parset "${into_vars[*]}" ::: "seq 5" pwd ls
|
parset "${into_vars[*]}" -k ::: "seq 5" pwd ls
|
||||||
echo "$seq"
|
echo "$seq"
|
||||||
|
|
||||||
echo 'The commands to run can be an array'
|
echo 'The commands to run can be an array'
|
||||||
cmd=("echo '<<joe \"double space\" cartoon>>'" "pwd")
|
cmd=("echo '<<joe \"double space\" cartoon>>'" "pwd")
|
||||||
parset data ::: "${cmd[@]}"
|
parset data -k ::: "${cmd[@]}"
|
||||||
echo "${data[0]}"
|
echo "${data[0]}"
|
||||||
echo "${data[1]}"
|
echo "${data[1]}"
|
||||||
|
|
||||||
echo 'You cannot pipe into parset, but must use a tempfile'
|
echo 'You cannot pipe into parset, but must use a tempfile'
|
||||||
seq 10 > parallel_input
|
seq 10 > /tmp/parset_input_$$
|
||||||
parset res echo :::: parallel_input
|
parset res -k echo :::: /tmp/parset_input_$$
|
||||||
echo "${res[0]}"
|
echo "${res[0]}"
|
||||||
echo "${res[9]}"
|
echo "${res[9]}"
|
||||||
|
rm /tmp/parset_input_$$
|
||||||
|
|
||||||
echo 'Commands with newline require -0'
|
echo 'Commands with newline require -0'
|
||||||
parset var -0 ::: 'echo "line1
|
parset var -k -0 ::: 'echo "line1
|
||||||
line2"' 'echo "command2"'
|
line2"' 'echo "command2"'
|
||||||
echo "${var[0]}"
|
echo "${var[0]}"
|
||||||
}
|
}
|
||||||
|
|
|
@ -4,12 +4,13 @@ par_print_before_halt_on_error() {
|
||||||
echo '### What is printed before the jobs are killed'
|
echo '### What is printed before the jobs are killed'
|
||||||
mytest() {
|
mytest() {
|
||||||
HALT=$1
|
HALT=$1
|
||||||
(echo 0;
|
(echo 0.1;
|
||||||
echo 3;
|
echo 3.2;
|
||||||
seq 0 7;
|
seq 0 7;
|
||||||
echo 0;
|
echo 0.3;
|
||||||
echo 8) |
|
echo 8) |
|
||||||
parallel --tag -j10 -kq --halt $HALT perl -e 'sleep $ARGV[0];print STDERR @ARGV,"\n"; '$HALT' > 0 ? exit shift : exit not shift;';
|
parallel --tag --delay 0.1 -j4 -kq --halt $HALT \
|
||||||
|
perl -e 'sleep 1; sleep $ARGV[0]; print STDERR "",@ARGV,"\n"; '$HALT' > 0 ? exit shift : exit not shift;' {};
|
||||||
echo exit code $?
|
echo exit code $?
|
||||||
}
|
}
|
||||||
export -f mytest
|
export -f mytest
|
||||||
|
@ -20,19 +21,20 @@ par_testhalt() {
|
||||||
testhalt_false() {
|
testhalt_false() {
|
||||||
echo '### testhalt --halt '$1;
|
echo '### testhalt --halt '$1;
|
||||||
(yes 0 | head -n 10; seq 10) |
|
(yes 0 | head -n 10; seq 10) |
|
||||||
stdout parallel -kj4 --halt $1 \
|
stdout parallel -kj4 --delay 0.23 --halt $1 \
|
||||||
'sleep {= $_=0.3*($_+1+seq()) =}; exit {}'; echo $?;
|
'echo job {#}; sleep {= $_=0.3*($_+1+seq()) =}; exit {}'; echo $?;
|
||||||
}
|
}
|
||||||
testhalt_true() {
|
testhalt_true() {
|
||||||
|
echo '### testhalt --halt '$1;
|
||||||
(seq 10; yes 0 | head -n 10) |
|
(seq 10; yes 0 | head -n 10) |
|
||||||
stdout parallel -kj4 --halt $1 \
|
stdout parallel -kj4 --delay 0.17 --halt $1 \
|
||||||
'sleep {= $_=0.3*($_+1+seq()) =}; exit {}'; echo $?;
|
'echo job {#}; sleep {= $_=0.3*($_+1+seq()) =}; exit {}'; echo $?;
|
||||||
};
|
};
|
||||||
export -f testhalt_false;
|
export -f testhalt_false;
|
||||||
export -f testhalt_true;
|
export -f testhalt_true;
|
||||||
|
|
||||||
stdout parallel -kj0 testhalt_{4} {1},{2}={3} \
|
stdout parallel -kj0 --delay 0.11 --tag testhalt_{4} {1},{2}={3} \
|
||||||
::: now soon ::: fail success ::: 0 1 2 30% 70% ::: true false |
|
::: now soon ::: fail success done ::: 0 1 2 30% 70% ::: true false |
|
||||||
# Remove lines that only show up now and then
|
# Remove lines that only show up now and then
|
||||||
perl -ne '/Starting no more jobs./ or print'
|
perl -ne '/Starting no more jobs./ or print'
|
||||||
}
|
}
|
||||||
|
|
|
@ -950,7 +950,7 @@ par_bash_environment_too_big() {
|
||||||
env_parallel -S lo echo ::: OK
|
env_parallel -S lo echo ::: OK
|
||||||
|
|
||||||
bigvar=u
|
bigvar=u
|
||||||
eval 'bigfunc() { a="'"$(yes a| head -c 118k)"'"; };'
|
eval 'bigfunc() { a="'"$(yes a| head -c 120k)"'"; };'
|
||||||
env_parallel echo ::: OK
|
env_parallel echo ::: OK
|
||||||
env_parallel -S lo echo ::: OK
|
env_parallel -S lo echo ::: OK
|
||||||
|
|
||||||
|
@ -963,7 +963,7 @@ par_bash_environment_too_big() {
|
||||||
env_parallel -S lo echo ::: fail
|
env_parallel -S lo echo ::: fail
|
||||||
|
|
||||||
bigvar=u
|
bigvar=u
|
||||||
eval 'bigfunc() { a="'"$(yes a| head -c 119k)"'"; };'
|
eval 'bigfunc() { a="'"$(yes a| head -c 121k)"'"; };'
|
||||||
env_parallel echo ::: fail
|
env_parallel echo ::: fail
|
||||||
env_parallel -S lo echo ::: fail
|
env_parallel -S lo echo ::: fail
|
||||||
_EOF
|
_EOF
|
||||||
|
|
|
@ -111,5 +111,5 @@ echo '### Test bug #35820: sem breaks if $HOME is not writable'
|
||||||
rm -rf /tmp/.parallel;
|
rm -rf /tmp/.parallel;
|
||||||
HOME=/tmp sem echo OK;
|
HOME=/tmp sem echo OK;
|
||||||
HOME=/tmp sem --wait;
|
HOME=/tmp sem --wait;
|
||||||
HOME=/usr/this/should/fail stdout sem echo should fail
|
ssh lo 'HOME=/usr/this/should/fail stdout sem echo should fail'
|
||||||
EOF
|
EOF
|
||||||
|
|
|
@ -7,26 +7,6 @@ test -d "parallel-00000000" || mkdir "parallel-00000000"
|
||||||
(cd src && make top_distdir=../parallel-00000000 distdir=../parallel-00000000/src \
|
(cd src && make top_distdir=../parallel-00000000 distdir=../parallel-00000000/src \
|
||||||
am__remove_distdir=: am__skip_length_check=: am__skip_mode_fix=: distdir)
|
am__remove_distdir=: am__skip_length_check=: am__skip_mode_fix=: distdir)
|
||||||
make[0]: Entering directory '~/privat/parallel/src'
|
make[0]: Entering directory '~/privat/parallel/src'
|
||||||
pod2man --release='00000000' --center='parallel' \
|
|
||||||
--section=1 ./parset > ./parset.1n \
|
|
||||||
&& mv ./parset.1n ./parset.1 \
|
|
||||||
|| echo "Warning: pod2man not found. Using old parset.1"
|
|
||||||
/bin/bash: pod2man: command not found
|
|
||||||
Warning: pod2man not found. Using old parset.1
|
|
||||||
pod2html --title "GNU parset" ./parset > ./parset.htmln \
|
|
||||||
&& mv ./parset.htmln ./parset.html \
|
|
||||||
|| echo "Warning: pod2html not found. Using old parset.html"
|
|
||||||
/bin/bash: pod2html: command not found
|
|
||||||
Warning: pod2html not found. Using old parset.html
|
|
||||||
rm -f ./pod2htm*
|
|
||||||
pod2texi --output=./parset.texi ./parset \
|
|
||||||
|| echo "Warning: pod2texi not found. Using old parset.texi"
|
|
||||||
/bin/bash: pod2texi: command not found
|
|
||||||
Warning: pod2texi not found. Using old parset.texi
|
|
||||||
pod2pdf --output-file ./parset.pdf ./parset --title "GNU parset" \
|
|
||||||
|| echo "Warning: pod2pdf not found. Using old parset.pdf"
|
|
||||||
/bin/bash: pod2pdf: command not found
|
|
||||||
Warning: pod2pdf not found. Using old parset.pdf
|
|
||||||
make[0]: Leaving directory '~/privat/parallel/src'
|
make[0]: Leaving directory '~/privat/parallel/src'
|
||||||
test -n "" \
|
test -n "" \
|
||||||
|| find "parallel-00000000" -type d ! -perm -755 \
|
|| find "parallel-00000000" -type d ! -perm -755 \
|
||||||
|
@ -101,12 +81,6 @@ pod2man --release='00000000' --center='parallel' \
|
||||||
|| echo "Warning: pod2man not found. Using old parallel_alternatives.7"
|
|| echo "Warning: pod2man not found. Using old parallel_alternatives.7"
|
||||||
/bin/bash: pod2man: command not found
|
/bin/bash: pod2man: command not found
|
||||||
Warning: pod2man not found. Using old parallel_alternatives.7
|
Warning: pod2man not found. Using old parallel_alternatives.7
|
||||||
pod2man --release='00000000' --center='parallel' \
|
|
||||||
--section=1 ./parset > ./parset.1n \
|
|
||||||
&& mv ./parset.1n ./parset.1 \
|
|
||||||
|| echo "Warning: pod2man not found. Using old parset.1"
|
|
||||||
/bin/bash: pod2man: command not found
|
|
||||||
Warning: pod2man not found. Using old parset.1
|
|
||||||
pod2html --title "GNU Parallel" ./parallel.pod > ./parallel.htmln \
|
pod2html --title "GNU Parallel" ./parallel.pod > ./parallel.htmln \
|
||||||
&& mv ./parallel.htmln ./parallel.html \
|
&& mv ./parallel.htmln ./parallel.html \
|
||||||
|| echo "Warning: pod2html not found. Using old parallel.html"
|
|| echo "Warning: pod2html not found. Using old parallel.html"
|
||||||
|
@ -187,10 +161,6 @@ pod2texi --output=./parallel_alternatives.texi ./parallel_alternatives.pod \
|
||||||
|| echo "Warning: pod2texi not found. Using old parallel_alternatives.texi"
|
|| echo "Warning: pod2texi not found. Using old parallel_alternatives.texi"
|
||||||
/bin/bash: pod2texi: command not found
|
/bin/bash: pod2texi: command not found
|
||||||
Warning: pod2texi not found. Using old parallel_alternatives.texi
|
Warning: pod2texi not found. Using old parallel_alternatives.texi
|
||||||
pod2texi --output=./parset.texi ./parset \
|
|
||||||
|| echo "Warning: pod2texi not found. Using old parset.texi"
|
|
||||||
/bin/bash: pod2texi: command not found
|
|
||||||
Warning: pod2texi not found. Using old parset.texi
|
|
||||||
pod2pdf --output-file ./parallel.pdf ./parallel.pod --title "GNU Parallel" \
|
pod2pdf --output-file ./parallel.pdf ./parallel.pod --title "GNU Parallel" \
|
||||||
|| echo "Warning: pod2pdf not found. Using old parallel.pdf"
|
|| echo "Warning: pod2pdf not found. Using old parallel.pdf"
|
||||||
/bin/bash: pod2pdf: command not found
|
/bin/bash: pod2pdf: command not found
|
||||||
|
@ -223,10 +193,6 @@ pod2pdf --output-file ./parallel_alternatives.pdf ./parallel_alternatives.pod --
|
||||||
|| echo "Warning: pod2pdf not found. Using old parallel_alternatives.pdf"
|
|| echo "Warning: pod2pdf not found. Using old parallel_alternatives.pdf"
|
||||||
/bin/bash: pod2pdf: command not found
|
/bin/bash: pod2pdf: command not found
|
||||||
Warning: pod2pdf not found. Using old parallel_alternatives.pdf
|
Warning: pod2pdf not found. Using old parallel_alternatives.pdf
|
||||||
pod2pdf --output-file ./parset.pdf ./parset --title "GNU parset" \
|
|
||||||
|| echo "Warning: pod2pdf not found. Using old parset.pdf"
|
|
||||||
/bin/bash: pod2pdf: command not found
|
|
||||||
Warning: pod2pdf not found. Using old parset.pdf
|
|
||||||
make[0]: Entering directory '/tmp/parallel-00000000/src'
|
make[0]: Entering directory '/tmp/parallel-00000000/src'
|
||||||
/bin/mkdir -p '/usr/local/bin'
|
/bin/mkdir -p '/usr/local/bin'
|
||||||
/usr/bin/install -c parallel sql niceload parcat env_parallel env_parallel.ash env_parallel.bash env_parallel.csh env_parallel.dash env_parallel.fish env_parallel.ksh env_parallel.pdksh env_parallel.sh env_parallel.tcsh env_parallel.zsh '/usr/local/bin'
|
/usr/bin/install -c parallel sql niceload parcat env_parallel env_parallel.ash env_parallel.bash env_parallel.csh env_parallel.dash env_parallel.fish env_parallel.ksh env_parallel.pdksh env_parallel.sh env_parallel.tcsh env_parallel.zsh '/usr/local/bin'
|
||||||
|
@ -315,10 +281,6 @@ pod2texi --output=./parallel_alternatives.texi ./parallel_alternatives.pod \
|
||||||
|| echo "Warning: pod2texi not found. Using old parallel_alternatives.texi"
|
|| echo "Warning: pod2texi not found. Using old parallel_alternatives.texi"
|
||||||
/bin/bash: pod2texi: command not found
|
/bin/bash: pod2texi: command not found
|
||||||
Warning: pod2texi not found. Using old parallel_alternatives.texi
|
Warning: pod2texi not found. Using old parallel_alternatives.texi
|
||||||
pod2texi --output=./parset.texi ./parset \
|
|
||||||
|| echo "Warning: pod2texi not found. Using old parset.texi"
|
|
||||||
/bin/bash: pod2texi: command not found
|
|
||||||
Warning: pod2texi not found. Using old parset.texi
|
|
||||||
pod2pdf --output-file ./parallel.pdf ./parallel.pod --title "GNU Parallel" \
|
pod2pdf --output-file ./parallel.pdf ./parallel.pod --title "GNU Parallel" \
|
||||||
|| echo "Warning: pod2pdf not found. Using old parallel.pdf"
|
|| echo "Warning: pod2pdf not found. Using old parallel.pdf"
|
||||||
/bin/bash: pod2pdf: command not found
|
/bin/bash: pod2pdf: command not found
|
||||||
|
@ -351,10 +313,6 @@ pod2pdf --output-file ./parallel_alternatives.pdf ./parallel_alternatives.pod --
|
||||||
|| echo "Warning: pod2pdf not found. Using old parallel_alternatives.pdf"
|
|| echo "Warning: pod2pdf not found. Using old parallel_alternatives.pdf"
|
||||||
/bin/bash: pod2pdf: command not found
|
/bin/bash: pod2pdf: command not found
|
||||||
Warning: pod2pdf not found. Using old parallel_alternatives.pdf
|
Warning: pod2pdf not found. Using old parallel_alternatives.pdf
|
||||||
pod2pdf --output-file ./parset.pdf ./parset --title "GNU parset" \
|
|
||||||
|| echo "Warning: pod2pdf not found. Using old parset.pdf"
|
|
||||||
/bin/bash: pod2pdf: command not found
|
|
||||||
Warning: pod2pdf not found. Using old parset.pdf
|
|
||||||
/bin/mkdir -p '/usr/local/share/doc/parallel'
|
/bin/mkdir -p '/usr/local/share/doc/parallel'
|
||||||
/usr/bin/install -c -m 644 parallel.html env_parallel.html sem.html sql.html niceload.html parallel_tutorial.html parallel_design.html parallel_alternatives.html parcat.html parallel.texi env_parallel.texi sem.texi sql.texi niceload.texi parallel_tutorial.texi parallel_design.texi parallel_alternatives.texi parcat.texi parset.texi parallel.pdf env_parallel.pdf sem.pdf sql.pdf niceload.pdf parallel_tutorial.pdf parallel_design.pdf parallel_alternatives.pdf parcat.pdf parset.pdf '/usr/local/share/doc/parallel'
|
/usr/bin/install -c -m 644 parallel.html env_parallel.html sem.html sql.html niceload.html parallel_tutorial.html parallel_design.html parallel_alternatives.html parcat.html parallel.texi env_parallel.texi sem.texi sql.texi niceload.texi parallel_tutorial.texi parallel_design.texi parallel_alternatives.texi parcat.texi parset.texi parallel.pdf env_parallel.pdf sem.pdf sql.pdf niceload.pdf parallel_tutorial.pdf parallel_design.pdf parallel_alternatives.pdf parcat.pdf parset.pdf '/usr/local/share/doc/parallel'
|
||||||
pod2man --release='00000000' --center='parallel' \
|
pod2man --release='00000000' --center='parallel' \
|
||||||
|
@ -405,12 +363,6 @@ pod2man --release='00000000' --center='parallel' \
|
||||||
|| echo "Warning: pod2man not found. Using old parallel_alternatives.7"
|
|| echo "Warning: pod2man not found. Using old parallel_alternatives.7"
|
||||||
/bin/bash: pod2man: command not found
|
/bin/bash: pod2man: command not found
|
||||||
Warning: pod2man not found. Using old parallel_alternatives.7
|
Warning: pod2man not found. Using old parallel_alternatives.7
|
||||||
pod2man --release='00000000' --center='parallel' \
|
|
||||||
--section=1 ./parset > ./parset.1n \
|
|
||||||
&& mv ./parset.1n ./parset.1 \
|
|
||||||
|| echo "Warning: pod2man not found. Using old parset.1"
|
|
||||||
/bin/bash: pod2man: command not found
|
|
||||||
Warning: pod2man not found. Using old parset.1
|
|
||||||
/bin/mkdir -p '/usr/local/share/man/man1'
|
/bin/mkdir -p '/usr/local/share/man/man1'
|
||||||
/usr/bin/install -c -m 644 parallel.1 env_parallel.1 sem.1 sql.1 niceload.1 parcat.1 parset.1 '/usr/local/share/man/man1'
|
/usr/bin/install -c -m 644 parallel.1 env_parallel.1 sem.1 sql.1 niceload.1 parcat.1 parset.1 '/usr/local/share/man/man1'
|
||||||
/bin/mkdir -p '/usr/local/share/man/man7'
|
/bin/mkdir -p '/usr/local/share/man/man7'
|
||||||
|
|
|
@ -1,9 +1,9 @@
|
||||||
make[1]: Entering directory '/mnt/4tb/home/tange/privat/parallel/testsuite'
|
make[1]: Entering directory '~/privat/parallel/testsuite'
|
||||||
# || true - because this should not fail if the VM is not running
|
# || true - because this should not fail if the VM is not running
|
||||||
VBoxManage controlvm CentOS3-root:centos3 savestate || true
|
VBoxManage controlvm CentOS3-root:centos3 savestate || true
|
||||||
VBoxManage controlvm RedHat9-root:redhat9 savestate || true
|
VBoxManage controlvm RedHat9-root:redhat9 savestate || true
|
||||||
VBoxManage controlvm OracleXE savestate || true
|
VBoxManage controlvm OracleXE savestate || true
|
||||||
make[1]: Leaving directory '/mnt/4tb/home/tange/privat/parallel/testsuite'
|
make[1]: Leaving directory '~/privat/parallel/testsuite'
|
||||||
echo '### bug #44358: 2 GB records cause problems for -N'
|
echo '### bug #44358: 2 GB records cause problems for -N'
|
||||||
### bug #44358: 2 GB records cause problems for -N
|
### bug #44358: 2 GB records cause problems for -N
|
||||||
echo '5 GB version: Eats 12.5 GB'
|
echo '5 GB version: Eats 12.5 GB'
|
||||||
|
@ -52,7 +52,7 @@ Eats 4.7 GB
|
||||||
parallel: Warning: --blocksize >= 2G causes problems. Using 2G-1.
|
parallel: Warning: --blocksize >= 2G causes problems. Using 2G-1.
|
||||||
echo '**'
|
echo '**'
|
||||||
**
|
**
|
||||||
make[1]: Entering directory '/mnt/4tb/home/tange/privat/parallel/testsuite'
|
make[1]: Entering directory '~/privat/parallel/testsuite'
|
||||||
# Make sure we can reach the virtual machines
|
# Make sure we can reach the virtual machines
|
||||||
#sudo ifconfig wlp13s0:0 192.168.1.72 || sudo ifconfig wlan0:0 192.168.1.72
|
#sudo ifconfig wlp13s0:0 192.168.1.72 || sudo ifconfig wlan0:0 192.168.1.72
|
||||||
sudo ifconfig enp14s0:0 192.168.1.72 || sudo ifconfig eth0:0 192.168.1.72
|
sudo ifconfig enp14s0:0 192.168.1.72 || sudo ifconfig eth0:0 192.168.1.72
|
||||||
|
@ -64,4 +64,4 @@ VBoxManage startvm RedHat9-root:redhat9 || VBoxManage controlvm RedHat9-root:red
|
||||||
Waiting for VM "RedHat9-root:redhat9" to power on...
|
Waiting for VM "RedHat9-root:redhat9" to power on...
|
||||||
VM "RedHat9-root:redhat9" has been successfully started.
|
VM "RedHat9-root:redhat9" has been successfully started.
|
||||||
parallel 'ping {} | read' ::: redhat9.tange.dk centos3.tange.dk
|
parallel 'ping {} | read' ::: redhat9.tange.dk centos3.tange.dk
|
||||||
make[1]: Leaving directory '/mnt/4tb/home/tange/privat/parallel/testsuite'
|
make[1]: Leaving directory '~/privat/parallel/testsuite'
|
||||||
|
|
File diff suppressed because it is too large
Load diff
|
@ -237,7 +237,7 @@ echo a b | wc -w
|
||||||
2
|
2
|
||||||
echo '### Test bug #35820: sem breaks if $HOME is not writable'
|
echo '### Test bug #35820: sem breaks if $HOME is not writable'
|
||||||
### Test bug #35820: sem breaks if $HOME is not writable
|
### Test bug #35820: sem breaks if $HOME is not writable
|
||||||
echo 'Workaround: use another writable dir'; rm -rf /tmp/.parallel; HOME=/tmp sem echo OK; HOME=/tmp sem --wait; HOME=/usr/this/should/fail stdout sem echo should fail
|
echo 'Workaround: use another writable dir'; rm -rf /tmp/.parallel; HOME=/tmp sem echo OK; HOME=/tmp sem --wait; ssh lo 'HOME=/usr/this/should/fail stdout sem echo should fail'
|
||||||
Workaround: use another writable dir
|
Workaround: use another writable dir
|
||||||
OK
|
OK
|
||||||
parallel: Error: Cannot change into non-executable dir /usr/this/should/fail/.parallel: No such file or directory
|
parallel: Error: Cannot change into non-executable dir /usr/this/should/fail/.parallel/semaphores: No such file or directory
|
||||||
|
|
|
@ -699,9 +699,12 @@ Seq Host Starttime JobRuntime Send Receive Exitval Signal Command
|
||||||
9
|
9
|
||||||
9
|
9
|
||||||
9
|
9
|
||||||
|
9
|
||||||
parallel: This job failed:
|
parallel: This job failed:
|
||||||
echo X; exit X
|
echo X; exit X
|
||||||
parallel: Starting no more jobs. Waiting for 1 jobs to finish.
|
parallel: Starting no more jobs. Waiting for 1 jobs to finish.
|
||||||
|
parallel: This job failed:
|
||||||
|
echo X; exit X
|
||||||
parallel -j2 --halt now,fail=1 echo {}\; exit {} ::: 0 0 1 2 3
|
parallel -j2 --halt now,fail=1 echo {}\; exit {} ::: 0 0 1 2 3
|
||||||
9
|
9
|
||||||
9
|
9
|
||||||
|
@ -726,6 +729,8 @@ echo X; exit X
|
||||||
9
|
9
|
||||||
9
|
9
|
||||||
9
|
9
|
||||||
|
9
|
||||||
|
9
|
||||||
parallel: This job succeeded:
|
parallel: This job succeeded:
|
||||||
echo X; exit X
|
echo X; exit X
|
||||||
parallel -k --retries 3 \
|
parallel -k --retries 3 \
|
||||||
|
|
Loading…
Reference in a new issue