Passes testsuite.

This commit is contained in:
Ole Tange 2014-08-22 23:30:39 +02:00
parent 50f2efb31b
commit 6df2491b81
23 changed files with 412 additions and 277 deletions

View file

@ -207,6 +207,7 @@ INSTALL_SCRIPT = @INSTALL_SCRIPT@
INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
LIBOBJS = @LIBOBJS@ LIBOBJS = @LIBOBJS@
LIBS = @LIBS@ LIBS = @LIBS@
LN_S = @LN_S@
LTLIBOBJS = @LTLIBOBJS@ LTLIBOBJS = @LTLIBOBJS@
MAKEINFO = @MAKEINFO@ MAKEINFO = @MAKEINFO@
MKDIR_P = @MKDIR_P@ MKDIR_P = @MKDIR_P@

11
configure vendored
View file

@ -586,6 +586,7 @@ PACKAGE_URL=''
ac_subst_vars='LTLIBOBJS ac_subst_vars='LTLIBOBJS
LIBOBJS LIBOBJS
LN_S
DOCUMENTATION_FALSE DOCUMENTATION_FALSE
DOCUMENTATION_TRUE DOCUMENTATION_TRUE
AM_BACKSLASH AM_BACKSLASH
@ -2336,6 +2337,16 @@ else
DOCUMENTATION_FALSE= DOCUMENTATION_FALSE=
fi fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether ln -s works" >&5
$as_echo_n "checking whether ln -s works... " >&6; }
LN_S=$as_ln_s
if test "$LN_S" = "ln -s"; then
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
$as_echo "yes" >&6; }
else
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: no, using $LN_S" >&5
$as_echo "no, using $LN_S" >&6; }
fi
cat >confcache <<\_ACEOF cat >confcache <<\_ACEOF
# This file is a shell script that caches the results of configure # This file is a shell script that caches the results of configure

View file

@ -11,5 +11,5 @@ AC_ARG_ENABLE(documentation,
[Omit building and installing the documentation. (default=no)]),, [Omit building and installing the documentation. (default=no)]),,
[enable_documentation=yes]) [enable_documentation=yes])
AM_CONDITIONAL([DOCUMENTATION], [test x$enable_documentation = xyes]) AM_CONDITIONAL([DOCUMENTATION], [test x$enable_documentation = xyes])
AC_PROG_LN_S
AC_OUTPUT AC_OUTPUT

View file

@ -127,7 +127,7 @@ pushd /tmp
rm -rf parallel-${YYYYMMDD}* rm -rf parallel-${YYYYMMDD}*
# This can take 7 minutes # This can take 7 minutes
while ! wget http://ftp.gnu.org/gnu/parallel/parallel-$YYYYMMDD.tar.bz2 ; do sleep 2; done while ! wget http://ftp.gnu.org/gnu/parallel/parallel-$YYYYMMDD.tar.bz2 ; do sleep 2; done
#wget http://alpha.gnu.org/gnu/parallel/parallel-$YYYYMMDD.tar.bz2 #while ! wget http://alpha.gnu.org/gnu/parallel/parallel-$YYYYMMDD.tar.bz2 ; do sleep 2; done
tar xjvf parallel-$YYYYMMDD.tar.bz2 tar xjvf parallel-$YYYYMMDD.tar.bz2
cd parallel-$YYYYMMDD cd parallel-$YYYYMMDD
./configure ./configure
@ -217,9 +217,9 @@ cc:Tim Cuthbertson <tim3d.junk@gmail.com>,
Ryoichiro Suzuki <ryoichiro.suzuki@gmail.com>, Ryoichiro Suzuki <ryoichiro.suzuki@gmail.com>,
Jesse Alama <jesse.alama@gmail.com> Jesse Alama <jesse.alama@gmail.com>
Subject: GNU Parallel 20140822 ('Argentina/Gaza/Williams') released Subject: GNU Parallel 20140822 ('Williams') released
GNU Parallel 20140822 ('Argentina/Gaza') has been released. It is available for download at: http://ftp.gnu.org/gnu/parallel/ GNU Parallel 20140822 ('Williams') has been released. It is available for download at: http://ftp.gnu.org/gnu/parallel/
Haiku of the month: Haiku of the month:
@ -232,14 +232,18 @@ New in this release:
* GNU Parallel now uses the same shell it was started from as the command shell for local jobs. So if GNU Parallel is started from tcsh it will use tcsh as its shell even if the login $SHELL is different. For remote jobs the login $SHELL will be used. * GNU Parallel now uses the same shell it was started from as the command shell for local jobs. So if GNU Parallel is started from tcsh it will use tcsh as its shell even if the login $SHELL is different. For remote jobs the login $SHELL will be used.
* The whole current environment in bash can be copied by using a shell wrapper function (env_parallel). * The whole current environment in bash can be copied by using a shell wrapper function (Search manual for env_parallel).
* GNU Parallel was cited in: A Web Service for Scholarly Big Data Information Extraction http://patshih.ist.psu.edu/publications/Williams-CiteSeerExtractor-ICWS14.pdf * GNU Parallel was cited in: A Web Service for Scholarly Big Data Information Extraction http://patshih.ist.psu.edu/publications/Williams-CiteSeerExtractor-ICWS14.pdf
* --plus adds the replacement strings {+/} {+.} {+..} {+...} {..} {...} {/..} {/...}. The idea being that '+foo' matches the opposite of 'foo' and {} = {+/}/{/} = {.}.{+.} = {+/}/{/.}.{+.} = {..}.{+..} = {+/}/{/..}.{+..} = {...}.{+...} = {+/}/{/...}.{+...} * --plus adds the replacement strings {+/} {+.} {+..} {+...} {..} {...} {/..} {/...}. The idea being that '+foo' matches the opposite of 'foo' and {} = {+/}/{/} = {.}.{+.} = {+/}/{/.}.{+.} = {..}.{+..} = {+/}/{/..}.{+..} = {...}.{+...} = {+/}/{/...}.{+...}
* Comparison of the speed of different GNU Parallel versions: http://lists.gnu.org/archive/html/parallel/2014-08/msg00030.html
* GNU Parallel was covered in the webcast 2014-08-20: Data Science at the Command Line http://www.oreilly.com/pub/e/3115 * GNU Parallel was covered in the webcast 2014-08-20: Data Science at the Command Line http://www.oreilly.com/pub/e/3115
* Distributed processing with GNU parallel http://kazjote.eu/2014/08/11/distributed-processing-with-gnu-parallel
* A Peek into GNU Parallel http://blog.dataweave.in/post/94238943763/a-peek-into-gnu-parallel * A Peek into GNU Parallel http://blog.dataweave.in/post/94238943763/a-peek-into-gnu-parallel
* Сборка GNU parallel для CentOS/RHEL http://www.stableit.ru/2014/07/gnu-parallel-centosrhel.html * Сборка GNU parallel для CentOS/RHEL http://www.stableit.ru/2014/07/gnu-parallel-centosrhel.html

View file

@ -1,4 +1,8 @@
bin_SCRIPTS = parallel sem sql niceload bin_SCRIPTS = parallel sql niceload
install-exec-hook:
rm $(DESTDIR)$(bindir)/sem || true
$(LN_S) $(DESTDIR)$(bindir)/parallel $(DESTDIR)$(bindir)/sem
if DOCUMENTATION if DOCUMENTATION
man_MANS = parallel.1 sem.1 sql.1 niceload.1 parallel_tutorial.1 man_MANS = parallel.1 sem.1 sql.1 niceload.1 parallel_tutorial.1

View file

@ -161,6 +161,7 @@ INSTALL_SCRIPT = @INSTALL_SCRIPT@
INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
LIBOBJS = @LIBOBJS@ LIBOBJS = @LIBOBJS@
LIBS = @LIBS@ LIBS = @LIBS@
LN_S = @LN_S@
LTLIBOBJS = @LTLIBOBJS@ LTLIBOBJS = @LTLIBOBJS@
MAKEINFO = @MAKEINFO@ MAKEINFO = @MAKEINFO@
MKDIR_P = @MKDIR_P@ MKDIR_P = @MKDIR_P@
@ -215,7 +216,7 @@ target_alias = @target_alias@
top_build_prefix = @top_build_prefix@ top_build_prefix = @top_build_prefix@
top_builddir = @top_builddir@ top_builddir = @top_builddir@
top_srcdir = @top_srcdir@ top_srcdir = @top_srcdir@
bin_SCRIPTS = parallel sem sql niceload bin_SCRIPTS = parallel sql niceload
@DOCUMENTATION_TRUE@man_MANS = parallel.1 sem.1 sql.1 niceload.1 parallel_tutorial.1 @DOCUMENTATION_TRUE@man_MANS = parallel.1 sem.1 sql.1 niceload.1 parallel_tutorial.1
@DOCUMENTATION_TRUE@doc_DATA = parallel.html sem.html sql.html niceload.html parallel_tutorial.html parallel.texi sem.texi sql.texi niceload.texi parallel_tutorial.texi parallel.pdf sem.pdf sql.pdf niceload.pdf parallel_tutorial.pdf @DOCUMENTATION_TRUE@doc_DATA = parallel.html sem.html sql.html niceload.html parallel_tutorial.html parallel.texi sem.texi sql.texi niceload.texi parallel_tutorial.texi parallel.pdf sem.pdf sql.pdf niceload.pdf parallel_tutorial.pdf
DISTCLEANFILES = parallel.1 sem.1 sql.1 niceload.1 parallel_tutorial.1 \ DISTCLEANFILES = parallel.1 sem.1 sql.1 niceload.1 parallel_tutorial.1 \
@ -464,7 +465,8 @@ install-dvi: install-dvi-am
install-dvi-am: install-dvi-am:
install-exec-am: install-binSCRIPTS install-exec-am: install-binSCRIPTS
@$(NORMAL_INSTALL)
$(MAKE) $(AM_MAKEFLAGS) install-exec-hook
install-html: install-html-am install-html: install-html-am
install-html-am: install-html-am:
@ -505,15 +507,15 @@ uninstall-am: uninstall-binSCRIPTS uninstall-docDATA uninstall-man
uninstall-man: uninstall-man1 uninstall-man: uninstall-man1
.MAKE: install-am install-strip .MAKE: install-am install-exec-am install-strip
.PHONY: all all-am check check-am clean clean-generic cscopelist-am \ .PHONY: all all-am check check-am clean clean-generic cscopelist-am \
ctags-am distclean distclean-generic distdir dvi dvi-am html \ ctags-am distclean distclean-generic distdir dvi dvi-am html \
html-am info info-am install install-am install-binSCRIPTS \ html-am info info-am install install-am install-binSCRIPTS \
install-data install-data-am install-docDATA install-dvi \ install-data install-data-am install-docDATA install-dvi \
install-dvi-am install-exec install-exec-am install-html \ install-dvi-am install-exec install-exec-am install-exec-hook \
install-html-am install-info install-info-am install-man \ install-html install-html-am install-info install-info-am \
install-man1 install-pdf install-pdf-am install-ps \ install-man install-man1 install-pdf install-pdf-am install-ps \
install-ps-am install-strip installcheck installcheck-am \ install-ps-am install-strip installcheck installcheck-am \
installdirs maintainer-clean maintainer-clean-generic \ installdirs maintainer-clean maintainer-clean-generic \
mostlyclean mostlyclean-generic pdf pdf-am ps ps-am tags-am \ mostlyclean mostlyclean-generic pdf pdf-am ps ps-am tags-am \
@ -521,6 +523,10 @@ uninstall-man: uninstall-man1
uninstall-man uninstall-man1 uninstall-man uninstall-man1
install-exec-hook:
rm $(DESTDIR)$(bindir)/sem || true
$(LN_S) $(DESTDIR)$(bindir)/parallel $(DESTDIR)$(bindir)/sem
# Build documentation file if the tool to build exists. # Build documentation file if the tool to build exists.
# Otherwise: Use the distributed version # Otherwise: Use the distributed version
parallel.1: parallel.pod parallel.1: parallel.pod

View file

@ -65,6 +65,7 @@ if($opt::pipepart) {
@fhlist = (*STDIN); @fhlist = (*STDIN);
} }
} }
if($opt::skip_first_line) { if($opt::skip_first_line) {
# Skip the first line for the first file handle # Skip the first line for the first file handle
my $fh = $fhlist[0]; my $fh = $fhlist[0];
@ -1605,6 +1606,10 @@ sub init_run_jobs {
if(@opt::basefile) { setup_basefile(); } if(@opt::basefile) { setup_basefile(); }
} }
{
my $last_time;
my %last_mtime;
sub start_more_jobs { sub start_more_jobs {
# Run start_another_job() but only if: # Run start_another_job() but only if:
# * not $Global::start_no_new_jobs set # * not $Global::start_no_new_jobs set
@ -1619,6 +1624,9 @@ sub start_more_jobs {
if($Global::start_no_new_jobs) { if($Global::start_no_new_jobs) {
return $jobs_started; return $jobs_started;
} }
if(time - ($last_time||0) > 1) {
# At most do this every second
$last_time = time;
if($Global::max_procs_file) { if($Global::max_procs_file) {
# --jobs filename # --jobs filename
my $mtime = (stat($Global::max_procs_file))[9]; my $mtime = (stat($Global::max_procs_file))[9];
@ -1630,6 +1638,32 @@ sub start_more_jobs {
} }
} }
} }
if(@opt::sshloginfile) {
# Is --sshloginfile changed?
for my $slf (@opt::sshloginfile) {
my $actual_file = expand_slf_shorthand($slf);
my $mtime = (stat($actual_file))[9];
$last_mtime{$actual_file} ||= $mtime;
if($mtime - $last_mtime{$actual_file} > 1) {
::debug("run","--sshloginfile $actual_file changed. reload\n");
$last_mtime{$actual_file} = $mtime;
# TODO reload $slf
my %sshlogin_before = %Global::host;
read_sshloginfile($actual_file);
parse_sshlogin();
$opt::filter_hosts and filter_hosts();
setup_basefile();
my @added = grep { not $sshlogin_before{$_} } keys %Global::host;
# my @removed = grep { not $sshlogin_before{$_} } keys sshlogin_before %Global::host;
#wrong my @back = grep { $Global::host{$_}->jobslots() == 0 }
keys %Global::host;
# map { $Global::host{$_}->reset_jobslots() } @back;
}
}
}
}
do { do {
$jobs_started_this_round = 0; $jobs_started_this_round = 0;
# This will start 1 job on each --sshlogin (if possible) # This will start 1 job on each --sshlogin (if possible)
@ -1679,6 +1713,7 @@ sub start_more_jobs {
return $jobs_started; return $jobs_started;
} }
}
sub start_another_job { sub start_another_job {
# If there are enough filehandles # If there are enough filehandles
@ -1813,6 +1848,9 @@ sub drain_job_queue {
# * because of too little time between each ssh login. # * because of too little time between each ssh login.
start_more_jobs(); start_more_jobs();
$sleep = ::reap_usleep($sleep); $sleep = ::reap_usleep($sleep);
if($Global::max_jobs_running == 0) {
::warning("There are no job slots available. Increase --jobs.\n");
}
} }
} while ($Global::total_running > 0 } while ($Global::total_running > 0
or or
@ -2064,8 +2102,9 @@ sub get_job_with_sshlogin {
$job->failed_here()) { $job->failed_here()) {
# This command with these args failed for this sshlogin # This command with these args failed for this sshlogin
my ($no_of_failed_sshlogins,$min_failures) = $job->min_failed(); my ($no_of_failed_sshlogins,$min_failures) = $job->min_failed();
if($no_of_failed_sshlogins == keys %Global::host and # Only look at the Global::host that have > 0 jobslots
$job->failed_here() == $min_failures) { if($no_of_failed_sshlogins == grep { $_->max_jobs_running() > 0 } values %Global::host
and $job->failed_here() == $min_failures) {
# It failed the same or more times on another host: # It failed the same or more times on another host:
# run it on this host # run it on this host
} else { } else {
@ -2090,34 +2129,46 @@ sub __REMOTE_SSH__ {}
sub read_sshloginfiles { sub read_sshloginfiles {
# Returns: N/A # Returns: N/A
for my $s (@_) { for my $s (@_) {
read_sshloginfile($s); read_sshloginfile(expand_slf_shorthand($s));
} }
} }
sub expand_slf_shorthand {
my $file = shift;
if($file eq "-") {
# skip: It is stdin
} elsif($file eq "..") {
$file = $ENV{'HOME'}."/.parallel/sshloginfile";
} elsif($file eq ".") {
$file = "/etc/parallel/sshloginfile";
} elsif(not -r $file) {
if(not -r $ENV{'HOME'}."/.parallel/".$file) {
# Try prepending ~/.parallel
::error("Cannot open $file.\n");
::wait_and_exit(255);
} else {
$file = $ENV{'HOME'}."/.parallel/".$file;
}
}
return $file;
}
sub read_sshloginfile { sub read_sshloginfile {
# Returns: N/A # Returns: N/A
my $file = shift; my $file = shift;
my $close = 1; my $close = 1;
my $in_fh; my $in_fh;
if($file eq "..") { ::debug("init","--slf ",$file);
$file = $ENV{'HOME'}."/.parallel/sshloginfile";
}
if($file eq ".") {
$file = "/etc/parallel/sshloginfile";
}
if($file eq "-") { if($file eq "-") {
$in_fh = *STDIN; $in_fh = *STDIN;
$close = 0; $close = 0;
} else { } else {
if(not open($in_fh, "<", $file)) { if(not open($in_fh, "<", $file)) {
# Try the filename # Try the filename
if(not open($in_fh, "<", $ENV{'HOME'}."/.parallel/".$file)) {
# Try prepending ~/.parallel
::error("Cannot open $file.\n"); ::error("Cannot open $file.\n");
::wait_and_exit(255); ::wait_and_exit(255);
} }
} }
}
while(<$in_fh>) { while(<$in_fh>) {
chomp; chomp;
/^\s*#/ and next; /^\s*#/ and next;
@ -2137,7 +2188,7 @@ sub parse_sshlogin {
# Split up -S sshlogin,sshlogin # Split up -S sshlogin,sshlogin
for my $s (split /,/, $sshlogin) { for my $s (split /,/, $sshlogin) {
if ($s eq ".." or $s eq "-") { if ($s eq ".." or $s eq "-") {
read_sshloginfile($s); read_sshloginfile(expand_slf_shorthand($s));
} else { } else {
push (@login, $s); push (@login, $s);
} }
@ -2145,19 +2196,21 @@ sub parse_sshlogin {
} }
$Global::minimal_command_line_length = 8_000_000; $Global::minimal_command_line_length = 8_000_000;
for my $sshlogin_string (@login) { for my $sshlogin_string (@login) {
if($Global::host{$sshlogin_string}) {
# This sshlogin has already been added: next
next;
}
my $sshlogin = SSHLogin->new($sshlogin_string); my $sshlogin = SSHLogin->new($sshlogin_string);
if($sshlogin_string eq ":") { if($sshlogin_string eq ":") {
$sshlogin->set_maxlength(Limits::Command::max_length()); $sshlogin->set_maxlength(Limits::Command::max_length());
} else { } else {
# If all chars needs to be quoted, every other character will be \ # If all chars needs to be quoted, every other character will be \
$sshlogin->set_maxlength(Limits::Command::max_length()/2); $sshlogin->set_maxlength(int(Limits::Command::max_length()/2));
} }
$Global::minimal_command_line_length = $Global::minimal_command_line_length =
::min($Global::minimal_command_line_length, $sshlogin->maxlength()); ::min($Global::minimal_command_line_length, $sshlogin->maxlength());
$Global::host{$sshlogin->string()} = $sshlogin; $Global::host{$sshlogin->string()} = $sshlogin;
} }
# debug("start", "sshlogin: ", my_dump(%Global::host),"\n"); # debug("start", "sshlogin: ", my_dump(%Global::host),"\n");
if($opt::transfer or @opt::return or $opt::cleanup or @opt::basefile) { if($opt::transfer or @opt::return or $opt::cleanup or @opt::basefile) {
if(not remote_hosts()) { if(not remote_hosts()) {
@ -3145,6 +3198,7 @@ sub new {
'jobs_completed' => 0, 'jobs_completed' => 0,
'maxlength' => undef, 'maxlength' => undef,
'max_jobs_running' => undef, 'max_jobs_running' => undef,
'orig_max_jobs_running' => undef,
'ncpus' => $ncpus, 'ncpus' => $ncpus,
'sshcommand' => undef, 'sshcommand' => undef,
'serverlogin' => undef, 'serverlogin' => undef,
@ -3159,6 +3213,8 @@ sub new {
'swap_activity_file' => $ENV{'HOME'} . "/.parallel/tmp/swap_activity-" . 'swap_activity_file' => $ENV{'HOME'} . "/.parallel/tmp/swap_activity-" .
$no_slash_string, $no_slash_string,
'swap_activity' => undef, 'swap_activity' => undef,
# What time was this object created?
'added' => time,
}, ref($class) || $class; }, ref($class) || $class;
} }
@ -3190,11 +3246,6 @@ sub dec_jobs_running {
$self->{'jobs_running'}--; $self->{'jobs_running'}--;
} }
#sub set_jobs_running {
# my $self = shift;
# $self->{'jobs_running'} = shift;
#}
sub set_maxlength { sub set_maxlength {
my $self = shift; my $self = shift;
$self->{'maxlength'} = shift; $self->{'maxlength'} = shift;
@ -3225,6 +3276,8 @@ sub set_max_jobs_running {
# max_jobs_running could be resat if -j is a changed file # max_jobs_running could be resat if -j is a changed file
$Global::max_jobs_running += $self->{'max_jobs_running'}; $Global::max_jobs_running += $self->{'max_jobs_running'};
} }
# Initialize orig to the first value that comes around
$self->{'orig_max_jobs_running'} ||= $self->{'max_jobs_running'};
} }
sub swapping { sub swapping {
@ -3754,7 +3807,8 @@ sub processes_available_by_system_limit {
} }
if(not $more_filehandles) { if(not $more_filehandles) {
::warning("Only enough file handles to run ", $system_limit, " jobs in parallel.\n", ::warning("Only enough file handles to run ", $system_limit, " jobs in parallel.\n",
"Raising ulimit -n or /etc/security/limits.conf may help.\n"); "Running 'parallel -j0 -N", $system_limit, " --pipe parallel -j0' or ",
"raising ulimit -n or /etc/security/limits.conf may help.\n");
} }
if($max_system_proc_reached) { if($max_system_proc_reached) {
::warning("Only enough available processes to run ", $system_limit, ::warning("Only enough available processes to run ", $system_limit,
@ -4255,7 +4309,7 @@ sub no_of_cores_hpux {
# Number of CPU cores on HP-UX # Number of CPU cores on HP-UX
# undef if not HP-UX # undef if not HP-UX
my $no_of_cores = my $no_of_cores =
(`/usr/bin/mpsched -s 2>&1 | grep 'Processor Count' | awk '{ print \$4 }'`); (`/usr/bin/mpsched -s 2>&1 | grep 'Processor Count' | awk '{ print \$3 }'`);
return $no_of_cores; return $no_of_cores;
} }
@ -5093,8 +5147,7 @@ sub min_failed {
# the minimal number of times this command has failed # the minimal number of times this command has failed
my $self = shift; my $self = shift;
my $min_failures = my $min_failures =
::min(map { $self->{'failed'}{$_} } ::min(map { $self->{'failed'}{$_} } keys %{$self->{'failed'}});
keys %{$self->{'failed'}});
my $number_of_sshlogins_failed_on = scalar keys %{$self->{'failed'}}; my $number_of_sshlogins_failed_on = scalar keys %{$self->{'failed'}};
return ($number_of_sshlogins_failed_on,$min_failures); return ($number_of_sshlogins_failed_on,$min_failures);
} }
@ -5466,9 +5519,6 @@ sub start {
# Exit value: # Exit value:
# empty input = true # empty input = true
# some input = exit val from command # some input = exit val from command
# Bug:
# If the command does not read the first char, the temp file
# is not deleted.
my ($dummy_fh, $tmpfile) = ::tmpfile(SUFFIX => ".chr"); my ($dummy_fh, $tmpfile) = ::tmpfile(SUFFIX => ".chr");
$command = qq{ $command = qq{
sh -c 'dd bs=1 count=1 of=$tmpfile 2>/dev/null'; sh -c 'dd bs=1 count=1 of=$tmpfile 2>/dev/null';
@ -5491,10 +5541,10 @@ sub start {
# Give STDIN to the first job if using -a (but only if running # Give STDIN to the first job if using -a (but only if running
# locally - otherwise CTRL-C does not work for other jobs Bug#36585) # locally - otherwise CTRL-C does not work for other jobs Bug#36585)
*IN = *STDIN; *IN = *STDIN;
# The eval is needed to catch exception from open3
if($opt::tmux) { if($opt::tmux) {
$command = $job->tmux_wrap($command); $command = $job->tmux_wrap($command);
} }
# The eval is needed to catch exception from open3
eval { eval {
$pid = ::open3("<&IN", ">&OUT", ">&ERR", $Global::shell, "-c", $command) || $pid = ::open3("<&IN", ">&OUT", ">&ERR", $Global::shell, "-c", $command) ||
::die_bug("open3-a"); ::die_bug("open3-a");
@ -5507,10 +5557,10 @@ sub start {
open(my $devtty_fh, "<", "/dev/tty")) { open(my $devtty_fh, "<", "/dev/tty")) {
# Give /dev/tty to the command if no one else is using it # Give /dev/tty to the command if no one else is using it
*IN = $devtty_fh; *IN = $devtty_fh;
# The eval is needed to catch exception from open3
if($opt::tmux) { if($opt::tmux) {
$command = $job->tmux_wrap($command); $command = $job->tmux_wrap($command);
} }
# The eval is needed to catch exception from open3
eval { eval {
$pid = ::open3("<&IN", ">&OUT", ">&ERR", $Global::shell, "-c", $command) || $pid = ::open3("<&IN", ">&OUT", ">&ERR", $Global::shell, "-c", $command) ||
::die_bug("open3-/dev/tty"); ::die_bug("open3-/dev/tty");
@ -5522,6 +5572,7 @@ sub start {
if($opt::tmux) { if($opt::tmux) {
$command = $job->tmux_wrap($command); $command = $job->tmux_wrap($command);
} }
# The eval is needed to catch exception from open3
eval { eval {
$pid = ::open3(::gensym, ">&OUT", ">&ERR", $Global::shell, "-c", $command) || $pid = ::open3(::gensym, ">&OUT", ">&ERR", $Global::shell, "-c", $command) ||
::die_bug("open3-gensym"); ::die_bug("open3-gensym");
@ -5964,8 +6015,7 @@ sub populate {
# Returns: N/A # Returns: N/A
my $self = shift; my $self = shift;
my $next_arg; my $next_arg;
# my $max_len = $Global::minimal_command_line_length || Limits::Command::max_length(); my $max_len = $Global::minimal_command_line_length || Limits::Command::max_length();
my $max_len = Limits::Command::max_length();
if($opt::cat or $opt::fifo) { if($opt::cat or $opt::fifo) {
# Get a tempfile name # Get a tempfile name
@ -7123,7 +7173,6 @@ sub replace {
$perlexpr =~ s/^-?\d+ //; # Positional replace treated as normal replace $perlexpr =~ s/^-?\d+ //; # Positional replace treated as normal replace
if(not defined $self->{"rpl",0,$perlexpr}) { if(not defined $self->{"rpl",0,$perlexpr}) {
local $_; local $_;
# TODO disable warnings
if($Global::trim eq "n") { if($Global::trim eq "n") {
$_ = $self->{'orig'}; $_ = $self->{'orig'};
} else { } else {
@ -7321,18 +7370,18 @@ sub acquire {
my $start_time = time; my $start_time = time;
while(1) { while(1) {
$self->atomic_link_if_count_less_than() and last; $self->atomic_link_if_count_less_than() and last;
::debug("run", "Remove dead locks"); ::debug("sem", "Remove dead locks");
my $lockdir = $self->{'lockdir'}; my $lockdir = $self->{'lockdir'};
for my $d (glob "$lockdir/*") { for my $d (glob "$lockdir/*") {
::debug("run", "Lock $d $lockdir\n"); ::debug("sem", "Lock $d $lockdir\n");
$d =~ m:$lockdir/([0-9]+)\@([-\._a-z0-9]+)$:o or next; $d =~ m:$lockdir/([0-9]+)\@([-\._a-z0-9]+)$:o or next;
my ($pid, $host) = ($1, $2); my ($pid, $host) = ($1, $2);
if($host eq ::hostname()) { if($host eq ::hostname()) {
if(not kill 0, $1) { if(not kill 0, $1) {
::debug("run", "Dead: $d"); ::debug("sem", "Dead: $d");
unlink $d; unlink $d;
} else { } else {
::debug("run", "Alive: $d"); ::debug("sem", "Alive: $d");
} }
} }
} }
@ -7354,7 +7403,7 @@ sub acquire {
last; last;
} }
} }
::debug("run", "acquired $self->{'pid'}\n"); ::debug("sem", "acquired $self->{'pid'}\n");
} }
sub release { sub release {
@ -7372,6 +7421,27 @@ sub release {
::debug("run", "released $self->{'pid'}\n"); ::debug("run", "released $self->{'pid'}\n");
} }
sub _release {
my $self = shift;
unlink $self->{'pidfile'};
$self->lock();
my $nlinks = $self->nlinks();
::debug("sem", $nlinks, "<", $self->{'count'});
if($nlinks-- > 1) {
unlink $self->{'idfile'};
open (my $fh, ">", $self->{'idfile'}) or
::die_bug("write_idfile: $self->{'idfile'}");
print $fh "#"x$nlinks;
close $fh;
} else {
unlink $self->{'idfile'};
rmdir $self->{'lockdir'};
}
$self->unlock();
::debug("sem", "released $self->{'pid'}\n");
}
sub atomic_link_if_count_less_than { sub atomic_link_if_count_less_than {
# Link $file1 to $file2 if nlinks to $file1 < $count # Link $file1 to $file2 if nlinks to $file1 < $count
my $self = shift; my $self = shift;
@ -7392,10 +7462,35 @@ sub atomic_link_if_count_less_than {
return $retval; return $retval;
} }
sub _atomic_link_if_count_less_than {
# Link $file1 to $file2 if nlinks to $file1 < $count
my $self = shift;
my $retval = 0;
$self->lock();
my $nlinks = $self->nlinks();
::debug("sem", $nlinks, "<", $self->{'count'});
if($nlinks++ < $self->{'count'}) {
-d $self->{'lockdir'} or mkdir_or_die($self->{'lockdir'});
if(not -e $self->{'idfile'}) {
open (my $fh, ">", $self->{'idfile'}) or
::die_bug("write_idfile: $self->{'idfile'}");
close $fh;
}
open (my $fh, ">", $self->{'idfile'}) or
::die_bug("write_idfile: $self->{'idfile'}");
print $fh "#"x$nlinks;
close $fh;
$retval = link $self->{'idfile'}, $self->{'pidfile'};
}
$self->unlock();
::debug("sem", "atomic $retval");
return $retval;
}
sub nlinks { sub nlinks {
my $self = shift; my $self = shift;
if(-e $self->{'idfile'}) { if(-e $self->{'idfile'}) {
::debug("run", "nlinks", (stat(_))[3], "\n"); ::debug("sem", "nlinks", (stat(_))[3], "size", (stat(_))[7], "\n");
return (stat(_))[3]; return (stat(_))[3];
} else { } else {
return 0; return 0;
@ -7481,4 +7576,3 @@ sub mkdir_or_die {
# Keep perl -w happy # Keep perl -w happy
$opt::x = $Semaphore::timeout = $Semaphore::wait = $Global::no_more_file_handles_warned = $opt::x = $Semaphore::timeout = $Semaphore::wait = $Global::no_more_file_handles_warned =
$Job::file_descriptor_warning_printed = $Global::max_slot_number = 0; $Job::file_descriptor_warning_printed = $Global::max_slot_number = 0;

View file

@ -133,7 +133,7 @@
.\" ======================================================================== .\" ========================================================================
.\" .\"
.IX Title "PARALLEL_TUTORIAL 1" .IX Title "PARALLEL_TUTORIAL 1"
.TH PARALLEL_TUTORIAL 1 "2014-07-26" "20140722" "parallel" .TH PARALLEL_TUTORIAL 1 "2014-07-26" "20140815" "parallel"
.\" For nroff, turn off justification. Always turn off hyphenation; it makes .\" For nroff, turn off justification. Always turn off hyphenation; it makes
.\" way too many mistakes in technical documents. .\" way too many mistakes in technical documents.
.if n .ad l .if n .ad l

View file

@ -2,7 +2,7 @@
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml"> <html xmlns="http://www.w3.org/1999/xhtml">
<head> <head>
<title></title> <title>GNU Parallel tutorial</title>
<meta http-equiv="content-type" content="text/html; charset=utf-8" /> <meta http-equiv="content-type" content="text/html; charset=utf-8" />
<link rev="made" href="mailto:root@localhost" /> <link rev="made" href="mailto:root@localhost" />
</head> </head>

View file

@ -1,20 +1,19 @@
#!/bin/bash #!/bin/bash
highload () forceload () {
{ # Force load
# Force load > #cpus LOAD=$1
CPUS=$(parallel --number-of-cores) # Start 10 times as many burnP6
seq 0 0.1 $CPUS | parallel -j0 timeout 50 burnP6 2>/dev/null & seq 0 0.1 $1 | parallel -j0 timeout 20 burnP6 2>/dev/null &
PID=$! PID=$!
sleep 20 # Give GNU Parallel 1 second to startup
perl -e 'do{$a=`uptime`} while($a=~/average: *(\S+)/ and $1 < '$CPUS')' sleep 1
perl -e 'do{$a=`uptime`} while($a=~/average: *(\S+)/ and $1 < '$LOAD')'
# Load is now > $CPUS # Load is now > $CPUS
# Kill off burnP6 and the parent parallel
# kill $PID; sleep 0.1; kill $PID; killall burnP6; sleep 0.3; kill -9 $PID 2>/dev/null
} }
highload 2>/dev/null & # Force load avg > number of cpu cores
sleep 1 forceload $(parallel --number-of-cores)
cat <<'EOF' | parallel -vj0 -k -L1 cat <<'EOF' | parallel -vj0 -k -L1
echo "bug #38441: CPU usage goes to 100% if load is higher than --load at first job" echo "bug #38441: CPU usage goes to 100% if load is higher than --load at first job"
@ -26,14 +25,17 @@ echo "bug #38441: CPU usage goes to 100% if load is higher than --load at first
echo '### Test slow arguments generation - https://savannah.gnu.org/bugs/?32834' echo '### Test slow arguments generation - https://savannah.gnu.org/bugs/?32834'
seq 1 3 | parallel -j1 "sleep 2; echo {}" | parallel -kj2 echo seq 1 3 | parallel -j1 "sleep 2; echo {}" | parallel -kj2 echo
echo '### Test too slow spawning'
# Let the commands below run during high load
seq `parallel --number-of-cores` | parallel -j200% -N0 timeout -k 25 26 burnP6 &
sleep 1;
seq 1 1000 | stdout nice nice parallel -s 100 -uj0 true |
perl -pe '/parallel: Warning: Starting \d+ processes took/ and do {close STDIN; `killall -9 burnP6`; print "OK\n"; exit }'
EOF EOF
# Make sure we got all the burnP6 killed # Make sure we got all the burnP6 killed
killall -9 burnP6 2>/dev/null killall -9 burnP6 2>/dev/null
echo '### Test too slow spawning'
# Let the commands below run during high load
seq 1000 | timeout 20 parallel -j400% -N0 burnP6 2>/dev/null &
PID=$!
seq 1 1000 | stdout nice nice parallel --halt 1 -uj0 -N0 kill $PID |
perl -pe '/parallel: Warning: Starting \d+ processes took/ and do {close STDIN; `kill '$PID';killall -9 burnP6`; print "OK\n"; exit }';
# Make sure we got all the burnP6 killed
killall -9 burnP6 2>/dev/null

View file

@ -3,18 +3,21 @@
rm -rf tmp 2>/dev/null rm -rf tmp 2>/dev/null
cp -a input-files/testdir2 tmp cp -a input-files/testdir2 tmp
NICEPAR="nice nice parallel"
export NICEPAR
cat <<'EOF' | sed -e 's/;$/; /;s/$SERVER1/'$SERVER1'/;s/$SERVER2/'$SERVER2'/' | stdout parallel -vj0 -k -L1 cat <<'EOF' | sed -e 's/;$/; /;s/$SERVER1/'$SERVER1'/;s/$SERVER2/'$SERVER2'/' | stdout parallel -vj0 -k -L1
echo '### bug #42329: --line-buffer gives wrong output'; echo '### bug #42329: --line-buffer gives wrong output';
parallel --line-buffer --tag seq ::: 10000000 | wc -c; $NICEPAR --line-buffer --tag seq ::: 10000000 | wc -c;
parallel --line-buffer seq ::: 10000000 | wc -c $NICEPAR --line-buffer seq ::: 10000000 | wc -c
echo '### Test \0 as recend'; echo '### Test \0 as recend';
printf "a\0b\0c\0" | parallel --recend '\0' -k -N1 --pipe cat -v \; echo; printf "a\0b\0c\0" | $NICEPAR --recend '\0' -k -N1 --pipe cat -v \; echo;
printf "\0a\0b\0c" | parallel --recstart '\0' -k -N1 --pipe cat -v \; echo printf "\0a\0b\0c" | $NICEPAR --recstart '\0' -k -N1 --pipe cat -v \; echo
echo '### Test filenames containing UTF-8'; echo '### Test filenames containing UTF-8';
cd tmp; cd tmp;
find . -name '*.jpg' | nice nice parallel -j +0 convert -geometry 120 {} {//}/thumb_{/}; find . -name '*.jpg' | $NICEPAR -j +0 convert -geometry 120 {} {//}/thumb_{/};
find |grep -v CVS | sort; find |grep -v CVS | sort;
echo '### bug #39554: Feature request: line buffered output'; echo '### bug #39554: Feature request: line buffered output';
@ -26,35 +29,35 @@ echo '### bug #39554: Feature request: line buffered output --tag';
echo echo
echo '### test round-robin'; echo '### test round-robin';
nice seq 1000 | parallel --block 1k --pipe --round-robin wc | sort nice seq 1000 | $NICEPAR --block 1k --pipe --round-robin wc | sort
echo '### --version must have higher priority than retired options' echo '### --version must have higher priority than retired options'
parallel --version -g -Y -U -W -T | tail $NICEPAR --version -g -Y -U -W -T | tail
echo '### bug #39787: --xargs broken' echo '### bug #39787: --xargs broken'
nice perl -e 'for(1..30000){print "$_\n"}' | nice parallel --xargs -k echo | perl -ne 'print length $_,"\n"' nice perl -e 'for(1..30000){print "$_\n"}' | $NICEPAR --xargs -k echo | perl -ne 'print length $_,"\n"'
echo '### --delay should grow by 2 sec per arg' echo '### --delay should grow by 3 sec per arg'
stdout /usr/bin/time -f %e parallel --delay 2 true ::: 1 2 | perl -ne '$_ >= 2 and $_ <= 5 and print "OK\n"' stdout /usr/bin/time -f %e parallel --delay 3 true ::: 1 2 | perl -ne '$_ >= 3 and $_ <= 8 and print "OK\n"'
stdout /usr/bin/time -f %e parallel --delay 2 true ::: 1 2 3 | perl -ne '$_ >= 4 and $_ <= 7 and print "OK\n"' stdout /usr/bin/time -f %e parallel --delay 3 true ::: 1 2 3 | perl -ne '$_ >= 6 and $_ <= 11 and print "OK\n"'
echo '### Exit value should not be affected if an earlier job times out' echo '### Exit value should not be affected if an earlier job times out'
parallel -j2 --timeout 1 --joblog - -k ::: "sleep 10" "exit 255" | field 7 $NICEPAR -j2 --timeout 1 --joblog - -k ::: "sleep 10" "exit 255" | field 7
echo '### --header regexp' echo '### --header regexp'
(echo %head1; echo %head2; seq 5) | nice parallel -kj2 --pipe -N2 --header '(%.*\n)*' echo JOB{#}\;cat (echo %head1; echo %head2; seq 5) | $NICEPAR -kj2 --pipe -N2 --header '(%.*\n)*' echo JOB{#}\;cat
echo '### --header num' echo '### --header num'
(echo %head1; echo %head2; seq 5) | nice parallel -kj2 --pipe -N2 --header 2 echo JOB{#}\;cat (echo %head1; echo %head2; seq 5) | $NICEPAR -kj2 --pipe -N2 --header 2 echo JOB{#}\;cat
echo '### --header regexp --round-robin' echo '### --header regexp --round-robin'
(echo %head1; echo %head2; seq 5) | nice parallel -kj2 --pipe -N2 --round --header '(%.*\n)*' echo JOB\;wc | sort (echo %head1; echo %head2; seq 5) | $NICEPAR -kj2 --pipe -N2 --round --header '(%.*\n)*' echo JOB\;wc | sort
echo '### --header num --round-robin' echo '### --header num --round-robin'
(echo %head1; echo %head2; seq 5) | nice parallel -kj2 --pipe -N2 --round --header 2 echo JOB{#}\;wc | sort (echo %head1; echo %head2; seq 5) | $NICEPAR -kj2 --pipe -N2 --round --header 2 echo JOB{#}\;wc | sort
echo '### shebang-wrap' echo '### shebang-wrap'
nice nice parallel -k {} {} A B C ::: ./input-files/shebang/shebangwrap.*[^~] $NICEPAR -k {} {} A B C ::: ./input-files/shebang/shebangwrap.*[^~]
EOF EOF

View file

@ -4,18 +4,20 @@ PAR="nice nice parallel -j2 --pipe --keeporder --block 150000 --tmpdir=/dev/shm"
export PAR export PAR
XAP="nice nice parallel --xapply" XAP="nice nice parallel --xapply"
export XAP export XAP
NICEPAR="nice nice parallel"
export NICEPAR
cat <<'EOF' | sed -e 's/$SERVER1/'$SERVER1'/;s/$SERVER2/'$SERVER2'/' | stdout parallel -vj0 -k -L1 cat <<'EOF' | sed -e 's/$SERVER1/'$SERVER1'/;s/$SERVER2/'$SERVER2'/' | stdout parallel -vj0 -k -L1
echo 'bug #41613: --compress --line-buffer no newline'; echo 'bug #41613: --compress --line-buffer no newline';
perl -e 'print "It worked"'| parallel --pipe --compress --line-buffer cat; echo perl -e 'print "It worked"'| $NICEPAR --pipe --compress --line-buffer cat; echo
echo 'bug #41613: --compress --line-buffer no --tagstring'; echo 'bug #41613: --compress --line-buffer no --tagstring';
diff diff
<(nice perl -e 'for("x011".."x110"){print "$_\t", ("\n", map { rand } (1..100000)) }'| <(nice perl -e 'for("x011".."x110"){print "$_\t", ("\n", map { rand } (1..100000)) }'|
parallel -N10 -L1 --pipe -j6 --block 20M --compress $NICEPAR -N10 -L1 --pipe -j6 --block 20M --compress
pv -qL 1000000 | perl -pe 's/(....).*/$1/') pv -qL 1000000 | perl -pe 's/(....).*/$1/')
<(nice perl -e 'for("x011".."x110"){print "$_\t", ("\n", map { rand } (1..100000)) }'| <(nice perl -e 'for("x011".."x110"){print "$_\t", ("\n", map { rand } (1..100000)) }'|
parallel -N10 -L1 --pipe -j6 --block 20M --compress --line-buffer $NICEPAR -N10 -L1 --pipe -j6 --block 20M --compress --line-buffer
pv -qL 1000000 | perl -pe 's/(....).*/$1/') pv -qL 1000000 | perl -pe 's/(....).*/$1/')
>/dev/null >/dev/null
|| (echo 'Good: --line-buffer matters'; false) && echo 'Bad: --line-buffer not working' || (echo 'Good: --line-buffer matters'; false) && echo 'Bad: --line-buffer not working'
@ -23,92 +25,92 @@ echo 'bug #41613: --compress --line-buffer no --tagstring';
echo 'bug #41613: --compress --line-buffer with --tagstring'; echo 'bug #41613: --compress --line-buffer with --tagstring';
diff diff
<(nice perl -e 'for("x011".."x110"){print "$_\t", ("\n", map { rand } (1..100000)) }'| <(nice perl -e 'for("x011".."x110"){print "$_\t", ("\n", map { rand } (1..100000)) }'|
parallel -N10 -L1 --pipe -j6 --block 20M --compress --tagstring {#} $NICEPAR -N10 -L1 --pipe -j6 --block 20M --compress --tagstring {#}
pv -qL 1000000 | perl -pe 's/(....).*/$1/') pv -qL 1000000 | perl -pe 's/(....).*/$1/')
<(nice perl -e 'for("x011".."x110"){print "$_\t", ("\n", map { rand } (1..100000)) }'| <(nice perl -e 'for("x011".."x110"){print "$_\t", ("\n", map { rand } (1..100000)) }'|
parallel -N10 -L1 --pipe -j6 --block 20M --compress --tagstring {#} --line-buffer $NICEPAR -N10 -L1 --pipe -j6 --block 20M --compress --tagstring {#} --line-buffer
pv -qL 1000000 | perl -pe 's/(....).*/$1/') pv -qL 1000000 | perl -pe 's/(....).*/$1/')
>/dev/null >/dev/null
|| (echo 'Good: --line-buffer matters'; false) && echo 'Bad: --line-buffer not working' || (echo 'Good: --line-buffer matters'; false) && echo 'Bad: --line-buffer not working'
echo 'bug #41613: --compress --line-buffer - no newline'; echo 'bug #41613: --compress --line-buffer - no newline';
echo 'pipe compress tagstring' echo 'pipe compress tagstring'
perl -e 'print "O"'| parallel --compress --tagstring {#} --pipe --line-buffer cat; echo "K" perl -e 'print "O"'| $NICEPAR --compress --tagstring {#} --pipe --line-buffer cat; echo "K"
echo 'pipe compress notagstring' echo 'pipe compress notagstring'
perl -e 'print "O"'| parallel --compress --pipe --line-buffer cat; echo "K" perl -e 'print "O"'| $NICEPAR --compress --pipe --line-buffer cat; echo "K"
echo 'pipe nocompress tagstring' echo 'pipe nocompress tagstring'
perl -e 'print "O"'| parallel --tagstring {#} --pipe --line-buffer cat; echo "K" perl -e 'print "O"'| $NICEPAR --tagstring {#} --pipe --line-buffer cat; echo "K"
echo 'pipe nocompress notagstring' echo 'pipe nocompress notagstring'
perl -e 'print "O"'| parallel --pipe --line-buffer cat; echo "K" perl -e 'print "O"'| $NICEPAR --pipe --line-buffer cat; echo "K"
echo 'nopipe compress tagstring' echo 'nopipe compress tagstring'
parallel --compress --tagstring {#} --line-buffer echo {} O ::: -n; echo "K" $NICEPAR --compress --tagstring {#} --line-buffer echo {} O ::: -n; echo "K"
echo 'nopipe compress notagstring' echo 'nopipe compress notagstring'
parallel --compress --line-buffer echo {} O ::: -n; echo "K" $NICEPAR --compress --line-buffer echo {} O ::: -n; echo "K"
echo 'nopipe nocompress tagstring' echo 'nopipe nocompress tagstring'
parallel --tagstring {#} --line-buffer echo {} O ::: -n; echo "K" $NICEPAR --tagstring {#} --line-buffer echo {} O ::: -n; echo "K"
echo 'nopipe nocompress notagstring' echo 'nopipe nocompress notagstring'
parallel --line-buffer echo {} O ::: -n; echo "K" $NICEPAR --line-buffer echo {} O ::: -n; echo "K"
echo 'bug #41412: --timeout + --delay causes deadlock'; echo 'bug #41412: --timeout + --delay causes deadlock';
seq 10 | parallel -j10 --timeout 1 --delay .3 echo; seq 10 | parallel -j10 --timeout 1 --delay .3 echo;
parallel -j3 --timeout 1 --delay 2 echo ::: 1 2 3; parallel -j3 --timeout 1 --delay 2 echo ::: 1 2 3;
parallel -j10 --timeout 2.2 --delay 3 "sleep {}; echo {}" ::: 1 2 4 5 6 parallel -j10 --timeout 2.2 --delay 3 "sleep {}; echo {}" ::: 1 2 7 8 9
echo '### Test --spreadstdin - more procs than args'; echo '### Test --spreadstdin - more procs than args';
rm -f /tmp/parallel.ss.*; rm -f /tmp/parallel.ss.*;
seq 1 5 | stdout parallel -j 10 --spreadstdin 'cat >/tmp/parallel.ss.$PARALLEL_SEQ' >/dev/null; seq 1 5 | stdout $NICEPAR -j 10 --spreadstdin 'cat >/tmp/parallel.ss.$PARALLEL_SEQ' >/dev/null;
cat /tmp/parallel.ss.*; cat /tmp/parallel.ss.*;
echo '### Test --spreadstdin - more args than procs'; echo '### Test --spreadstdin - more args than procs';
rm -f /tmp/parallel.ss2.*; rm -f /tmp/parallel.ss2.*;
seq 1 10 | stdout parallel -j 5 --spreadstdin 'cat >/tmp/parallel.ss2.$PARALLEL_SEQ' >/dev/null; seq 1 10 | stdout $NICEPAR -j 5 --spreadstdin 'cat >/tmp/parallel.ss2.$PARALLEL_SEQ' >/dev/null;
cat /tmp/parallel.ss2.* cat /tmp/parallel.ss2.*
nice nice seq 1 1000 | nice nice parallel -j1 --spreadstdin cat "|cat "|wc -c nice nice seq 1 1000 | $NICEPAR -j1 --spreadstdin cat "|cat "|wc -c
nice nice seq 1 10000 | nice nice parallel -j10 --spreadstdin cat "|cat "|wc -c nice nice seq 1 10000 | $NICEPAR -j10 --spreadstdin cat "|cat "|wc -c
nice nice seq 1 100000 | nice nice parallel -j1 --spreadstdin cat "|cat "|wc -c nice nice seq 1 100000 | $NICEPAR -j1 --spreadstdin cat "|cat "|wc -c
nice nice seq 1 1000000 | nice nice parallel -j10 --spreadstdin cat "|cat "|wc -c nice nice seq 1 1000000 | $NICEPAR -j10 --spreadstdin cat "|cat "|wc -c
seq 1 10 | parallel --recend "\n" -j1 --spreadstdin gzip -9 >/tmp/foo.gz seq 1 10 | $NICEPAR --recend "\n" -j1 --spreadstdin gzip -9 >/tmp/foo.gz
echo '### Test --spreadstdin - similar to the failing below'; echo '### Test --spreadstdin - similar to the failing below';
nice seq 1 100000 | nice nice parallel --recend "\n" -j10 --spreadstdin gzip -9 >/tmp/foo2.gz; nice seq 1 100000 | $NICEPAR --recend "\n" -j10 --spreadstdin gzip -9 >/tmp/foo2.gz;
diff <(nice seq 1 100000) <(zcat /tmp/foo2.gz |sort -n); diff <(nice seq 1 100000) <(zcat /tmp/foo2.gz |sort -n);
diff <(nice seq 1 100000|wc -c) <(zcat /tmp/foo2.gz |wc -c) diff <(nice seq 1 100000|wc -c) <(zcat /tmp/foo2.gz |wc -c)
echo '### Test --spreadstdin - this failed during devel'; echo '### Test --spreadstdin - this failed during devel';
nice seq 1 1000000 | md5sum; nice seq 1 1000000 | md5sum;
nice seq 1 1000000 | nice nice parallel --recend "\n" -j10 --spreadstdin gzip -9 | zcat | sort -n | md5sum nice seq 1 1000000 | $NICEPAR --recend "\n" -j10 --spreadstdin gzip -9 | zcat | sort -n | md5sum
echo '### Test --spreadstdin -k'; echo '### Test --spreadstdin -k';
nice seq 1 1000000 | nice nice parallel -k --recend "\n" -j10 --spreadstdin gzip -9 | zcat | md5sum nice seq 1 1000000 | $NICEPAR -k --recend "\n" -j10 --spreadstdin gzip -9 | zcat | md5sum
echo '### Test --spreadstdin --files'; echo '### Test --spreadstdin --files';
nice seq 1 1000000 | shuf | parallel --files --recend "\n" -j10 --spreadstdin sort -n | parallel -Xj1 sort -nm {} ";"rm {} | md5sum nice seq 1 1000000 | shuf | $NICEPAR --files --recend "\n" -j10 --spreadstdin sort -n | parallel -Xj1 sort -nm {} ";"rm {} | md5sum
echo '### Test --number-of-cpus'; echo '### Test --number-of-cpus';
stdout parallel --number-of-cpus stdout $NICEPAR --number-of-cpus
echo '### Test --number-of-cores'; echo '### Test --number-of-cores';
stdout parallel --number-of-cores stdout $NICEPAR --number-of-cores
echo '### Test --use-cpus-instead-of-cores'; echo '### Test --use-cpus-instead-of-cores';
(seq 1 4 | stdout parallel --use-cpus-instead-of-cores -j100% sleep) && echo CPUs done & (seq 1 8 | stdout parallel --use-cpus-instead-of-cores -j100% sleep) && echo CPUs done &
(seq 1 4 | stdout parallel -j100% sleep) && echo cores done & (seq 1 8 | stdout parallel -j100% sleep) && echo cores done &
echo 'Cores should complete first on machines with less than 4 physical CPUs'; echo 'Cores should complete first on machines with less than 8 physical CPUs';
wait wait
echo '### Test --tag ::: a ::: b'; echo '### Test --tag ::: a ::: b';
stdout parallel -k --tag -j1 echo stderr-{.} ">&2;" echo stdout-{} ::: a ::: b stdout $NICEPAR -k --tag -j1 echo stderr-{.} ">&2;" echo stdout-{} ::: a ::: b
echo '### Test --tag ::: a b'; echo '### Test --tag ::: a b';
stdout parallel -k --tag -j1 echo stderr-{.} ">&2;" echo stdout-{} ::: a b stdout $NICEPAR -k --tag -j1 echo stderr-{.} ">&2;" echo stdout-{} ::: a b
echo '### Test --tag -X ::: a b'; echo '### Test --tag -X ::: a b';
stdout parallel -k --tag -X -j1 echo stderr-{.} ">&2;" echo stdout-{} ::: a b stdout $NICEPAR -k --tag -X -j1 echo stderr-{.} ">&2;" echo stdout-{} ::: a b
echo '### Test bash redirection <()'; echo '### Test bash redirection <()';
parallel 'cat <(echo {}); echo b' ::: a $NICEPAR 'cat <(echo {}); echo b' ::: a
echo '### Test bug https://savannah.gnu.org/bugs/index.php?33352' echo '### Test bug https://savannah.gnu.org/bugs/index.php?33352'
@ -132,7 +134,7 @@ echo '### Test bug https://savannah.gnu.org/bugs/index.php?33352'
# child. # child.
echo "# md5sum - directly" echo "# md5sum - directly"
perl -e '@x=1 .. 17000; for(1..100) { print "@x\n"}' | md5sum nice perl -e '@x=1 .. 17000; for(1..100) { print "@x\n"}' | md5sum
echo "# parallel | md5sum" echo "# parallel | md5sum"
nice nice perl -e '@x=1 .. 17000; for(1..100) { print "@x\n"}' | pv -qL 1000000 | nice nice perl -e '@x=1 .. 17000; for(1..100) { print "@x\n"}' | pv -qL 1000000 |
$PAR cat | md5sum $PAR cat | md5sum
@ -214,54 +216,54 @@ echo "### Tests that failed for OO-rewrite"
parallel -u --semaphore seq 1 10 '|' pv -qL 20; sem --wait; echo done parallel -u --semaphore seq 1 10 '|' pv -qL 20; sem --wait; echo done
echo a | parallel echo {1} echo a | parallel echo {1}
echo "echo a" | parallel echo "echo a" | parallel
parallel -j1 -I :: -X echo 'a::b::^c::[.}c' ::: 1 nice parallel -j1 -I :: -X echo 'a::b::^c::[.}c' ::: 1
echo "### BUG: The length for -X is not close to max (131072)" echo "### BUG: The length for -X is not close to max (131072)"
seq 1 4000 | parallel -k -X echo {.} aa {}{.} {}{}d{} {}dd{}d{.} |head -n 1 |wc seq 1 4000 | nice parallel -k -X echo {.} aa {}{.} {}{}d{} {}dd{}d{.} |head -n 1 |wc
echo "### BUG: empty lines with --show-limit" echo "### BUG: empty lines with --show-limit"
echo | parallel --show-limits echo | $NICEPAR --show-limits
echo '### Test -N' echo '### Test -N'
seq 1 5 | parallel -kN3 echo {1} {2} {3} seq 1 5 | $NICEPAR -kN3 echo {1} {2} {3}
echo '### Test --arg-file-sep with files of different lengths' echo '### Test --arg-file-sep with files of different lengths'
parallel --xapply --arg-file-sep :::: -k echo {1} {2} :::: <(seq 1 1) <(seq 3 4) $XAP --arg-file-sep :::: -k echo {1} {2} :::: <(seq 1 1) <(seq 3 4)
echo '### Test respect -s' echo '### Test respect -s'
parallel -kvm -IARG -s15 echo ARG ::: 1 22 333 4444 55555 666666 7777777 88888888 999999999 $NICEPAR -kvm -IARG -s15 echo ARG ::: 1 22 333 4444 55555 666666 7777777 88888888 999999999
echo '### Test eof string after :::' echo '### Test eof string after :::'
parallel -k -E ole echo ::: foo ole bar $NICEPAR -k -E ole echo ::: foo ole bar
echo '### Test -C and --trim rl' echo '### Test -C and --trim rl'
parallel -k -C %+ echo '"{1}_{3}_{2}_{4}"' ::: 'a% c %%b' 'a%c% b %d' $NICEPAR -k -C %+ echo '"{1}_{3}_{2}_{4}"' ::: 'a% c %%b' 'a%c% b %d'
echo '### Test empty input' echo '### Test empty input'
</dev/null parallel -j +0 echo </dev/null $NICEPAR -j +0 echo
echo '### Test -m' echo '### Test -m'
seq 1 2 | parallel -k -m echo seq 1 2 | $NICEPAR -k -m echo
echo '### Test :::' echo '### Test :::'
parallel echo ::: 1 $NICEPAR echo ::: 1
echo '### Test context_replace' echo '### Test context_replace'
echo a | parallel -qX echo "'"{}"' " echo a | $NICEPAR -qX echo "'"{}"' "
echo '### Test -N2 {2}' echo '### Test -N2 {2}'
seq 1 4 | parallel -kN2 echo arg1:{1} seq:'$'PARALLEL_SEQ arg2:{2} seq 1 4 | $NICEPAR -kN2 echo arg1:{1} seq:'$'PARALLEL_SEQ arg2:{2}
echo '### Test -E (should only output foo ole)' echo '### Test -E (should only output foo ole)'
(echo foo; echo '';echo 'ole ';echo bar;echo quux) | parallel -kr -L2 -E bar echo (echo foo; echo '';echo 'ole ';echo bar;echo quux) | $NICEPAR -kr -L2 -E bar echo
parallel -kr -L2 -E bar echo ::: foo '' 'ole ' bar quux $NICEPAR -kr -L2 -E bar echo ::: foo '' 'ole ' bar quux
echo '### Test -r (should only output foo ole bar\nquux)' echo '### Test -r (should only output foo ole bar\nquux)'
parallel -kr -L2 echo ::: foo '' 'ole ' bar quux $NICEPAR -kr -L2 echo ::: foo '' 'ole ' bar quux
echo '### Test of tab as colsep' echo '### Test of tab as colsep'
printf 'def\tabc\njkl\tghi' | parallel -k --colsep '\t' echo {2} {1} printf 'def\tabc\njkl\tghi' | $NICEPAR -k --colsep '\t' echo {2} {1}
parallel -k -a <(printf 'def\tabc\njkl\tghi') --colsep '\t' echo {2} {1} $NICEPAR -k -a <(printf 'def\tabc\njkl\tghi') --colsep '\t' echo {2} {1}
EOF EOF

View file

@ -16,6 +16,7 @@ ping -c 1 redhat9.tange.dk >/dev/null 2>&1
ping -c 1 freebsd7.tange.dk >/dev/null 2>&1 ping -c 1 freebsd7.tange.dk >/dev/null 2>&1
echo "### bug #37589: Red Hat 9 (Shrike) perl v5.8.0 built for i386-linux-thread-multi error" echo "### bug #37589: Red Hat 9 (Shrike) perl v5.8.0 built for i386-linux-thread-multi error"
rm -rf /tmp/parallel
cp `which parallel` /tmp/parallel cp `which parallel` /tmp/parallel
stdout parallel -kj10 --argsep == --basefile /tmp/parallel --tag --nonall -S redhat9.tange.dk,centos3.tange.dk,centos5.tange.dk,freebsd7.tange.dk /tmp/parallel --no-notice echo ::: OK_if_no_perl_warnings | sort stdout parallel -kj10 --argsep == --basefile /tmp/parallel --tag --nonall -S redhat9.tange.dk,centos3.tange.dk,centos5.tange.dk,freebsd7.tange.dk /tmp/parallel --no-notice echo ::: OK_if_no_perl_warnings | sort

View file

@ -23,7 +23,8 @@ seq 1 2 | parallel --retries 2 --sshlogin 8/localhost,8/: -j-1 "hostname; false"
seq 1 1 | parallel --retries 2 --sshlogin 1/localhost,1/: -j1 "hostname; false" | wc -l seq 1 1 | parallel --retries 2 --sshlogin 1/localhost,1/: -j1 "hostname; false" | wc -l
seq 1 1 | parallel --retries 2 --sshlogin 1/localhost,1/: -j9 "hostname; false" | wc -l seq 1 1 | parallel --retries 2 --sshlogin 1/localhost,1/: -j9 "hostname; false" | wc -l
seq 1 1 | parallel --retries 2 --sshlogin 1/localhost,1/: -j0 "hostname; false" | wc -l seq 1 1 | parallel --retries 2 --sshlogin 1/localhost,1/: -j0 "hostname; false" | wc -l
seq 1 1 | parallel --retries 2 --sshlogin 1/localhost,1/: -j-1 "hostname; false" | wc -l # Fails due to 0 jobslots
# seq 1 1 | parallel --retries 2 --sshlogin 1/localhost,1/: -j-1 "hostname; false" | wc -l
echo '### These were not affected by the bug' echo '### These were not affected by the bug'
seq 1 8 | parallel --retries 2 --sshlogin 1/localhost,9/: -j-1 "hostname; false" | wc -l seq 1 8 | parallel --retries 2 --sshlogin 1/localhost,9/: -j-1 "hostname; false" | wc -l

View file

@ -1,5 +1,7 @@
### Test installation missing pod2* ### Test installation missing pod2*
make[0]: Entering directory `/home/tange/privat/parallel' make[0]: Entering directory `/home/tange/privat/parallel'
make dist-gzip am__post_remove_distdir='@:'
make[0]: Entering directory `/home/tange/privat/parallel'
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 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
test -d "parallel-00000000" || mkdir "parallel-00000000" 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 \
@ -14,6 +16,7 @@ test -n "" \
! -type d ! -perm -444 -exec /bin/bash /home/tange/privat/parallel/install-sh -c -m a+r {} {} \; \ ! -type d ! -perm -444 -exec /bin/bash /home/tange/privat/parallel/install-sh -c -m a+r {} {} \; \
|| chmod -R a+r "parallel-00000000" || chmod -R a+r "parallel-00000000"
tardir=parallel-00000000 && ${TAR-tar} chof - "$tardir" | GZIP=--best gzip -c >parallel-00000000.tar.gz tardir=parallel-00000000 && ${TAR-tar} chof - "$tardir" | GZIP=--best gzip -c >parallel-00000000.tar.gz
make[0]: Leaving directory `/home/tange/privat/parallel'
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 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
make[0]: Leaving directory `/home/tange/privat/parallel' make[0]: Leaving directory `/home/tange/privat/parallel'
checking for a BSD-compatible install... /usr/bin/install -c checking for a BSD-compatible install... /usr/bin/install -c
@ -21,6 +24,9 @@ checking whether build environment is sane... yes
checking for a thread-safe mkdir -p... /bin/mkdir -p checking for a thread-safe mkdir -p... /bin/mkdir -p
checking for gawk... gawk checking for gawk... gawk
checking whether make sets $(MAKE)... yes checking whether make sets $(MAKE)... yes
checking whether make supports nested variables... yes
checking whether ln -s works... yes
checking that generated files are newer than configure... done
configure: creating ./config.status configure: creating ./config.status
config.status: creating Makefile config.status: creating Makefile
config.status: creating src/Makefile config.status: creating src/Makefile
@ -57,31 +63,31 @@ pod2man --release='00000000' --center='parallel' \
|| echo "Warning: pod2man not found. Using old parallel_tutorial.1" || echo "Warning: pod2man not found. Using old parallel_tutorial.1"
/bin/bash: pod2man: command not found /bin/bash: pod2man: command not found
Warning: pod2man not found. Using old parallel_tutorial.1 Warning: pod2man not found. Using old parallel_tutorial.1
pod2html ./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"
/bin/bash: pod2html: command not found /bin/bash: pod2html: command not found
Warning: pod2html not found. Using old parallel.html Warning: pod2html not found. Using old parallel.html
rm -f ./pod2htm* rm -f ./pod2htm*
pod2html ./parallel_tutorial.pod > ./parallel_tutorial.htmln \ pod2html --title "GNU Parallel tutorial" ./parallel_tutorial.pod > ./parallel_tutorial.htmln \
&& mv ./parallel_tutorial.htmln ./parallel_tutorial.html \ && mv ./parallel_tutorial.htmln ./parallel_tutorial.html \
|| echo "Warning: pod2html not found. Using old parallel_tutorial.html" || echo "Warning: pod2html not found. Using old parallel_tutorial.html"
/bin/bash: pod2html: command not found /bin/bash: pod2html: command not found
Warning: pod2html not found. Using old parallel_tutorial.html Warning: pod2html not found. Using old parallel_tutorial.html
rm -f ./pod2htm* rm -f ./pod2htm*
pod2html ./sem.pod > ./sem.htmln \ pod2html --title "sem (GNU Parallel)" ./sem.pod > ./sem.htmln \
&& mv ./sem.htmln ./sem.html \ && mv ./sem.htmln ./sem.html \
|| echo "Warning: pod2html not found. Using old sem.html" || echo "Warning: pod2html not found. Using old sem.html"
/bin/bash: pod2html: command not found /bin/bash: pod2html: command not found
Warning: pod2html not found. Using old sem.html Warning: pod2html not found. Using old sem.html
rm -f ./pod2htm* rm -f ./pod2htm*
pod2html ./sql > ./sql.htmln \ pod2html --title "GNU SQL" ./sql > ./sql.htmln \
&& mv ./sql.htmln ./sql.html \ && mv ./sql.htmln ./sql.html \
|| echo "Warning: pod2html not found. Using old sql.html" || echo "Warning: pod2html not found. Using old sql.html"
/bin/bash: pod2html: command not found /bin/bash: pod2html: command not found
Warning: pod2html not found. Using old sql.html Warning: pod2html not found. Using old sql.html
rm -f ./pod2htm* rm -f ./pod2htm*
pod2html ./niceload.pod > ./niceload.htmln \ pod2html --title "GNU niceload" ./niceload.pod > ./niceload.htmln \
&& mv ./niceload.htmln ./niceload.html \ && mv ./niceload.htmln ./niceload.html \
|| echo "Warning: pod2html not found. Using old niceload.html" || echo "Warning: pod2html not found. Using old niceload.html"
/bin/bash: pod2html: command not found /bin/bash: pod2html: command not found
@ -129,32 +135,37 @@ pod2pdf --output-file ./parallel_tutorial.pdf ./parallel_tutorial.pod --title "G
Warning: pod2pdf not found. Using old parallel_tutorial.pdf Warning: pod2pdf not found. Using old parallel_tutorial.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 sem sql niceload '/usr/local/bin' /usr/bin/install -c parallel sql niceload '/usr/local/bin'
pod2html ./parallel.pod > ./parallel.htmln \ make install-exec-hook
make[0]: Entering directory `/tmp/parallel-00000000/src'
rm /usr/local/bin/sem || true
ln -s /usr/local/bin/parallel /usr/local/bin/sem
make[0]: Leaving directory `/tmp/parallel-00000000/src'
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"
/bin/bash: pod2html: command not found /bin/bash: pod2html: command not found
Warning: pod2html not found. Using old parallel.html Warning: pod2html not found. Using old parallel.html
rm -f ./pod2htm* rm -f ./pod2htm*
pod2html ./parallel_tutorial.pod > ./parallel_tutorial.htmln \ pod2html --title "GNU Parallel tutorial" ./parallel_tutorial.pod > ./parallel_tutorial.htmln \
&& mv ./parallel_tutorial.htmln ./parallel_tutorial.html \ && mv ./parallel_tutorial.htmln ./parallel_tutorial.html \
|| echo "Warning: pod2html not found. Using old parallel_tutorial.html" || echo "Warning: pod2html not found. Using old parallel_tutorial.html"
/bin/bash: pod2html: command not found /bin/bash: pod2html: command not found
Warning: pod2html not found. Using old parallel_tutorial.html Warning: pod2html not found. Using old parallel_tutorial.html
rm -f ./pod2htm* rm -f ./pod2htm*
pod2html ./sem.pod > ./sem.htmln \ pod2html --title "sem (GNU Parallel)" ./sem.pod > ./sem.htmln \
&& mv ./sem.htmln ./sem.html \ && mv ./sem.htmln ./sem.html \
|| echo "Warning: pod2html not found. Using old sem.html" || echo "Warning: pod2html not found. Using old sem.html"
/bin/bash: pod2html: command not found /bin/bash: pod2html: command not found
Warning: pod2html not found. Using old sem.html Warning: pod2html not found. Using old sem.html
rm -f ./pod2htm* rm -f ./pod2htm*
pod2html ./sql > ./sql.htmln \ pod2html --title "GNU SQL" ./sql > ./sql.htmln \
&& mv ./sql.htmln ./sql.html \ && mv ./sql.htmln ./sql.html \
|| echo "Warning: pod2html not found. Using old sql.html" || echo "Warning: pod2html not found. Using old sql.html"
/bin/bash: pod2html: command not found /bin/bash: pod2html: command not found
Warning: pod2html not found. Using old sql.html Warning: pod2html not found. Using old sql.html
rm -f ./pod2htm* rm -f ./pod2htm*
pod2html ./niceload.pod > ./niceload.htmln \ pod2html --title "GNU niceload" ./niceload.pod > ./niceload.htmln \
&& mv ./niceload.htmln ./niceload.html \ && mv ./niceload.htmln ./niceload.html \
|| echo "Warning: pod2html not found. Using old niceload.html" || echo "Warning: pod2html not found. Using old niceload.html"
/bin/bash: pod2html: command not found /bin/bash: pod2html: command not found

View file

@ -9,7 +9,7 @@ echo "### Test Force outside the file handle limit, 2009-02-17 Gave fork error"
### Test Force outside the file handle limit, 2009-02-17 Gave fork error ### 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) | stdout parallel -uj 0 | egrep -v 'processes took|adjusting' (echo echo Start; seq 1 20000 | perl -pe 's/^/true /'; echo echo end) | stdout parallel -uj 0 | egrep -v 'processes took|adjusting'
parallel: Warning: Only enough file handles to run 252 jobs in parallel. parallel: Warning: Only enough file handles to run 252 jobs in parallel.
Raising ulimit -n or /etc/security/limits.conf may help. Running 'parallel -j0 -N252 --pipe parallel -j0' or raising ulimit -n or /etc/security/limits.conf may help.
Start Start
end end
echo '**' echo '**'

View file

@ -64,7 +64,6 @@ bug #40137: SHELL not bash: Warning when exporting funcs
no_warning no_warning
. <(printf 'myfunc() {\necho $1\n}'); export -f myfunc; SHELL=/bin/sh parallel --env myfunc -S lo myfunc ::: warning . <(printf 'myfunc() {\necho $1\n}'); export -f myfunc; SHELL=/bin/sh parallel --env myfunc -S lo myfunc ::: warning
warning warning
parallel: Warning: Shell functions may not be supported in /bin/sh
echo '### bug #40002: --files and --nonall seem not to work together:' echo '### bug #40002: --files and --nonall seem not to work together:'
### bug #40002: --files and --nonall seem not to work together: ### bug #40002: --files and --nonall seem not to work together:
parallel --files --nonall -S localhost true | tee >(parallel rm) | wc -l parallel --files --nonall -S localhost true | tee >(parallel rm) | wc -l

View file

@ -10,8 +10,5 @@ echo '### Test slow arguments generation - https://savannah.gnu.org/bugs/?32834'
1 1
2 2
3 3
echo '### Test too slow spawning'
### Test too slow spawning ### Test too slow spawning
# Let the commands below run during high load
seq `parallel --number-of-cores` | parallel -j200% -N0 timeout -k 25 26 burnP6 & sleep 1; seq 1 1000 | stdout nice nice parallel -s 100 -uj0 true | perl -pe '/parallel: Warning: Starting \d+ processes took/ and do {close STDIN; `killall -9 burnP6`; print "OK\n"; exit }'
OK OK

View file

@ -1,8 +1,8 @@
echo '### bug #42329: --line-buffer gives wrong output'; parallel --line-buffer --tag seq ::: 10000000 | wc -c; parallel --line-buffer seq ::: 10000000 | wc -c echo '### bug #42329: --line-buffer gives wrong output'; $NICEPAR --line-buffer --tag seq ::: 10000000 | wc -c; $NICEPAR --line-buffer seq ::: 10000000 | wc -c
### bug #42329: --line-buffer gives wrong output ### bug #42329: --line-buffer gives wrong output
168888897 168888897
78888897 78888897
echo '### Test \0 as recend'; printf "a\0b\0c\0" | parallel --recend '\0' -k -N1 --pipe cat -v \; echo; printf "\0a\0b\0c" | parallel --recstart '\0' -k -N1 --pipe cat -v \; echo echo '### Test \0 as recend'; printf "a\0b\0c\0" | $NICEPAR --recend '\0' -k -N1 --pipe cat -v \; echo; printf "\0a\0b\0c" | $NICEPAR --recstart '\0' -k -N1 --pipe cat -v \; echo
### Test \0 as recend ### Test \0 as recend
a^@ a^@
b^@ b^@
@ -10,7 +10,7 @@ c^@
^@a ^@a
^@b ^@b
^@c ^@c
echo '### Test filenames containing UTF-8'; cd tmp; find . -name '*.jpg' | nice nice parallel -j +0 convert -geometry 120 {} {//}/thumb_{/}; find |grep -v CVS | sort; echo '### bug #39554: Feature request: line buffered output'; parallel -j0 --linebuffer 'echo -n start {};sleep 0.{#};echo middle -n {};sleep 1.{#}5;echo next to last {};sleep 1.{#};echo -n last {}' ::: A B C echo '### Test filenames containing UTF-8'; cd tmp; find . -name '*.jpg' | $NICEPAR -j +0 convert -geometry 120 {} {//}/thumb_{/}; find |grep -v CVS | sort; echo '### bug #39554: Feature request: line buffered output'; parallel -j0 --linebuffer 'echo -n start {};sleep 0.{#};echo middle -n {};sleep 1.{#}5;echo next to last {};sleep 1.{#};echo -n last {}' ::: A B C
### Test filenames containing UTF-8 ### Test filenames containing UTF-8
. .
./1-col.txt ./1-col.txt
@ -44,7 +44,7 @@ B next to last B
C next to last C C next to last C
A last AB last BC last Cecho A last AB last BC last Cecho
echo '### test round-robin'; nice seq 1000 | parallel --block 1k --pipe --round-robin wc | sort echo '### test round-robin'; nice seq 1000 | $NICEPAR --block 1k --pipe --round-robin wc | sort
### test round-robin ### test round-robin
223 223 893 223 223 893
250 250 1000 250 250 1000
@ -52,7 +52,7 @@ echo '### test round-robin'; nice seq 1000 | parallel --block 1k --pipe --roun
277 277 1000 277 277 1000
echo '### --version must have higher priority than retired options' echo '### --version must have higher priority than retired options'
### --version must have higher priority than retired options ### --version must have higher priority than retired options
parallel --version -g -Y -U -W -T | tail $NICEPAR --version -g -Y -U -W -T | tail
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html> 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. This is free software: you are free to change and redistribute it.
GNU parallel comes with no warranty. GNU parallel comes with no warranty.
@ -65,24 +65,24 @@ O. Tange (2011): GNU Parallel - The Command-Line Power Tool,
;login: The USENIX Magazine, February 2011:42-47. ;login: The USENIX Magazine, February 2011:42-47.
echo '### bug #39787: --xargs broken' echo '### bug #39787: --xargs broken'
### bug #39787: --xargs broken ### bug #39787: --xargs broken
nice perl -e 'for(1..30000){print "$_\n"}' | nice parallel --xargs -k echo | perl -ne 'print length $_,"\n"' nice perl -e 'for(1..30000){print "$_\n"}' | $NICEPAR --xargs -k echo | perl -ne 'print length $_,"\n"'
131064 131064
37830 37830
echo '### --delay should grow by 2 sec per arg' echo '### --delay should grow by 3 sec per arg'
### --delay should grow by 2 sec per arg ### --delay should grow by 3 sec per arg
stdout /usr/bin/time -f %e parallel --delay 2 true ::: 1 2 | perl -ne '$_ >= 2 and $_ <= 5 and print "OK\n"' stdout /usr/bin/time -f %e parallel --delay 3 true ::: 1 2 | perl -ne '$_ >= 3 and $_ <= 8 and print "OK\n"'
OK OK
stdout /usr/bin/time -f %e parallel --delay 2 true ::: 1 2 3 | perl -ne '$_ >= 4 and $_ <= 7 and print "OK\n"' stdout /usr/bin/time -f %e parallel --delay 3 true ::: 1 2 3 | perl -ne '$_ >= 6 and $_ <= 11 and print "OK\n"'
OK OK
echo '### Exit value should not be affected if an earlier job times out' echo '### Exit value should not be affected if an earlier job times out'
### Exit value should not be affected if an earlier job times out ### Exit value should not be affected if an earlier job times out
parallel -j2 --timeout 1 --joblog - -k ::: "sleep 10" "exit 255" | field 7 $NICEPAR -j2 --timeout 1 --joblog - -k ::: "sleep 10" "exit 255" | field 7
Exitval Exitval
-1 -1
255 255
echo '### --header regexp' echo '### --header regexp'
### --header regexp ### --header regexp
(echo %head1; echo %head2; seq 5) | nice parallel -kj2 --pipe -N2 --header '(%.*\n)*' echo JOB{#}\;cat (echo %head1; echo %head2; seq 5) | $NICEPAR -kj2 --pipe -N2 --header '(%.*\n)*' echo JOB{#}\;cat
JOB1 JOB1
%head1 %head1
%head2 %head2
@ -99,7 +99,7 @@ JOB3
5 5
echo '### --header num' echo '### --header num'
### --header num ### --header num
(echo %head1; echo %head2; seq 5) | nice parallel -kj2 --pipe -N2 --header 2 echo JOB{#}\;cat (echo %head1; echo %head2; seq 5) | $NICEPAR -kj2 --pipe -N2 --header 2 echo JOB{#}\;cat
JOB1 JOB1
%head1 %head1
%head2 %head2
@ -116,21 +116,21 @@ JOB3
5 5
echo '### --header regexp --round-robin' echo '### --header regexp --round-robin'
### --header regexp --round-robin ### --header regexp --round-robin
(echo %head1; echo %head2; seq 5) | nice parallel -kj2 --pipe -N2 --round --header '(%.*\n)*' echo JOB\;wc | sort (echo %head1; echo %head2; seq 5) | $NICEPAR -kj2 --pipe -N2 --round --header '(%.*\n)*' echo JOB\;wc | sort
4 4 18 4 4 18
5 5 20 5 5 20
JOB JOB
JOB JOB
echo '### --header num --round-robin' echo '### --header num --round-robin'
### --header num --round-robin ### --header num --round-robin
(echo %head1; echo %head2; seq 5) | nice parallel -kj2 --pipe -N2 --round --header 2 echo JOB{#}\;wc | sort (echo %head1; echo %head2; seq 5) | $NICEPAR -kj2 --pipe -N2 --round --header 2 echo JOB{#}\;wc | sort
4 4 18 4 4 18
5 5 20 5 5 20
JOB1 JOB1
JOB2 JOB2
echo '### shebang-wrap' echo '### shebang-wrap'
### shebang-wrap ### shebang-wrap
nice nice parallel -k {} {} A B C ::: ./input-files/shebang/shebangwrap.*[^~] $NICEPAR -k {} {} A B C ::: ./input-files/shebang/shebangwrap.*[^~]
./input-files/shebang/shebangwrap.oct ./input-files/shebang/shebangwrap.oct
A A
B B

View file

@ -1,48 +1,48 @@
echo 'bug #41613: --compress --line-buffer no newline'; echo 'bug #41613: --compress --line-buffer no newline';
bug #41613: --compress --line-buffer no newline bug #41613: --compress --line-buffer no newline
perl -e 'print "It worked"'| parallel --pipe --compress --line-buffer cat; echo perl -e 'print "It worked"'| $NICEPAR --pipe --compress --line-buffer cat; echo
It worked It worked
echo 'bug #41613: --compress --line-buffer no --tagstring'; echo 'bug #41613: --compress --line-buffer no --tagstring';
bug #41613: --compress --line-buffer no --tagstring bug #41613: --compress --line-buffer no --tagstring
diff <(nice perl -e 'for("x011".."x110"){print "$_\t", ("\n", map { rand } (1..100000)) }'| parallel -N10 -L1 --pipe -j6 --block 20M --compress pv -qL 1000000 | perl -pe 's/(....).*/$1/') <(nice perl -e 'for("x011".."x110"){print "$_\t", ("\n", map { rand } (1..100000)) }'| parallel -N10 -L1 --pipe -j6 --block 20M --compress --line-buffer pv -qL 1000000 | perl -pe 's/(....).*/$1/') >/dev/null || (echo 'Good: --line-buffer matters'; false) && echo 'Bad: --line-buffer not working' diff <(nice perl -e 'for("x011".."x110"){print "$_\t", ("\n", map { rand } (1..100000)) }'| $NICEPAR -N10 -L1 --pipe -j6 --block 20M --compress pv -qL 1000000 | perl -pe 's/(....).*/$1/') <(nice perl -e 'for("x011".."x110"){print "$_\t", ("\n", map { rand } (1..100000)) }'| $NICEPAR -N10 -L1 --pipe -j6 --block 20M --compress --line-buffer pv -qL 1000000 | perl -pe 's/(....).*/$1/') >/dev/null || (echo 'Good: --line-buffer matters'; false) && echo 'Bad: --line-buffer not working'
Good: --line-buffer matters Good: --line-buffer matters
echo 'bug #41613: --compress --line-buffer with --tagstring'; echo 'bug #41613: --compress --line-buffer with --tagstring';
bug #41613: --compress --line-buffer with --tagstring bug #41613: --compress --line-buffer with --tagstring
diff <(nice perl -e 'for("x011".."x110"){print "$_\t", ("\n", map { rand } (1..100000)) }'| parallel -N10 -L1 --pipe -j6 --block 20M --compress --tagstring {#} pv -qL 1000000 | perl -pe 's/(....).*/$1/') <(nice perl -e 'for("x011".."x110"){print "$_\t", ("\n", map { rand } (1..100000)) }'| parallel -N10 -L1 --pipe -j6 --block 20M --compress --tagstring {#} --line-buffer pv -qL 1000000 | perl -pe 's/(....).*/$1/') >/dev/null || (echo 'Good: --line-buffer matters'; false) && echo 'Bad: --line-buffer not working' diff <(nice perl -e 'for("x011".."x110"){print "$_\t", ("\n", map { rand } (1..100000)) }'| $NICEPAR -N10 -L1 --pipe -j6 --block 20M --compress --tagstring {#} pv -qL 1000000 | perl -pe 's/(....).*/$1/') <(nice perl -e 'for("x011".."x110"){print "$_\t", ("\n", map { rand } (1..100000)) }'| $NICEPAR -N10 -L1 --pipe -j6 --block 20M --compress --tagstring {#} --line-buffer pv -qL 1000000 | perl -pe 's/(....).*/$1/') >/dev/null || (echo 'Good: --line-buffer matters'; false) && echo 'Bad: --line-buffer not working'
Good: --line-buffer matters Good: --line-buffer matters
echo 'bug #41613: --compress --line-buffer - no newline'; echo 'bug #41613: --compress --line-buffer - no newline';
bug #41613: --compress --line-buffer - no newline bug #41613: --compress --line-buffer - no newline
echo 'pipe compress tagstring' echo 'pipe compress tagstring'
pipe compress tagstring pipe compress tagstring
perl -e 'print "O"'| parallel --compress --tagstring {#} --pipe --line-buffer cat; echo "K" perl -e 'print "O"'| $NICEPAR --compress --tagstring {#} --pipe --line-buffer cat; echo "K"
1 OK 1 OK
echo 'pipe compress notagstring' echo 'pipe compress notagstring'
pipe compress notagstring pipe compress notagstring
perl -e 'print "O"'| parallel --compress --pipe --line-buffer cat; echo "K" perl -e 'print "O"'| $NICEPAR --compress --pipe --line-buffer cat; echo "K"
OK OK
echo 'pipe nocompress tagstring' echo 'pipe nocompress tagstring'
pipe nocompress tagstring pipe nocompress tagstring
perl -e 'print "O"'| parallel --tagstring {#} --pipe --line-buffer cat; echo "K" perl -e 'print "O"'| $NICEPAR --tagstring {#} --pipe --line-buffer cat; echo "K"
1 OK 1 OK
echo 'pipe nocompress notagstring' echo 'pipe nocompress notagstring'
pipe nocompress notagstring pipe nocompress notagstring
perl -e 'print "O"'| parallel --pipe --line-buffer cat; echo "K" perl -e 'print "O"'| $NICEPAR --pipe --line-buffer cat; echo "K"
OK OK
echo 'nopipe compress tagstring' echo 'nopipe compress tagstring'
nopipe compress tagstring nopipe compress tagstring
parallel --compress --tagstring {#} --line-buffer echo {} O ::: -n; echo "K" $NICEPAR --compress --tagstring {#} --line-buffer echo {} O ::: -n; echo "K"
1 OK 1 OK
echo 'nopipe compress notagstring' echo 'nopipe compress notagstring'
nopipe compress notagstring nopipe compress notagstring
parallel --compress --line-buffer echo {} O ::: -n; echo "K" $NICEPAR --compress --line-buffer echo {} O ::: -n; echo "K"
OK OK
echo 'nopipe nocompress tagstring' echo 'nopipe nocompress tagstring'
nopipe nocompress tagstring nopipe nocompress tagstring
parallel --tagstring {#} --line-buffer echo {} O ::: -n; echo "K" $NICEPAR --tagstring {#} --line-buffer echo {} O ::: -n; echo "K"
1 OK 1 OK
echo 'nopipe nocompress notagstring' echo 'nopipe nocompress notagstring'
nopipe nocompress notagstring nopipe nocompress notagstring
parallel --line-buffer echo {} O ::: -n; echo "K" $NICEPAR --line-buffer echo {} O ::: -n; echo "K"
OK OK
echo 'bug #41412: --timeout + --delay causes deadlock'; echo 'bug #41412: --timeout + --delay causes deadlock';
bug #41412: --timeout + --delay causes deadlock bug #41412: --timeout + --delay causes deadlock
@ -61,17 +61,17 @@ bug #41412: --timeout + --delay causes deadlock
1 1
2 2
3 3
parallel -j10 --timeout 2.2 --delay 3 "sleep {}; echo {}" ::: 1 2 4 5 6 parallel -j10 --timeout 2.2 --delay 3 "sleep {}; echo {}" ::: 1 2 7 8 9
1 1
2 2
echo '### Test --spreadstdin - more procs than args'; rm -f /tmp/parallel.ss.*; seq 1 5 | stdout parallel -j 10 --spreadstdin 'cat >/tmp/parallel.ss.$PARALLEL_SEQ' >/dev/null; cat /tmp/parallel.ss.*; echo '### Test --spreadstdin - more procs than args'; rm -f /tmp/parallel.ss.*; seq 1 5 | stdout $NICEPAR -j 10 --spreadstdin 'cat >/tmp/parallel.ss.$PARALLEL_SEQ' >/dev/null; cat /tmp/parallel.ss.*;
### Test --spreadstdin - more procs than args ### Test --spreadstdin - more procs than args
1 1
2 2
3 3
4 4
5 5
echo '### Test --spreadstdin - more args than procs'; rm -f /tmp/parallel.ss2.*; seq 1 10 | stdout parallel -j 5 --spreadstdin 'cat >/tmp/parallel.ss2.$PARALLEL_SEQ' >/dev/null; cat /tmp/parallel.ss2.* echo '### Test --spreadstdin - more args than procs'; rm -f /tmp/parallel.ss2.*; seq 1 10 | stdout $NICEPAR -j 5 --spreadstdin 'cat >/tmp/parallel.ss2.$PARALLEL_SEQ' >/dev/null; cat /tmp/parallel.ss2.*
### Test --spreadstdin - more args than procs ### Test --spreadstdin - more args than procs
1 1
2 2
@ -83,55 +83,55 @@ echo '### Test --spreadstdin - more args than procs'; rm -f /tmp/parallel.ss2.
8 8
9 9
10 10
nice nice seq 1 1000 | nice nice parallel -j1 --spreadstdin cat "|cat "|wc -c nice nice seq 1 1000 | $NICEPAR -j1 --spreadstdin cat "|cat "|wc -c
3893 3893
nice nice seq 1 10000 | nice nice parallel -j10 --spreadstdin cat "|cat "|wc -c nice nice seq 1 10000 | $NICEPAR -j10 --spreadstdin cat "|cat "|wc -c
48894 48894
nice nice seq 1 100000 | nice nice parallel -j1 --spreadstdin cat "|cat "|wc -c nice nice seq 1 100000 | $NICEPAR -j1 --spreadstdin cat "|cat "|wc -c
588895 588895
nice nice seq 1 1000000 | nice nice parallel -j10 --spreadstdin cat "|cat "|wc -c nice nice seq 1 1000000 | $NICEPAR -j10 --spreadstdin cat "|cat "|wc -c
6888896 6888896
seq 1 10 | parallel --recend "\n" -j1 --spreadstdin gzip -9 >/tmp/foo.gz seq 1 10 | $NICEPAR --recend "\n" -j1 --spreadstdin gzip -9 >/tmp/foo.gz
echo '### Test --spreadstdin - similar to the failing below'; nice seq 1 100000 | nice nice parallel --recend "\n" -j10 --spreadstdin gzip -9 >/tmp/foo2.gz; diff <(nice seq 1 100000) <(zcat /tmp/foo2.gz |sort -n); diff <(nice seq 1 100000|wc -c) <(zcat /tmp/foo2.gz |wc -c) echo '### Test --spreadstdin - similar to the failing below'; nice seq 1 100000 | $NICEPAR --recend "\n" -j10 --spreadstdin gzip -9 >/tmp/foo2.gz; diff <(nice seq 1 100000) <(zcat /tmp/foo2.gz |sort -n); diff <(nice seq 1 100000|wc -c) <(zcat /tmp/foo2.gz |wc -c)
### Test --spreadstdin - similar to the failing below ### Test --spreadstdin - similar to the failing below
echo '### Test --spreadstdin - this failed during devel'; nice seq 1 1000000 | md5sum; nice seq 1 1000000 | nice nice parallel --recend "\n" -j10 --spreadstdin gzip -9 | zcat | sort -n | md5sum echo '### Test --spreadstdin - this failed during devel'; nice seq 1 1000000 | md5sum; nice seq 1 1000000 | $NICEPAR --recend "\n" -j10 --spreadstdin gzip -9 | zcat | sort -n | md5sum
### Test --spreadstdin - this failed during devel ### Test --spreadstdin - this failed during devel
8a7095c1c23bfadc311fe6b16d950582 - 8a7095c1c23bfadc311fe6b16d950582 -
8a7095c1c23bfadc311fe6b16d950582 - 8a7095c1c23bfadc311fe6b16d950582 -
echo '### Test --spreadstdin -k'; nice seq 1 1000000 | nice nice parallel -k --recend "\n" -j10 --spreadstdin gzip -9 | zcat | md5sum echo '### Test --spreadstdin -k'; nice seq 1 1000000 | $NICEPAR -k --recend "\n" -j10 --spreadstdin gzip -9 | zcat | md5sum
### Test --spreadstdin -k ### Test --spreadstdin -k
8a7095c1c23bfadc311fe6b16d950582 - 8a7095c1c23bfadc311fe6b16d950582 -
echo '### Test --spreadstdin --files'; nice seq 1 1000000 | shuf | parallel --files --recend "\n" -j10 --spreadstdin sort -n | parallel -Xj1 sort -nm {} ";"rm {} | md5sum echo '### Test --spreadstdin --files'; nice seq 1 1000000 | shuf | $NICEPAR --files --recend "\n" -j10 --spreadstdin sort -n | parallel -Xj1 sort -nm {} ";"rm {} | md5sum
### Test --spreadstdin --files ### Test --spreadstdin --files
8a7095c1c23bfadc311fe6b16d950582 - 8a7095c1c23bfadc311fe6b16d950582 -
echo '### Test --number-of-cpus'; stdout parallel --number-of-cpus echo '### Test --number-of-cpus'; stdout $NICEPAR --number-of-cpus
### Test --number-of-cpus ### Test --number-of-cpus
1 1
echo '### Test --number-of-cores'; stdout parallel --number-of-cores echo '### Test --number-of-cores'; stdout $NICEPAR --number-of-cores
### Test --number-of-cores ### Test --number-of-cores
8 8
echo '### Test --use-cpus-instead-of-cores'; (seq 1 4 | stdout parallel --use-cpus-instead-of-cores -j100% sleep) && echo CPUs done & (seq 1 4 | stdout parallel -j100% sleep) && echo cores done & echo 'Cores should complete first on machines with less than 4 physical CPUs'; wait echo '### Test --use-cpus-instead-of-cores'; (seq 1 8 | stdout parallel --use-cpus-instead-of-cores -j100% sleep) && echo CPUs done & (seq 1 8 | stdout parallel -j100% sleep) && echo cores done & echo 'Cores should complete first on machines with less than 8 physical CPUs'; wait
### Test --use-cpus-instead-of-cores ### Test --use-cpus-instead-of-cores
Cores should complete first on machines with less than 4 physical CPUs Cores should complete first on machines with less than 8 physical CPUs
cores done cores done
CPUs done CPUs done
echo '### Test --tag ::: a ::: b'; stdout parallel -k --tag -j1 echo stderr-{.} ">&2;" echo stdout-{} ::: a ::: b echo '### Test --tag ::: a ::: b'; stdout $NICEPAR -k --tag -j1 echo stderr-{.} ">&2;" echo stdout-{} ::: a ::: b
### Test --tag ::: a ::: b ### Test --tag ::: a ::: b
a b stdout-a b a b stdout-a b
a b stderr-a b a b stderr-a b
echo '### Test --tag ::: a b'; stdout parallel -k --tag -j1 echo stderr-{.} ">&2;" echo stdout-{} ::: a b echo '### Test --tag ::: a b'; stdout $NICEPAR -k --tag -j1 echo stderr-{.} ">&2;" echo stdout-{} ::: a b
### Test --tag ::: a b ### Test --tag ::: a b
a stdout-a a stdout-a
a stderr-a a stderr-a
b stdout-b b stdout-b
b stderr-b b stderr-b
echo '### Test --tag -X ::: a b'; stdout parallel -k --tag -X -j1 echo stderr-{.} ">&2;" echo stdout-{} ::: a b echo '### Test --tag -X ::: a b'; stdout $NICEPAR -k --tag -X -j1 echo stderr-{.} ">&2;" echo stdout-{} ::: a b
### Test --tag -X ::: a b ### Test --tag -X ::: a b
a b stdout-a stdout-b a b stdout-a stdout-b
a b stderr-a stderr-b a b stderr-a stderr-b
echo '### Test bash redirection <()'; echo '### Test bash redirection <()';
### Test bash redirection <() ### Test bash redirection <()
parallel 'cat <(echo {}); echo b' ::: a $NICEPAR 'cat <(echo {}); echo b' ::: a
a a
b b
echo '### Test bug https://savannah.gnu.org/bugs/index.php?33352' echo '### Test bug https://savannah.gnu.org/bugs/index.php?33352'
@ -155,7 +155,7 @@ echo '### Test bug https://savannah.gnu.org/bugs/index.php?33352'
# child. # child.
echo "# md5sum - directly" echo "# md5sum - directly"
# md5sum - directly # md5sum - directly
perl -e '@x=1 .. 17000; for(1..100) { print "@x\n"}' | md5sum nice perl -e '@x=1 .. 17000; for(1..100) { print "@x\n"}' | md5sum
350eda13a37912d755c9d733d149bdaf - 350eda13a37912d755c9d733d149bdaf -
echo "# parallel | md5sum" echo "# parallel | md5sum"
# parallel | md5sum # parallel | md5sum
@ -430,15 +430,15 @@ echo a | parallel echo {1}
a a
echo "echo a" | parallel echo "echo a" | parallel
a a
parallel -j1 -I :: -X echo 'a::b::^c::[.}c' ::: 1 nice parallel -j1 -I :: -X echo 'a::b::^c::[.}c' ::: 1
a1b1^c1[.}c a1b1^c1[.}c
echo "### BUG: The length for -X is not close to max (131072)" echo "### BUG: The length for -X is not close to max (131072)"
### BUG: The length for -X is not close to max (131072) ### BUG: The length for -X is not close to max (131072)
seq 1 4000 | parallel -k -X echo {.} aa {}{.} {}{}d{} {}dd{}d{.} |head -n 1 |wc seq 1 4000 | nice parallel -k -X echo {.} aa {}{.} {}{}d{} {}dd{}d{.} |head -n 1 |wc
1 12821 131060 1 12821 131060
echo "### BUG: empty lines with --show-limit" echo "### BUG: empty lines with --show-limit"
### BUG: empty lines with --show-limit ### BUG: empty lines with --show-limit
echo | parallel --show-limits echo | $NICEPAR --show-limits
Maximal size of command: 131071 Maximal size of command: 131071
Maximal used size of command: 131071 Maximal used size of command: 131071
@ -447,17 +447,17 @@ and run commands; if this is not what you wanted to happen, please
press CTRL-D or CTRL-C press CTRL-D or CTRL-C
echo '### Test -N' echo '### Test -N'
### Test -N ### Test -N
seq 1 5 | parallel -kN3 echo {1} {2} {3} seq 1 5 | $NICEPAR -kN3 echo {1} {2} {3}
1 2 3 1 2 3
4 5 4 5
echo '### Test --arg-file-sep with files of different lengths' echo '### Test --arg-file-sep with files of different lengths'
### Test --arg-file-sep with files of different lengths ### Test --arg-file-sep with files of different lengths
parallel --xapply --arg-file-sep :::: -k echo {1} {2} :::: <(seq 1 1) <(seq 3 4) $XAP --arg-file-sep :::: -k echo {1} {2} :::: <(seq 1 1) <(seq 3 4)
1 3 1 3
1 4 1 4
echo '### Test respect -s' echo '### Test respect -s'
### Test respect -s ### Test respect -s
parallel -kvm -IARG -s15 echo ARG ::: 1 22 333 4444 55555 666666 7777777 88888888 999999999 $NICEPAR -kvm -IARG -s15 echo ARG ::: 1 22 333 4444 55555 666666 7777777 88888888 999999999
echo 1 22 333 echo 1 22 333
1 22 333 1 22 333
echo 4444 echo 4444
@ -474,51 +474,51 @@ echo 999999999
999999999 999999999
echo '### Test eof string after :::' echo '### Test eof string after :::'
### Test eof string after ::: ### Test eof string after :::
parallel -k -E ole echo ::: foo ole bar $NICEPAR -k -E ole echo ::: foo ole bar
foo foo
echo '### Test -C and --trim rl' echo '### Test -C and --trim rl'
### Test -C and --trim rl ### Test -C and --trim rl
parallel -k -C %+ echo '"{1}_{3}_{2}_{4}"' ::: 'a% c %%b' 'a%c% b %d' $NICEPAR -k -C %+ echo '"{1}_{3}_{2}_{4}"' ::: 'a% c %%b' 'a%c% b %d'
a_b_c_ a_b_c_
a_b_c_d a_b_c_d
echo '### Test empty input' echo '### Test empty input'
### Test empty input ### Test empty input
</dev/null parallel -j +0 echo </dev/null $NICEPAR -j +0 echo
echo '### Test -m' echo '### Test -m'
### Test -m ### Test -m
seq 1 2 | parallel -k -m echo seq 1 2 | $NICEPAR -k -m echo
1 1
2 2
echo '### Test :::' echo '### Test :::'
### Test ::: ### Test :::
parallel echo ::: 1 $NICEPAR echo ::: 1
1 1
echo '### Test context_replace' echo '### Test context_replace'
### Test context_replace ### Test context_replace
echo a | parallel -qX echo "'"{}"' " echo a | $NICEPAR -qX echo "'"{}"' "
'a' 'a'
echo '### Test -N2 {2}' echo '### Test -N2 {2}'
### Test -N2 {2} ### Test -N2 {2}
seq 1 4 | parallel -kN2 echo arg1:{1} seq:'$'PARALLEL_SEQ arg2:{2} seq 1 4 | $NICEPAR -kN2 echo arg1:{1} seq:'$'PARALLEL_SEQ arg2:{2}
arg1:1 seq:1 arg2:2 arg1:1 seq:1 arg2:2
arg1:3 seq:2 arg2:4 arg1:3 seq:2 arg2:4
echo '### Test -E (should only output foo ole)' echo '### Test -E (should only output foo ole)'
### Test -E (should only output foo ole) ### Test -E (should only output foo ole)
(echo foo; echo '';echo 'ole ';echo bar;echo quux) | parallel -kr -L2 -E bar echo (echo foo; echo '';echo 'ole ';echo bar;echo quux) | $NICEPAR -kr -L2 -E bar echo
foo ole foo ole
parallel -kr -L2 -E bar echo ::: foo '' 'ole ' bar quux $NICEPAR -kr -L2 -E bar echo ::: foo '' 'ole ' bar quux
foo ole foo ole
echo '### Test -r (should only output foo ole bar\nquux)' echo '### Test -r (should only output foo ole bar\nquux)'
### Test -r (should only output foo ole bar\nquux) ### Test -r (should only output foo ole bar\nquux)
parallel -kr -L2 echo ::: foo '' 'ole ' bar quux $NICEPAR -kr -L2 echo ::: foo '' 'ole ' bar quux
foo ole bar foo ole bar
quux quux
echo '### Test of tab as colsep' echo '### Test of tab as colsep'
### Test of tab as colsep ### Test of tab as colsep
printf 'def\tabc\njkl\tghi' | parallel -k --colsep '\t' echo {2} {1} printf 'def\tabc\njkl\tghi' | $NICEPAR -k --colsep '\t' echo {2} {1}
abc def abc def
ghi jkl ghi jkl
parallel -k -a <(printf 'def\tabc\njkl\tghi') --colsep '\t' echo {2} {1} $NICEPAR -k -a <(printf 'def\tabc\njkl\tghi') --colsep '\t' echo {2} {1}
abc def abc def
ghi jkl ghi jkl
### Test of -j filename with file content changing (missing -k is correct) ### Test of -j filename with file content changing (missing -k is correct)

View file

@ -1,6 +1,6 @@
### Test -k ### Test -k
parallel: Warning: Only enough file handles to run 9 jobs in parallel. parallel: Warning: Only enough file handles to run 9 jobs in parallel.
Raising ulimit -n or /etc/security/limits.conf may help. Running 'parallel -j0 -N9 --pipe parallel -j0' or raising ulimit -n or /etc/security/limits.conf may help.
begin begin
1 1
2 2
@ -61,7 +61,7 @@ job2
7 7
8 8
9 9
Raising ulimit -n or /etc/security/limits.conf may help. Running 'parallel -j0 -N9 --pipe parallel -j0' or raising ulimit -n or /etc/security/limits.conf may help.
parallel: SIGTERM received. No new jobs will be started. parallel: SIGTERM received. No new jobs will be started.
parallel: Waiting for these 9 jobs to finish. Send SIGTERM again to stop now. parallel: Waiting for these 9 jobs to finish. Send SIGTERM again to stop now.
parallel: Warning: Only enough file handles to run 9 jobs in parallel. parallel: Warning: Only enough file handles to run 9 jobs in parallel.

View file

@ -77,35 +77,35 @@ OK
Input for ssh Input for ssh
parallel@parallel-server1 mkdir -p ./. parallel@parallel-server1 mkdir -p ./.
-l parallel parallel-server1 rsync --server -lDrRze.iLs . ./. -l parallel parallel-server1 rsync --server -lDrRze.iLs . ./.
-tt -oLogLevel=quiet parallel@parallel-server1 eval `echo $SHELL | grep "/t\{0,1\}csh" > /dev/null && echo setenv PARALLEL_SEQ 1\; setenv PARALLEL_PID 00000 || echo PARALLEL_SEQ=1\;export PARALLEL_SEQ\; PARALLEL_PID=00000\;export PARALLEL_PID` ; tty >/dev/null && stty isig -onlcr -echo;cat tmp/parallel.file.' -tt -oLogLevel=quiet parallel@parallel-server1 eval `echo $SHELL | grep "/t\{0,1\}csh" > /dev/null && echo setenv PARALLEL_SEQ 2\; setenv PARALLEL_PID 00000 || echo PARALLEL_SEQ=2\;export PARALLEL_SEQ\; PARALLEL_PID=00000\;export PARALLEL_PID` ; tty >/dev/null && stty isig -onlcr -echo;cat tmp/parallel.file.'
'newline1 > tmp/parallel.file.'
'newline1.out;cat tmp/parallel.file.'
'newline1 > tmp/parallel.file.'
'newline1.out2
-l parallel parallel-server1 cd ././tmp; rsync --server --sender -lDrRze.iLs . ./parallel.file.'
'newline1.out
-l parallel parallel-server1 cd ././tmp; rsync --server --sender -lDrRze.iLs . ./parallel.file.'
'newline1.out2
parallel@parallel-server1 (rm -f ./tmp/parallel.file.'
'newline1; rmdir ./tmp/ ./ 2>/dev/null;)
parallel@parallel-server1 (rm -f ./tmp/parallel.file.'
'newline1.out; rmdir ./tmp/ ./ 2>/dev/null;)
parallel@parallel-server1 (rm -f ./tmp/parallel.file.'
'newline1.out2; rmdir ./tmp/ ./ 2>/dev/null;)
parallel@parallel-server2 mkdir -p ./.
-l parallel parallel-server2 rsync --server -lDrRze.iLs . ./.
-tt -oLogLevel=quiet parallel@parallel-server2 eval `echo $SHELL | grep "/t\{0,1\}csh" > /dev/null && echo setenv PARALLEL_SEQ 2\; setenv PARALLEL_PID 00000 || echo PARALLEL_SEQ=2\;export PARALLEL_SEQ\; PARALLEL_PID=00000\;export PARALLEL_PID` ; tty >/dev/null && stty isig -onlcr -echo;cat tmp/parallel.file.'
'newline2 > tmp/parallel.file.' 'newline2 > tmp/parallel.file.'
'newline2.out;cat tmp/parallel.file.' 'newline2.out;cat tmp/parallel.file.'
'newline2 > tmp/parallel.file.' 'newline2 > tmp/parallel.file.'
'newline2.out2 'newline2.out2
-l parallel parallel-server2 cd ././tmp; rsync --server --sender -lDrRze.iLs . ./parallel.file.' -l parallel parallel-server1 cd ././tmp; rsync --server --sender -lDrRze.iLs . ./parallel.file.'
'newline2.out 'newline2.out
-l parallel parallel-server2 cd ././tmp; rsync --server --sender -lDrRze.iLs . ./parallel.file.' -l parallel parallel-server1 cd ././tmp; rsync --server --sender -lDrRze.iLs . ./parallel.file.'
'newline2.out2 'newline2.out2
parallel@parallel-server2 (rm -f ./tmp/parallel.file.' parallel@parallel-server1 (rm -f ./tmp/parallel.file.'
'newline2; rmdir ./tmp/ ./ 2>/dev/null;) 'newline2; rmdir ./tmp/ ./ 2>/dev/null;)
parallel@parallel-server2 (rm -f ./tmp/parallel.file.' parallel@parallel-server1 (rm -f ./tmp/parallel.file.'
'newline2.out; rmdir ./tmp/ ./ 2>/dev/null;) 'newline2.out; rmdir ./tmp/ ./ 2>/dev/null;)
parallel@parallel-server2 (rm -f ./tmp/parallel.file.' parallel@parallel-server1 (rm -f ./tmp/parallel.file.'
'newline2.out2; rmdir ./tmp/ ./ 2>/dev/null;) 'newline2.out2; rmdir ./tmp/ ./ 2>/dev/null;)
parallel@parallel-server2 mkdir -p ./.
-l parallel parallel-server2 rsync --server -lDrRze.iLs . ./.
-tt -oLogLevel=quiet parallel@parallel-server2 eval `echo $SHELL | grep "/t\{0,1\}csh" > /dev/null && echo setenv PARALLEL_SEQ 1\; setenv PARALLEL_PID 00000 || echo PARALLEL_SEQ=1\;export PARALLEL_SEQ\; PARALLEL_PID=00000\;export PARALLEL_PID` ; tty >/dev/null && stty isig -onlcr -echo;cat tmp/parallel.file.'
'newline1 > tmp/parallel.file.'
'newline1.out;cat tmp/parallel.file.'
'newline1 > tmp/parallel.file.'
'newline1.out2
-l parallel parallel-server2 cd ././tmp; rsync --server --sender -lDrRze.iLs . ./parallel.file.'
'newline1.out
-l parallel parallel-server2 cd ././tmp; rsync --server --sender -lDrRze.iLs . ./parallel.file.'
'newline1.out2
parallel@parallel-server2 (rm -f ./tmp/parallel.file.'
'newline1; rmdir ./tmp/ ./ 2>/dev/null;)
parallel@parallel-server2 (rm -f ./tmp/parallel.file.'
'newline1.out; rmdir ./tmp/ ./ 2>/dev/null;)
parallel@parallel-server2 (rm -f ./tmp/parallel.file.'
'newline1.out2; rmdir ./tmp/ ./ 2>/dev/null;)

View file

@ -11,7 +11,6 @@
1 1
1 1
1 1
1
### These were not affected by the bug ### These were not affected by the bug
8 8
8 8