parallel: --tmux needs LC_CTYPE set.

parallel: '--halt done'.
This commit is contained in:
Ole Tange 2017-04-22 22:42:11 +02:00
parent 426ea9b372
commit 77da672741
15 changed files with 1505 additions and 778 deletions

View file

@ -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

View file

@ -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
} }

View file

@ -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,58 +8788,66 @@ 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
if(not defined $Global::halt_exitstatus) {
if($Global::halt_pct) {
# --halt now,fail=X% or soon,fail=X%
$Global::halt_exitstatus =
::ceil($Global::total_failed / $total_jobs * 100);
} elsif($Global::halt_count) {
# --halt now,fail=X or soon,fail=X
$Global::halt_exitstatus = ::min($Global::total_failed,101);
}
if($Global::halt_count and $Global::halt_count == 1) {
# --halt now,fail=1 or soon,fail=1
$Global::halt_exitstatus = $job->exitstatus();
}
}
::debug("halt","Pct: ",$Global::halt_pct,
" count: ",$Global::halt_count,"\n");
if($Global::halt_when eq "soon"
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;
if($Global::halt_when eq "soon"
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);
}
} }
} 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($Global::halt_pct) {
# --halt now,fail=X% or soon,fail=X%
# --halt now,done=X% or soon,done=X%
$Global::halt_exitstatus =
::ceil($Global::total_failed / $total_jobs * 100);
} elsif($Global::halt_count) {
# --halt now,fail=X or soon,fail=X
# --halt now,done=X or soon,done=X
$Global::halt_exitstatus = ::min($Global::total_failed,101);
}
if($Global::halt_count and $Global::halt_count == 1) {
# --halt now,fail=1 or soon,fail=1
# --halt now,done=1 or soon,done=1
$Global::halt_exitstatus = $job->exitstatus();
}
}
::debug("halt","Pct: ",$Global::halt_pct,
" count: ",$Global::halt_count,"\n");
} elsif($Global::halt_success) {
$Global::halt_exitstatus = 0;
}
if($Global::halt_when eq "soon"
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);
}
return ""; return "";
} }
} }

View file

@ -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>

View file

@ -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_)

View file

@ -16,17 +16,18 @@ par_retries_unreachable() {
} }
par_outside_file_handle_limit() { par_outside_file_handle_limit() {
echo "### Test Force outside the file handle limit, 2009-02-17 Gave fork error" ulimit -n 1024
(echo echo Start; seq 1 20000 | perl -pe 's/^/true /'; echo echo end) | echo "### Test Force outside the file handle limit, 2009-02-17 Gave fork error"
stdout parallel -uj 0 | egrep -v 'processes took|adjusting' | (echo echo Start; seq 1 20000 | perl -pe 's/^/true /'; echo echo end) |
perl -pe 's/\d\d\d/999/' stdout parallel -uj 0 | egrep -v 'processes took|adjusting' |
perl -pe 's/\d\d\d/999/'
} }
par_over_4GB() { par_over_4GB() {
echo '### Test if we can deal with output > 4 GB' echo '### Test if we can deal with output > 4 GB'
echo | echo |
nice parallel --tmpdir $TMP5G -q perl -e '$a="x"x1000000;for(0..4300){print $a}' | nice parallel --tmpdir $TMP5G -q perl -e '$a="x"x1000000;for(0..4300){print $a}' |
nice md5sum nice md5sum
} }

View file

@ -135,7 +135,7 @@ par_result() {
parallel -k --results /tmp/parallel_results_test/testA echo {1} {2} ::: I II ::: III IIII parallel -k --results /tmp/parallel_results_test/testA echo {1} {2} ::: I II ::: III IIII
ls /tmp/parallel_results_test/testA/*/*/*/*/* ls /tmp/parallel_results_test/testA/*/*/*/*/*
rm -rf /tmp/parallel_results_test/testA* rm -rf /tmp/parallel_results_test/testA*
echo "### Test --res" echo "### Test --res"
mkdir -p /tmp/parallel_results_test mkdir -p /tmp/parallel_results_test
parallel -k --res /tmp/parallel_results_test/testD echo {1} {2} ::: I II ::: III IIII parallel -k --res /tmp/parallel_results_test/testD echo {1} {2} ::: I II ::: III IIII
@ -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]}"
} }

View file

@ -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,21 +21,22 @@ 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'
} }
export -f $(compgen -A function | grep par_) export -f $(compgen -A function | grep par_)

View file

@ -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

View file

@ -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

View file

@ -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'

View file

@ -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

View file

@ -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

View file

@ -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 \