parallel: Simpler job control flow.

This commit is contained in:
Ole Tange 2018-11-23 00:30:23 +01:00
parent a6ccb85f14
commit 83ffe1af13
11 changed files with 166 additions and 152 deletions

View file

@ -205,9 +205,9 @@ from:tange@gnu.org
to:parallel@gnu.org, bug-parallel@gnu.org
stable-bcc: Jesse Alama <jessealama@fastmail.fm>
Subject: GNU Parallel 20181022 ('peoples vote cumex khashoggi Sulawesi(Palu)') released <<[stable]>>
Subject: GNU Parallel 20181122 ('Kilogram/brexitdeal/Stan Lee/Cesar Sayoc/Tree of Life/Iran') released <<[stable]>>
GNU Parallel 20181022 ('') <<[stable]>> has been released. It is available for download at: http://ftpmirror.gnu.org/parallel/
GNU Parallel 20181122 ('') <<[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.>>
@ -215,13 +215,9 @@ Quote of the month:
New in this release:
* env_parallel.fish: --session support (alpha quality)
* https://codeday.me/bug/20181015/298447.html
* GNU Parallel was cited in: High-throughput sequencing of murine immunoglobulin heavy chain repertoires using single side unique molecular identifiers on an Ion Torrent PGM https://doi.org/10.18632/oncotarget.25493
* GNU parallel in Japanese Wikipedia https://ja.wikipedia.org/wiki/GNU_parallel
* Outils de paramétrisation des tâches: lots de tâches, GNU Parallel https://www.eventbrite.ca/e/inscription-outils-de-parametrisation-des-taches-lots-de-taches-gnu-parallel-et-bqtools-midi-conference-de-50271076142
* https://qiita.com//grohiro/items/4db3fa951a4778c5c479
* Bug fixes and man page updates.

View file

@ -24,7 +24,7 @@
use strict;
use Getopt::Long;
$Global::progname="niceload";
$Global::version = 20181022;
$Global::version = 20181024;
Getopt::Long::Configure("bundling","require_order");
get_options_from_array(\@ARGV) || die_usage();
if($opt::version) {
@ -1147,7 +1147,7 @@ sub io_status_linux {
# throw away all execpt the last Device:-section
my @iostat;
for(reverse @iostat_out) {
/Device:/ and last;
/Device/ and last;
push @iostat, (split(/\s+/,$_))[13];
}
my $io = ::max(@iostat);

View file

@ -120,7 +120,7 @@ if($Global::semaphore) {
$sem = acquire_semaphore();
}
$SIG{TERM} = \&start_no_new_jobs;
start_more_jobs();
while(start_more_jobs()) {}
if($opt::tee) {
# All jobs must be running in parallel for --tee
$Global::start_no_new_jobs = 1;
@ -620,6 +620,7 @@ sub spreadstdin {
my $sleep =1;
while($Global::total_running > 0) {
$sleep = ::reap_usleep($sleep);
start_more_jobs();
}
}
$Global::start_no_new_jobs ||= 1;
@ -1554,7 +1555,7 @@ sub check_invalid_option_combinations {
sub init_globals {
# Defaults:
$Global::version = 20181022;
$Global::version = 20181024;
$Global::progname = 'parallel';
$Global::infinity = 2**31;
$Global::debug = 0;
@ -2668,7 +2669,6 @@ sub init_run_jobs {
# Returns:
# $jobs_started = number of jobs started
my $jobs_started = 0;
my $jobs_started_this_round = 0;
if($Global::start_no_new_jobs) {
return $jobs_started;
}
@ -2678,65 +2678,61 @@ sub init_run_jobs {
changed_procs_file();
changed_sshloginfile();
}
do {
$jobs_started_this_round = 0;
# This will start 1 job on each --sshlogin (if possible)
# thus distribute the jobs on the --sshlogins round robin
for my $sshlogin (values %Global::host) {
if($Global::JobQueue->empty() and not $opt::pipe) {
# No more jobs in the queue
last;
}
debug("run", "Running jobs before on ", $sshlogin->string(), ": ",
$sshlogin->jobs_running(), "\n");
if ($sshlogin->jobs_running() < $sshlogin->max_jobs_running()) {
if($opt::delay
and
$opt::delay > ::now() - $Global::newest_starttime) {
# It has been too short since last start
next;
}
if($opt::load and $sshlogin->loadavg_too_high()) {
# The load is too high or unknown
next;
}
if($opt::noswap and $sshlogin->swapping()) {
# The server is swapping
next;
}
if($opt::limit and $sshlogin->limit()) {
# Over limit
next;
}
if($opt::memfree and $sshlogin->memfree() < $opt::memfree) {
# The server has not enough mem free
::debug("mem", "Not starting job: not enough mem\n");
next;
}
if($sshlogin->too_fast_remote_login()) {
# It has been too short since
next;
}
debug("run", $sshlogin->string(),
" has ", $sshlogin->jobs_running(),
" out of ", $sshlogin->max_jobs_running(),
" jobs running. Start another.\n");
if(start_another_job($sshlogin) == 0) {
# No more jobs to start on this $sshlogin
debug("run","No jobs started on ",
$sshlogin->string(), "\n");
next;
}
$sshlogin->inc_jobs_running();
$sshlogin->set_last_login_at(::now());
$jobs_started++;
$jobs_started_this_round++;
}
debug("run","Running jobs after on ", $sshlogin->string(), ": ",
$sshlogin->jobs_running(), " of ",
$sshlogin->max_jobs_running(), "\n");
# This will start 1 job on each --sshlogin (if possible)
# thus distribute the jobs on the --sshlogins round robin
for my $sshlogin (values %Global::host) {
if($Global::JobQueue->empty() and not $opt::pipe) {
# No more jobs in the queue
last;
}
} while($jobs_started_this_round);
debug("run", "Running jobs before on ", $sshlogin->string(), ": ",
$sshlogin->jobs_running(), "\n");
if ($sshlogin->jobs_running() < $sshlogin->max_jobs_running()) {
if($opt::delay
and
$opt::delay > ::now() - $Global::newest_starttime) {
# It has been too short since last start
next;
}
if($opt::load and $sshlogin->loadavg_too_high()) {
# The load is too high or unknown
next;
}
if($opt::noswap and $sshlogin->swapping()) {
# The server is swapping
next;
}
if($opt::limit and $sshlogin->limit()) {
# Over limit
next;
}
if($opt::memfree and $sshlogin->memfree() < $opt::memfree) {
# The server has not enough mem free
::debug("mem", "Not starting job: not enough mem\n");
next;
}
if($sshlogin->too_fast_remote_login()) {
# It has been too short since
next;
}
debug("run", $sshlogin->string(),
" has ", $sshlogin->jobs_running(),
" out of ", $sshlogin->max_jobs_running(),
" jobs running. Start another.\n");
if(start_another_job($sshlogin) == 0) {
# No more jobs to start on this $sshlogin
debug("run","No jobs started on ",
$sshlogin->string(), "\n");
next;
}
$sshlogin->inc_jobs_running();
$sshlogin->set_last_login_at(::now());
$jobs_started++;
}
debug("run","Running jobs after on ", $sshlogin->string(), ": ",
$sshlogin->jobs_running(), " of ",
$sshlogin->max_jobs_running(), "\n");
}
return $jobs_started;
}
@ -2912,8 +2908,8 @@ sub drain_job_queue {
}
# * because of loadavg
# * because of too little time between each ssh login.
start_more_jobs();
$sleep = ::reap_usleep($sleep);
start_more_jobs();
if($Global::max_jobs_running == 0) {
::warning("There are no job slots available. Increase --jobs.");
}
@ -2921,6 +2917,7 @@ sub drain_job_queue {
while($opt::sqlmaster and not $Global::sql->finished()) {
# SQL master
$sleep = ::reap_usleep($sleep);
start_more_jobs();
if($Global::start_sqlworker) {
# Start an SQL worker as we are now sure there is work to do
$Global::start_sqlworker = 0;
@ -4054,27 +4051,24 @@ sub reaper {
# @pids_reaped = PIDs of children finished
my $stiff;
my @pids_reaped;
my $children_reaped = 0;
my $total_reaped;
debug("run", "Reaper ");
# For efficiency surround with BEGIN/COMMIT when using $opt::sqlmaster
$opt::sqlmaster and $Global::sql->run("BEGIN;");
while (($stiff = waitpid(-1, &WNOHANG)) > 0) {
if (($stiff = waitpid(-1, &WNOHANG)) > 0) {
# $stiff = pid of dead process
if(wantarray) {
push(@pids_reaped,$stiff);
} else {
$children_reaped++;
}
if($Global::sshmaster{$stiff}) {
# This is one of the ssh -M: ignore
next;
}
my $job = $Global::running{$stiff};
$total_reaped++;
if($Global::sshmaster{$stiff}) {
# This is one of the ssh -M: ignore
next;
}
my $job = $Global::running{$stiff};
# '-a <(seq 10)' will give us a pid not in %Global::running
$job or next;
delete $Global::running{$stiff};
$Global::total_running--;
$job or return 0;
delete $Global::running{$stiff};
$Global::total_running--;
if($job->{'commandline'}{'skip'}) {
# $job->skip() was called
$job->set_exitstatus(-2);
@ -4084,11 +4078,12 @@ sub reaper {
$job->set_exitsignal($? & 127);
}
debug("run", "seq ",$job->seq()," died (", $job->exitstatus(), ")");
$job->set_endtime(::now());
my $sshlogin = $job->sshlogin();
$sshlogin->dec_jobs_running();
if($job->should_be_retried()) {
debug("run", "seq ",$job->seq()," died (", $job->exitstatus(), ")");
$job->set_endtime(::now());
my $sshlogin = $job->sshlogin();
$sshlogin->dec_jobs_running();
if($job->should_be_retried()) {
# Free up file handles
$job->free_ressources();
} else {
# The job is done
@ -4109,18 +4104,17 @@ sub reaper {
::kill_sleep_seq($job->pid());
::killall();
::wait_and_exit($Global::halt_exitstatus);
}
}
}
}
$job->cleanup();
start_more_jobs();
if($opt::progress) {
my %progress = progress();
::status_no_nl("\r",$progress{'status'});
}
}
$opt::sqlmaster and $Global::sql->run("COMMIT;");
debug("run", "done ");
return wantarray ? @pids_reaped : $children_reaped;
return wantarray ? @pids_reaped : $total_reaped;
}
@ -5102,6 +5096,7 @@ sub reap_usleep {
# $ms*1.1 if no children reaped
my $ms = shift;
if(reaper()) {
while(reaper()) {}
if(not $Global::total_completed % 100) {
if($opt::timeout) {
# Force cleaning the timeout queue for every 1000 jobs
@ -7947,7 +7942,7 @@ sub wrapped {
$command =
'cat > $PARALLEL_TMP;'.
$command.";". postpone_exit_and_cleanup().
'$PARALLEL_TMP';
'$PARALLEL_TMP';
} elsif($opt::fifo) {
# Prepend fifo-wrapper. In essence:
# mkfifo {}
@ -8280,7 +8275,7 @@ sub sshlogin_wrap {
my $self = shift;
my $command = shift;
# TODO test that *sh -c 'parallel --env' use *sh
if(not defined $self->{'sshlogin_wrap'}) {
if(not defined $self->{'sshlogin_wrap'}{$command}) {
my $sshlogin = $self->sshlogin();
my $serverlogin = $sshlogin->serverlogin();
my $quoted_remote_command;
@ -8310,12 +8305,12 @@ sub sshlogin_wrap {
$command =~ /\n/) {
# csh does not deal well with > 1000 chars in one word
# csh does not deal well with $ENV with \n
$self->{'sshlogin_wrap'} = base64_wrap($perl_code);
$self->{'sshlogin_wrap'}{$command} = base64_wrap($perl_code);
} else {
$self->{'sshlogin_wrap'} = "perl -e ".::Q($perl_code);
$self->{'sshlogin_wrap'}{$command} = "perl -e ".::Q($perl_code);
}
} else {
$self->{'sshlogin_wrap'} = $command;
$self->{'sshlogin_wrap'}{$command} = $command;
}
} else {
my $pwd = "";
@ -8357,7 +8352,7 @@ sub sshlogin_wrap {
# We need to save the exit status of the job
$post = '_EXIT_status=$?; ' . $post . ' exit $_EXIT_status;';
}
$self->{'sshlogin_wrap'} =
$self->{'sshlogin_wrap'}{$command} =
($pre
. "$sshcmd $serverlogin -- exec "
. $quoted_remote_command
@ -8365,7 +8360,7 @@ sub sshlogin_wrap {
. $post);
}
}
return $self->{'sshlogin_wrap'};
return $self->{'sshlogin_wrap'}{$command};
}
sub transfer {

View file

@ -1716,12 +1716,19 @@ dependency graph described in a file, so this is similar to B<make>.
https://github.com/cetra3/lorikeet (Last checked: 2018-10)
=head2 DIFFERENCES BETWEEN spp AND GNU Parallel
B<spp> can run jobs in parallel. B<spp> does not use a command
template to generate the jobs, but requires jobs to be in a
file. Output from the jobs mix.
https://github.com/john01dav/spp
=head2 Todo
Url for spread
https://github.com/john01dav/spp
https://github.com/amritb/with-this.git

View file

@ -576,7 +576,7 @@ $Global::Initfile && unlink $Global::Initfile;
exit ($err);
sub parse_options {
$Global::version = 20181022;
$Global::version = 20181024;
$Global::progname = 'sql';
# This must be done first as this may exec myself

View file

@ -787,6 +787,7 @@ _EOF
par_fish_underscore() {
echo '### fish'
myscript=$(cat <<'_EOF'
echo "Fish is broken"
echo "### Testing of --env _"
# . `which env_parallel.fish`;
@ -1212,6 +1213,7 @@ _EOF
par_fish_funky() {
myscript=$(cat <<'_EOF'
echo "Fish is broken"
env_parallel --session
set myvar "myvar works"
setenv myenvvar "myenvvar works"
@ -1509,6 +1511,7 @@ _EOF
par_fish_env_parallel() {
myscript=$(cat <<'_EOF'
echo "Fish is broken"
echo 'bug #50435: Remote fifo broke in 20150522'
# Due to $PARALLEL_TMP being transferred
set OK OK

View file

@ -16,9 +16,9 @@ MAXINNERPROC=${maxinnerproc:-3}
export PARALLEL_SSH="ssh -oLogLevel=quiet"
# select a running master (suse, ubuntu, or debian)
# select a running master (debian-ppc, suse, ubuntu, or debian)
MASTER=$(parallel -j0 --delay 0.1 --halt now,success=1 $PARALLEL_SSH {} echo {} \
::: {ubuntu,suse,debian}.polarhome.com)
::: {debian-ppc,ubuntu,debian,suse}.polarhome.com)
parallel -j0 --delay 0.1 --retries $RETRIES \
rsync -L /usr/local/bin/{parallel,env_parallel,env_parallel.*[^~],parcat,stdout} \

View file

@ -372,6 +372,30 @@ par_test_build_and_install test -d "parallel-00000000" || mkdir "parallel-000000
par_test_build_and_install (cd src && make top_distdir=../parallel-00000000 distdir=../parallel-00000000/src \
par_test_build_and_install am__remove_distdir=: am__skip_length_check=: am__skip_mode_fix=: distdir)
par_test_build_and_install make[0]: Entering directory '~/privat/parallel/src'
par_test_build_and_install pod2man --release='00000000' --center='parallel' \
par_test_build_and_install --section=1 ./sql > ./sql.1n \
par_test_build_and_install && mv ./sql.1n ./sql.1 \
par_test_build_and_install || echo "Warning: pod2man not found. Using old sql.1"
par_test_build_and_install pod2html --title "GNU SQL" ./sql > ./sql.htmln \
par_test_build_and_install && mv ./sql.htmln ./sql.html \
par_test_build_and_install || echo "Warning: pod2html not found. Using old sql.html"
par_test_build_and_install rm -f ./pod2htm*
par_test_build_and_install pod2html --title "GNU niceload" ./niceload.pod > ./niceload.htmln \
par_test_build_and_install && mv ./niceload.htmln ./niceload.html \
par_test_build_and_install || echo "Warning: pod2html not found. Using old niceload.html"
par_test_build_and_install rm -f ./pod2htm*
par_test_build_and_install pod2html --title "GNU parcat" ./parcat.pod > ./parcat.htmln \
par_test_build_and_install && mv ./parcat.htmln ./parcat.html \
par_test_build_and_install || echo "Warning: pod2html not found. Using old parcat.html"
par_test_build_and_install rm -f ./pod2htm*
par_test_build_and_install pod2html --title "GNU parset" ./parset.pod > ./parset.htmln \
par_test_build_and_install && mv ./parset.htmln ./parset.html \
par_test_build_and_install || echo "Warning: pod2html not found. Using old parset.html"
par_test_build_and_install rm -f ./pod2htm*
par_test_build_and_install pod2texi --output=./sql.texi ./sql \
par_test_build_and_install || echo "Warning: pod2texi not found. Using old sql.texi"
par_test_build_and_install pod2pdf --output-file ./sql.pdf ./sql --title "GNU SQL" \
par_test_build_and_install || echo "Warning: pod2pdf not found. Using old sql.pdf"
par_test_build_and_install make[0]: Leaving directory '~/privat/parallel/src'
par_test_build_and_install test -n "" \
par_test_build_and_install || find "parallel-00000000" -type d ! -perm -755 \
@ -380,7 +404,7 @@ par_test_build_and_install ! -type d ! -perm -444 -links 1 -exec chmod a+r {}
par_test_build_and_install ! -type d ! -perm -400 -exec chmod a+r {} \; -o \
par_test_build_and_install ! -type d ! -perm -444 -exec /bin/bash ~/privat/parallel/install-sh -c -m a+r {} {} \; \
par_test_build_and_install || chmod -R a+r "parallel-00000000"
par_test_build_and_install tardir=parallel-00000000 && ${TAR-tar} chof - "$tardir" | GZIP=--best gzip -c >parallel-00000000.tar.gz
par_test_build_and_install tardir=parallel-00000000 && ${TAR-tar} chof - "$tardir" | eval GZIP= gzip --best -c >parallel-00000000.tar.gz
par_test_build_and_install make[0]: Leaving directory '~/privat/parallel'
par_test_build_and_install if test -d "parallel-00000000"; then find "parallel-00000000" -type d ! -perm -200 -exec chmod u+w {} ';' && rm -rf "parallel-00000000" || { sleep 5 && rm -rf "parallel-00000000"; }; else :; fi
par_test_build_and_install make[0]: Leaving directory '~/privat/parallel'

View file

@ -1011,36 +1011,41 @@ par_ksh_env_parallel env_parallel: Warning: See BUGS in "man env_parallel".
par_ksh_env_parallel env_parallel: Warning: See BUGS in "man env_parallel".
par_ksh_env_parallel env_parallel: Warning: See BUGS in "man env_parallel".
par_fish_underscore ### fish
par_fish_underscore Fish is broken
par_fish_underscore ### Testing of --env _
par_fish_underscore variables in aliases and arrays in functions work
par_fish_underscore variables in aliases and arrays in functions work
par_fish_underscore variables in aliases and arrays in functions work
par_fish_underscore variables in aliases and arrays in functions work
par_fish_underscore variables in aliases and arrays in functions work
par_fish_underscore variables in aliases and arrays in functions work
par_fish_underscore ^
par_fish_underscore ^
par_fish_underscore myfunc work
par_fish_underscore ^
par_fish_underscore myfunc work
par_fish_underscore ^
par_fish_underscore not_copied_alias 'error=OK'
par_fish_underscore ^
par_fish_underscore not_copied_func 'error=OK'
par_fish_underscore ^
par_fish_underscore error=OK
par_fish_underscore error=OK
par_fish_underscore aliases and arrays in functions work
par_fish_underscore aliases and arrays in functions work
par_fish_underscore aliases functions work
par_fish_underscore aliases functions work
par_fish_underscore ^
par_fish_underscore in function 'myfunc'
par_fish_underscore called on standard input
par_fish_underscore with parameter list 'work'
par_fish_underscore
par_fish_underscore myfunc work
par_fish_underscore ^
par_fish_underscore myfunc work
par_fish_underscore ^
par_fish_underscore myfunc work
par_fish_underscore ^
par_fish_underscore myfunc work
par_fish_underscore ^
par_fish_underscore myfunc work
par_fish_underscore ^
par_fish_underscore OK if ^^^^^^^^^^^^^^^^^ no myecho
par_fish_underscore ^
par_fish_underscore in function 'myfunc'
par_fish_underscore called on standard input
par_fish_underscore with parameter list 'work'
par_fish_underscore
par_fish_underscore myfunc work
par_fish_underscore ^
par_fish_underscore OK if ^^^^^^^^^^^^^^^^^ no myecho
par_fish_underscore ^
par_fish_underscore myfunc work
par_fish_underscore ^
par_fish_underscore OK if ^^^^^^^^^^^^^^^^^ no myfunc
par_fish_underscore ^
par_fish_underscore myfunc work
par_fish_underscore ^
par_fish_underscore OK if ^^^^^^^^^^^^^^^^^ no myfunc
par_fish_parset Not implemented
par_fish_man ### fish
@ -1089,6 +1094,8 @@ par_fish_man env_parallel
par_fish_man exit value 2 should be 2
par_fish_man Unknown option: no-such-option
par_fish_man exit value 255 should be 255 `sleep 1`
par_fish_funky Fish is broken
par_fish_funky setenv: Too many arguments
par_fish_funky env_parallel: Warning: ASCII value 1 in variables is not supported
par_fish_funky 3 arg alias_works
par_fish_funky env_parallel: Warning: ASCII value 1 in variables is not supported
@ -1100,7 +1107,7 @@ par_fish_funky
par_fish_funky
par_fish_funky
par_fish_funky Funky-   !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~€亗儎厗噲墛媽崕彁憭摂晼棙櫄洔潪煚、¥ウЖ┆<D096><E29486><EFBFBD>辈炒刀犯购患骄坷谅媚牌侨墒颂臀闲岩釉罩棕仝圮蒉哙徕沅彐玷殛腱眍镳耱篝貊鼬<E8B28A><E9BCAC><EFBFBD><EFBFBD>-funky
par_fish_funky Funkyenv-   !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~€亗儎厗噲墛媽崕彁憭摂晼棙櫄洔潪煚、¥ウЖ┆<D096><E29486><EFBFBD>辈炒刀犯购患骄坷谅媚牌侨墒颂臀闲岩釉罩棕仝圮蒉哙徕沅彐玷殛腱眍镳耱篝貊鼬<E8B28A><E9BCAC><EFBFBD><EFBFBD>-funkyenv
par_fish_funky Funkyenv--funkyenv
par_fish_funky
par_fish_funky
par_fish_funky
@ -1115,7 +1122,7 @@ par_fish_funky
par_fish_funky
par_fish_funky
par_fish_funky Funky-   !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~€亗儎厗噲墛媽崕彁憭摂晼棙櫄洔潪煚、¥ウЖ┆<D096><E29486><EFBFBD>辈炒刀犯购患骄坷谅媚牌侨墒颂臀闲岩釉罩棕仝圮蒉哙徕沅彐玷殛腱眍镳耱篝貊鼬<E8B28A><E9BCAC><EFBFBD><EFBFBD>-funky
par_fish_funky Funkyenv-   !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~€亗儎厗噲墛媽崕彁憭摂晼棙櫄洔潪煚、¥ウЖ┆<D096><E29486><EFBFBD>辈炒刀犯购患骄坷谅媚牌侨墒颂臀闲岩釉罩棕仝圮蒉哙徕沅彐玷殛腱眍镳耱篝貊鼬<E8B28A><E9BCAC><EFBFBD><EFBFBD>-funkyenv
par_fish_funky Funkyenv--funkyenv
par_fish_funky
par_fish_funky
par_fish_funky
@ -1123,16 +1130,11 @@ par_fish_funky
par_fish_funky '   !"#$%&'"'"'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~€亗儎厗噲墛媽崕彁憭摂晼棙櫄洔潪煚、¥ウЖ┆<D096><E29486><EFBFBD>辈炒刀犯购患骄坷谅媚牌侨墒颂臀闲岩釉罩棕仝圮蒉哙徕沅彐玷殛腱眍镳耱篝貊鼬<E8B28A><E9BCAC><EFBFBD><EFBFBD>'
par_fish_environment_too_big Not implemented
par_fish_env_parallel_session Not implemented
par_fish_env_parallel Fish is broken
par_fish_env_parallel bug #50435: Remote fifo broke in 20150522
par_fish_env_parallel TODO fix env_parallel --fifo
par_fish_env_parallel 'end' outside of a block
par_fish_env_parallel fish: end
par_fish_env_parallel ^
par_fish_env_parallel data from stdin
par_fish_env_parallel OK
par_fish_env_parallel $? is not the exit status. In fish, please use $status.
par_fish_env_parallel fish: cat $PARALLEL_TMP; and echo $OK;perl -e '$bash=shift;$csh=shift;for(@ARGV){unlink;rmdir;}if($bash=~s/h//){exit$bash;}exit$csh;' "$?h" "$status" $PARALLEL_TMP
par_fish_env_parallel ^
par_fish_env_parallel parallel: Error: Command line too long (XXX >= XXX) at input 0: $PARALLEL_TMP
par_fish_env_parallel parallel: Error: Command line too long (XXX >= XXX) at input 0: $PARALLEL_TMP
par_dash_underscore ### dash
par_dash_underscore ### Testing of --env _
par_dash_underscore variables in aliases work

View file

@ -61,7 +61,7 @@ echo '### Check that 4 processes are really used'
echo '### --version must have higher priority than retired options'
### --version must have higher priority than retired options
$NICEPAR --version -g -Y -U -W -T | tail
GNU parallel 20180923
GNU parallel 20181024
Copyright (C) 2007-2018 Ole Tange and Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>
This is free software: you are free to change and redistribute it.

View file

@ -43,7 +43,6 @@ bin/parallel freebsd copy freebsd bin/parallel parallel
bin/parallel debian copy debian bin/parallel parallel
bin/parallel hurd copy hurd bin/parallel parallel
bin/parallel minix copy minix bin/parallel parallel
bin/parallel minix cat: stdout: no space left on device
bin/env_parallel qnx copy qnx bin/env_parallel env_parallel
bin/env_parallel pidora copy pidora bin/env_parallel env_parallel
bin/env_parallel tru64 copy tru64 bin/env_parallel env_parallel
@ -69,7 +68,6 @@ bin/env_parallel freebsd copy freebsd bin/env_parallel env_parallel
bin/env_parallel debian copy debian bin/env_parallel env_parallel
bin/env_parallel hurd copy hurd bin/env_parallel env_parallel
bin/env_parallel minix copy minix bin/env_parallel env_parallel
bin/env_parallel minix cat: stdout: no space left on device
bin/env_parallel.ash qnx copy qnx bin/env_parallel.ash env_parallel.ash
bin/env_parallel.ash pidora copy pidora bin/env_parallel.ash env_parallel.ash
bin/env_parallel.ash tru64 copy tru64 bin/env_parallel.ash env_parallel.ash
@ -95,7 +93,6 @@ bin/env_parallel.ash freebsd copy freebsd bin/env_parallel.ash env_parallel.ash
bin/env_parallel.ash debian copy debian bin/env_parallel.ash env_parallel.ash
bin/env_parallel.ash hurd copy hurd bin/env_parallel.ash env_parallel.ash
bin/env_parallel.ash minix copy minix bin/env_parallel.ash env_parallel.ash
bin/env_parallel.ash minix cat: stdout: no space left on device
bin/env_parallel.bash qnx copy qnx bin/env_parallel.bash env_parallel.bash
bin/env_parallel.bash pidora copy pidora bin/env_parallel.bash env_parallel.bash
bin/env_parallel.bash tru64 copy tru64 bin/env_parallel.bash env_parallel.bash
@ -147,7 +144,6 @@ bin/env_parallel.csh freebsd copy freebsd bin/env_parallel.csh env_parallel.csh
bin/env_parallel.csh debian copy debian bin/env_parallel.csh env_parallel.csh
bin/env_parallel.csh hurd copy hurd bin/env_parallel.csh env_parallel.csh
bin/env_parallel.csh minix copy minix bin/env_parallel.csh env_parallel.csh
bin/env_parallel.csh minix cat: stdout: no space left on device
bin/env_parallel.dash qnx copy qnx bin/env_parallel.dash env_parallel.dash
bin/env_parallel.dash pidora copy pidora bin/env_parallel.dash env_parallel.dash
bin/env_parallel.dash tru64 copy tru64 bin/env_parallel.dash env_parallel.dash
@ -173,7 +169,6 @@ bin/env_parallel.dash freebsd copy freebsd bin/env_parallel.dash env_parallel.da
bin/env_parallel.dash debian copy debian bin/env_parallel.dash env_parallel.dash
bin/env_parallel.dash hurd copy hurd bin/env_parallel.dash env_parallel.dash
bin/env_parallel.dash minix copy minix bin/env_parallel.dash env_parallel.dash
bin/env_parallel.dash minix cat: stdout: no space left on device
bin/env_parallel.fish qnx copy qnx bin/env_parallel.fish env_parallel.fish
bin/env_parallel.fish pidora copy pidora bin/env_parallel.fish env_parallel.fish
bin/env_parallel.fish tru64 copy tru64 bin/env_parallel.fish env_parallel.fish
@ -199,7 +194,6 @@ bin/env_parallel.fish freebsd copy freebsd bin/env_parallel.fish env_parallel.fi
bin/env_parallel.fish debian copy debian bin/env_parallel.fish env_parallel.fish
bin/env_parallel.fish hurd copy hurd bin/env_parallel.fish env_parallel.fish
bin/env_parallel.fish minix copy minix bin/env_parallel.fish env_parallel.fish
bin/env_parallel.fish minix cat: stdout: no space left on device
bin/env_parallel.ksh qnx copy qnx bin/env_parallel.ksh env_parallel.ksh
bin/env_parallel.ksh pidora copy pidora bin/env_parallel.ksh env_parallel.ksh
bin/env_parallel.ksh tru64 copy tru64 bin/env_parallel.ksh env_parallel.ksh
@ -225,7 +219,6 @@ bin/env_parallel.ksh freebsd copy freebsd bin/env_parallel.ksh env_parallel.ksh
bin/env_parallel.ksh debian copy debian bin/env_parallel.ksh env_parallel.ksh
bin/env_parallel.ksh hurd copy hurd bin/env_parallel.ksh env_parallel.ksh
bin/env_parallel.ksh minix copy minix bin/env_parallel.ksh env_parallel.ksh
bin/env_parallel.ksh minix cat: stdout: no space left on device
bin/env_parallel.mksh qnx copy qnx bin/env_parallel.mksh env_parallel.mksh
bin/env_parallel.mksh pidora copy pidora bin/env_parallel.mksh env_parallel.mksh
bin/env_parallel.mksh tru64 copy tru64 bin/env_parallel.mksh env_parallel.mksh
@ -251,7 +244,6 @@ bin/env_parallel.mksh freebsd copy freebsd bin/env_parallel.mksh env_parallel.mk
bin/env_parallel.mksh debian copy debian bin/env_parallel.mksh env_parallel.mksh
bin/env_parallel.mksh hurd copy hurd bin/env_parallel.mksh env_parallel.mksh
bin/env_parallel.mksh minix copy minix bin/env_parallel.mksh env_parallel.mksh
bin/env_parallel.mksh minix cat: stdout: no space left on device
bin/env_parallel.pdksh qnx copy qnx bin/env_parallel.pdksh env_parallel.pdksh
bin/env_parallel.pdksh pidora copy pidora bin/env_parallel.pdksh env_parallel.pdksh
bin/env_parallel.pdksh tru64 copy tru64 bin/env_parallel.pdksh env_parallel.pdksh
@ -277,7 +269,6 @@ bin/env_parallel.pdksh freebsd copy freebsd bin/env_parallel.pdksh env_parallel.
bin/env_parallel.pdksh debian copy debian bin/env_parallel.pdksh env_parallel.pdksh
bin/env_parallel.pdksh hurd copy hurd bin/env_parallel.pdksh env_parallel.pdksh
bin/env_parallel.pdksh minix copy minix bin/env_parallel.pdksh env_parallel.pdksh
bin/env_parallel.pdksh minix cat: stdout: no space left on device
bin/env_parallel.sh qnx copy qnx bin/env_parallel.sh env_parallel.sh
bin/env_parallel.sh pidora copy pidora bin/env_parallel.sh env_parallel.sh
bin/env_parallel.sh tru64 copy tru64 bin/env_parallel.sh env_parallel.sh
@ -303,7 +294,6 @@ bin/env_parallel.sh freebsd copy freebsd bin/env_parallel.sh env_parallel.sh
bin/env_parallel.sh debian copy debian bin/env_parallel.sh env_parallel.sh
bin/env_parallel.sh hurd copy hurd bin/env_parallel.sh env_parallel.sh
bin/env_parallel.sh minix copy minix bin/env_parallel.sh env_parallel.sh
bin/env_parallel.sh minix cat: stdout: no space left on device
bin/env_parallel.tcsh qnx copy qnx bin/env_parallel.tcsh env_parallel.tcsh
bin/env_parallel.tcsh pidora copy pidora bin/env_parallel.tcsh env_parallel.tcsh
bin/env_parallel.tcsh tru64 copy tru64 bin/env_parallel.tcsh env_parallel.tcsh
@ -329,7 +319,6 @@ bin/env_parallel.tcsh freebsd copy freebsd bin/env_parallel.tcsh env_parallel.tc
bin/env_parallel.tcsh debian copy debian bin/env_parallel.tcsh env_parallel.tcsh
bin/env_parallel.tcsh hurd copy hurd bin/env_parallel.tcsh env_parallel.tcsh
bin/env_parallel.tcsh minix copy minix bin/env_parallel.tcsh env_parallel.tcsh
bin/env_parallel.tcsh minix cat: stdout: no space left on device
bin/env_parallel.zsh qnx copy qnx bin/env_parallel.zsh env_parallel.zsh
bin/env_parallel.zsh pidora copy pidora bin/env_parallel.zsh env_parallel.zsh
bin/env_parallel.zsh tru64 copy tru64 bin/env_parallel.zsh env_parallel.zsh
@ -355,7 +344,6 @@ bin/env_parallel.zsh freebsd copy freebsd bin/env_parallel.zsh env_parallel.zsh
bin/env_parallel.zsh debian copy debian bin/env_parallel.zsh env_parallel.zsh
bin/env_parallel.zsh hurd copy hurd bin/env_parallel.zsh env_parallel.zsh
bin/env_parallel.zsh minix copy minix bin/env_parallel.zsh env_parallel.zsh
bin/env_parallel.zsh minix cat: stdout: no space left on device
bin/parcat qnx copy qnx bin/parcat parcat
bin/parcat pidora copy pidora bin/parcat parcat
bin/parcat tru64 copy tru64 bin/parcat parcat
@ -381,7 +369,6 @@ bin/parcat freebsd copy freebsd bin/parcat parcat
bin/parcat debian copy debian bin/parcat parcat
bin/parcat hurd copy hurd bin/parcat parcat
bin/parcat minix copy minix bin/parcat parcat
bin/parcat minix cat: stdout: no space left on device
bin/stdout qnx copy qnx bin/stdout stdout
bin/stdout pidora copy pidora bin/stdout stdout
bin/stdout tru64 copy tru64 bin/stdout stdout