parallel: Fixed bug #58802. Now passes testsuite.

This commit is contained in:
Ole Tange 2020-08-07 22:20:30 +02:00
parent d8f99bf85f
commit 79b56269bb
55 changed files with 998 additions and 637 deletions

21
NEWS
View file

@ -42,21 +42,28 @@ New in this release:
News about GNU Parallel: News about GNU Parallel:
* GNU Parallel is used at NERSC: https://www.nersc.gov/assets/Uploads/08-Workflows-20200616.pdf * GNU Parallel is used at NERSC:
https://www.nersc.gov/assets/Uploads/08-Workflows-20200616.pdf
* Resumable batch jobs with GNU Parallel https://igor.io/parallel/ * Resumable batch jobs with GNU Parallel https://igor.io/parallel/
* Lab Meeting technical talk https://www.slideshare.net/hoffmanlab/gnu-parallel-194030490 * Lab Meeting technical talk
https://www.slideshare.net/hoffmanlab/gnu-parallel-194030490
* Open Sky Software Website Credits https://www.openskysoftware.com/site-credits.htm * Open Sky Software Website Credits
https://www.openskysoftware.com/site-credits.htm
* Speed up your Python Scripts using Ubuntu and GNU Parallel https://ecce.esri.ca/wpecce/2019/12/24/speed-up-your-python-scripts-using-ubuntu-and-gnu-parallel/ * Speed up your Python Scripts using Ubuntu and GNU Parallel
https://ecce.esri.ca/wpecce/2019/12/24/speed-up-your-python-scripts-using-ubuntu-and-gnu-parallel/
* Indispensable command-line tools https://negfeedback.blogspot.com/2020/05/indispensable-command-line-tools.html * Indispensable command-line tools
https://negfeedback.blogspot.com/2020/05/indispensable-command-line-tools.html
* GNU Parallel for simulations http://pdebuyl.be/blog/2020/gnu-parallel-for-simulations.html * GNU Parallel for simulations
http://pdebuyl.be/blog/2020/gnu-parallel-for-simulations.html
* Introduction to GNU parallel https://bioinformaticsworkbook.org/Appendix/GNUparallel/GNU_parallel_examples.html * Introduction to GNU parallel
https://bioinformaticsworkbook.org/Appendix/GNUparallel/GNU_parallel_examples.html
20200522 20200522

4
README
View file

@ -125,6 +125,10 @@ publication please cite:
Tange, O. (2020, July 22). GNU Parallel 20200722 ('Privacy Shield'). Tange, O. (2020, July 22). GNU Parallel 20200722 ('Privacy Shield').
Zenodo. https://doi.org/10.5281/zenodo.3956817 Zenodo. https://doi.org/10.5281/zenodo.3956817
Copyright (C) 2007, 2008, 2009, 2010, 2011, 2012, 2013, 2014, 2015,
2016, 2017, 2018, 2019, 2020 Ole Tange, http://ole.tange.dk and Free
Software Foundation, Inc.
= New versions = = New versions =

View file

@ -1,14 +1,15 @@
Quote of the month: Quote of the month:
Gnu parallel is also awesome, fwiw. Gnu parallel is also awesome, fwiw.
-- Rogan Dawes @RoganDawes@twitter -- Rogan Dawes @RoganDawes@twitter
I get a weird sense of satisfaction every single time I see the lovely logo of #GNU Parallel (plus, what an underrated piece of great software!) I get a weird sense of satisfaction every single time I see the
lovely logo of #GNU Parallel (plus, what an underrated piece of
-- Emre Sevinç @EmreSevinc@twitter great software!)
-- Emre Sevinç @EmreSevinc@twitter
I have gotten a *ton* of mileage out of jq, awk, and GNU parallel, I have gotten a *ton* of mileage out of jq, awk, and GNU parallel,
even at multi-GB sizes. even at multi-GB sizes.
-- Eric Wolak @ericthewolak@twitter -- Eric Wolak @ericthewolak@twitter
@ -31,9 +32,6 @@ https://negfeedback.blogspot.com/2020/05/indispensable-command-line-tools.html
GNU Parallel is awesome GNU Parallel is awesome
-- Gaurav Jain @gauravjain49@twitter -- Gaurav Jain @gauravjain49@twitter
With multicore systems everywhere GNU Parallel is a must have tool.
-- Neil H. Watson @neil_h_watson@twitter
My new favourite command line tool is GNU Parallel. After knowing it for a while I just recently came back to it for a refactor of a script and now I've changed like 4 different huge scripts into tiny parallel scripts that do their job literally 3 to 10 times faster and just [mind blown] My new favourite command line tool is GNU Parallel. After knowing it for a while I just recently came back to it for a refactor of a script and now I've changed like 4 different huge scripts into tiny parallel scripts that do their job literally 3 to 10 times faster and just [mind blown]
-- Izzy @angry_izzy@twitter -- Izzy @angry_izzy@twitter
@ -70,6 +68,9 @@ https://negfeedback.blogspot.com/2020/05/indispensable-command-line-tools.html
=== Used === === Used ===
With multicore systems everywhere GNU Parallel is a must have tool.
-- Neil H. Watson @neil_h_watson@twitter
Who needs spark when GNU Parallel exists Who needs spark when GNU Parallel exists
-- MatthijsB @MatthijsBrs@twitter -- MatthijsB @MatthijsBrs@twitter

View file

@ -24,7 +24,7 @@ https://zenodo.org/deposit/new
(*) Software (*) Software
(Reserve DOI) (Reserve DOI)
GNU Parallel 20200622 ('Floyd') GNU Parallel 20xxxx22 ('Xxxx')
Ole Tange Ole Tange
https://orcid.org/0000-0002-6345-1437 https://orcid.org/0000-0002-6345-1437
Description Description
@ -69,7 +69,7 @@ export YYYYMMDD
cd ~/privat/parallel/packager/obs cd ~/privat/parallel/packager/obs
find home:tange/parallel/* -type f | find home:tange/parallel/* -type f |
grep -v parallel.spec | grep -Ev '(PKGBUILD|parallel.spec)' |
parallel -j1 'osc rm {} || rm {}' parallel -j1 'osc rm {} || rm {}'
# This should not create new files # This should not create new files
osc up home:tange/parallel/ osc up home:tange/parallel/
@ -189,9 +189,9 @@ from:tange@gnu.org
to:parallel@gnu.org, bug-parallel@gnu.org to:parallel@gnu.org, bug-parallel@gnu.org
stable-bcc: Jesse Alama <jessealama@fastmail.fm> stable-bcc: Jesse Alama <jessealama@fastmail.fm>
Subject: GNU Parallel 20200722 ('Privacy Shield') released <<[stable]>> Subject: GNU Parallel 20200822 ('Beirut/Juan Carlos') released <<[stable]>>
GNU Parallel 20200622 ('') <<[stable]>> has been released. It is available for download at: http://ftpmirror.gnu.org/parallel/ GNU Parallel 20200822 ('') <<[stable]>> has been released. It is available for download at: http://ftpmirror.gnu.org/parallel/
<<No new functionality was introduced so this is a good candidate for a stable release.>> <<No new functionality was introduced so this is a good candidate for a stable release.>>

View file

@ -5,7 +5,10 @@ all:
cp ../debian/parallel_*.dsc ../debian/parallel_*.tar.gz home\:tange/parallel/ cp ../debian/parallel_*.dsc ../debian/parallel_*.tar.gz home\:tange/parallel/
cp `ls ../../parallel-2*.tar.bz2|grep -v latest|tail -n1` home\:tange/parallel/ cp `ls ../../parallel-2*.tar.bz2|grep -v latest|tail -n1` home\:tange/parallel/
perl -i -pe '/Version:/ and s/20\d\d\d\d\d\d/$$ENV{YYYYMMDD}/g' home:tange/parallel/parallel.spec perl -i -pe '/Version:/ and s/20\d\d\d\d\d\d/$$ENV{YYYYMMDD}/g' home:tange/parallel/parallel.spec
# Update sha256sum
cd home:tange/parallel && s=`sha256sum parallel-*.tar.bz2|field 1` perl -i -pe 's/(sha256sums=..)\w+(..)/$$1$$ENV{s}$$2/' PKGBUILD cd home:tange/parallel && s=`sha256sum parallel-*.tar.bz2|field 1` perl -i -pe 's/(sha256sums=..)\w+(..)/$$1$$ENV{s}$$2/' PKGBUILD
# Update version
cd home:tange/parallel && perl -i -pe 's/pkgver=.*/pkgver=$$ENV{YYYYMMDD}/' PKGBUILD
cd home\:tange/parallel/ && osc diff cd home\:tange/parallel/ && osc diff
cd home\:tange/parallel/ && osc up cd home\:tange/parallel/ && osc up
cd home\:tange/parallel/ && parallel osc add ::: *.spec *.dsc *.tar.gz *.tar.bz2 && echo Src added OK || true cd home\:tange/parallel/ && parallel osc add ::: *.spec *.dsc *.tar.gz *.tar.bz2 && echo Src added OK || true

View file

@ -1,10 +1,7 @@
<directory name="parallel" rev="288" vrev="1" srcmd5="491309d25a3aab963ac0e24d8eaa9d06"> <directory name="parallel" rev="289" vrev="2" srcmd5="f2fd10de667323622518e3653fe1a05b">
<entry name="PKGBUILD" md5="983b2b5948aeba85c5cd4e1ded5bc76a" size="1442" mtime="1595451728" /> <entry name="PKGBUILD" md5="e6ac64e8d3065f4be850b3568268b42b" size="936" mtime="1595494017" />
<entry name="parallel-20200622.tar.bz2" md5="d23e078dda56fa4a601cce888bf550e0" size="2102861" mtime="1595029269" /> <entry name="parallel-20200722.tar.bz2" md5="09c6b0ad719f1beae5622d2e56a1f831" size="2102288" mtime="1595494018" />
<entry name="parallel-20200622.tar.bz2.sig" md5="a579b17a046ebb5684a8b0b4adab6296" size="2080" mtime="1594940468" />
<entry name="parallel-20200722.tar.bz2" md5="ed6aaa413182afd091b08bf922bb986b" size="2101125" mtime="1595451728" />
<entry name="parallel.spec" md5="e2eb4d93448e26b8ebefb7973d998d14" size="4876" mtime="1595451728" /> <entry name="parallel.spec" md5="e2eb4d93448e26b8ebefb7973d998d14" size="4876" mtime="1595451728" />
<entry name="parallel_20200622.tar.gz" md5="e768cdd4a388538dc4ecdf2175a8f3d7" size="2290573" mtime="1594972044" />
<entry name="parallel_20200722.dsc" md5="85208bd8f159a9e475dc21a3adaa082c" size="556" mtime="1595451729" /> <entry name="parallel_20200722.dsc" md5="85208bd8f159a9e475dc21a3adaa082c" size="556" mtime="1595451729" />
<entry name="parallel_20200722.tar.gz" md5="2a965430557424f6778592bbd1660fd5" size="2294662" mtime="1595451729" /> <entry name="parallel_20200722.tar.gz" md5="2a965430557424f6778592bbd1660fd5" size="2294662" mtime="1595451729" />
</directory> </directory>

View file

@ -23,7 +23,7 @@
use strict; use strict;
use Getopt::Long; use Getopt::Long;
$Global::progname="niceload"; $Global::progname="niceload";
$Global::version = 20200722; $Global::version = 20200723;
Getopt::Long::Configure("bundling","require_order"); Getopt::Long::Configure("bundling","require_order");
get_options_from_array(\@ARGV) || die_usage(); get_options_from_array(\@ARGV) || die_usage();
if($opt::version) { if($opt::version) {

View file

@ -1618,6 +1618,7 @@ sub options_hash() {
"halt-on-error|halt=s" => \$opt::halt, "halt-on-error|halt=s" => \$opt::halt,
"limit=s" => \$opt::limit, "limit=s" => \$opt::limit,
"memfree=s" => \$opt::memfree, "memfree=s" => \$opt::memfree,
"memsuspend=s" => \$opt::memsuspend,
"retries=s" => \$opt::retries, "retries=s" => \$opt::retries,
"timeout=s" => \$opt::timeout, "timeout=s" => \$opt::timeout,
"termseq|term-seq=s" => \$opt::termseq, "termseq|term-seq=s" => \$opt::termseq,
@ -1838,6 +1839,8 @@ sub parse_options(@) {
warning("--blocksize >= 64K causes problems on Cygwin."); warning("--blocksize >= 64K causes problems on Cygwin.");
} }
$opt::memfree = multiply_binary_prefix($opt::memfree); $opt::memfree = multiply_binary_prefix($opt::memfree);
$opt::memsuspend = multiply_binary_prefix($opt::memsuspend);
$Global::memlimit = $opt::memsuspend + $opt::memfree;
check_invalid_option_combinations(); check_invalid_option_combinations();
if((defined $opt::fifo or defined $opt::cat) if((defined $opt::fifo or defined $opt::cat)
and not $opt::pipepart) { and not $opt::pipepart) {
@ -2157,7 +2160,7 @@ sub check_invalid_option_combinations() {
sub init_globals() { sub init_globals() {
# Defaults: # Defaults:
$Global::version = 20200722; $Global::version = 20200623;
$Global::progname = 'parallel'; $Global::progname = 'parallel';
$::name = "GNU Parallel"; $::name = "GNU Parallel";
$Global::infinity = 2**31; $Global::infinity = 2**31;
@ -3343,7 +3346,9 @@ sub init_run_jobs() {
# Over limit # Over limit
next; next;
} }
if($opt::memfree and $sshlogin->memfree() < $opt::memfree) { if(($opt::memfree or $opt::memsuspend)
and
$sshlogin->memfree() < $Global::memlimit) {
# The server has not enough mem free # The server has not enough mem free
::debug("mem", "Not starting job: not enough mem\n"); ::debug("mem", "Not starting job: not enough mem\n");
next; next;
@ -3835,7 +3840,8 @@ sub progress() {
$last_column_time = time; $last_column_time = time;
$columns = $ENV{'COLUMNS'}; $columns = $ENV{'COLUMNS'};
if(not $columns) { if(not $columns) {
my $stty = ::qqx("stty -a </dev/tty"); # && true is to force spawning a shell and not just exec'ing
my $stty = qx{stty -a </dev/tty 2>/dev/null && true};
# FreeBSD/OpenBSD/NetBSD/Dragonfly/MirOS # FreeBSD/OpenBSD/NetBSD/Dragonfly/MirOS
# MacOSX/IRIX/AIX/Tru64 # MacOSX/IRIX/AIX/Tru64
$stty =~ /(\d+) columns/ and do { $columns = $1; }; $stty =~ /(\d+) columns/ and do { $columns = $1; };
@ -3847,7 +3853,8 @@ sub progress() {
$stty =~ /rows=\d+,(\d+)/ and do { $columns = $1; }; $stty =~ /rows=\d+,(\d+)/ and do { $columns = $1; };
} }
if(not $columns) { if(not $columns) {
my $resize = ::qqx("resize"); # && true is to force spawning a shell and not just exec'ing
my $resize = qx{resize 2>/dev/null && true};
$resize =~ /COLUMNS=(\d+);/ and do { $columns = $1; }; $resize =~ /COLUMNS=(\d+);/ and do { $columns = $1; };
} }
$columns ||= 80; $columns ||= 80;
@ -4519,6 +4526,7 @@ sub onall($@) {
my $options = my $options =
join(" ", join(" ",
((defined $opt::memfree) ? "--memfree ".$opt::memfree : ""), ((defined $opt::memfree) ? "--memfree ".$opt::memfree : ""),
((defined $opt::memsuspend) ? "--memfree ".$opt::memsuspend : ""),
((defined $opt::D) ? "-D $opt::D" : ""), ((defined $opt::D) ? "-D $opt::D" : ""),
((defined $opt::group) ? "-g" : ""), ((defined $opt::group) ? "-g" : ""),
((defined $opt::jobs) ? "-P $opt::jobs" : ""), ((defined $opt::jobs) ? "-P $opt::jobs" : ""),
@ -4800,8 +4808,12 @@ sub kill_sleep_seq(@) {
# Convert pids to process groups ($processgroup = -$pid) # Convert pids to process groups ($processgroup = -$pid)
my @pgrps = map { -$_ } @_; my @pgrps = map { -$_ } @_;
my @term_seq = split/,/,$opt::termseq; my @term_seq = split/,/,$opt::termseq;
if(not @term_seq) { if($opt::memsuspend) {
@term_seq = ("TERM",200,"TERM",100,"TERM",50,"KILL",25); @term_seq = ("STOP",1);
} else {
if(not @term_seq) {
@term_seq = ("TERM",200,"TERM",100,"TERM",50,"KILL",25);
}
} }
while(@term_seq) { while(@term_seq) {
@pgrps = kill_sleep(shift @term_seq, shift @term_seq, @pgrps); @pgrps = kill_sleep(shift @term_seq, shift @term_seq, @pgrps);
@ -4907,8 +4919,8 @@ sub usage() {
"If you use programs that use GNU Parallel to process data for an article in a", "If you use programs that use GNU Parallel to process data for an article in a",
"scientific publication, please cite:", "scientific publication, please cite:",
"", "",
" Tange, O. (2020, July 22). GNU Parallel 20200722 ('Privacy Shield').", " Tange, O. (2020, June 22). GNU Parallel 20200622 ('Floyd').",
" Zenodo. https://doi.org/10.5281/zenodo.3956817", " Zenodo. https://doi.org/10.5281/zenodo.3903853",
"", "",
# Before changing this line, please read # Before changing this line, please read
# https://www.gnu.org/software/parallel/parallel_design.html#Citation-notice # https://www.gnu.org/software/parallel/parallel_design.html#Citation-notice
@ -4938,8 +4950,8 @@ sub citation_notice() {
"If you use programs that use GNU Parallel to process data for an article in a", "If you use programs that use GNU Parallel to process data for an article in a",
"scientific publication, please cite:", "scientific publication, please cite:",
"", "",
" Tange, O. (2020, July 22). GNU Parallel 20200722 ('Privacy Shield').", " Tange, O. (2020, June 22). GNU Parallel 20200622 ('Floyd').",
" Zenodo. https://doi.org/10.5281/zenodo.3956817", " Zenodo. https://doi.org/10.5281/zenodo.3903853",
"", "",
# Before changing this line, please read # Before changing this line, please read
# https://www.gnu.org/software/parallel/parallel_design.html#Citation-notice and # https://www.gnu.org/software/parallel/parallel_design.html#Citation-notice and
@ -5052,20 +5064,20 @@ sub citation() {
"If you use programs that use GNU Parallel to process data for an article in a", "If you use programs that use GNU Parallel to process data for an article in a",
"scientific publication, please cite:", "scientific publication, please cite:",
"", "",
"\@software{tange_2020_3956817,", "\@software{tange_2020_3903853,",
" author = {Tange, Ole},", " author = {Tange, Ole},",
" title = {GNU Parallel 20200722 ('Privacy Shield')},", " title = {GNU Parallel 20200622 ('Floyd')},",
" month = Jul,", " month = Jun,",
" year = 2020,", " year = 2020,",
" note = {{GNU Parallel is a general parallelizer to run", " note = {{GNU Parallel is a general parallelizer to run",
" multiple serial command line programs in parallel", " multiple serial command line programs in parallel",
" without changing them.}},", " without changing them.}},",
" publisher = {Zenodo},", " publisher = {Zenodo},",
" doi = {10.5281/zenodo.3956817},", " doi = {10.5281/zenodo.3903853},",
" url = {https://doi.org/10.5281/zenodo.3956817}", " url = {https://doi.org/10.5281/zenodo.3903853}",
"}", "}",
"", "",
"(Feel free to use \\nocite{tange_2020_3956817})", "(Feel free to use \\nocite{tange_2020_3903853})",
"", "",
# Before changing this line, please read # Before changing this line, please read
# https://www.gnu.org/software/parallel/parallel_design.html#Citation-notice and # https://www.gnu.org/software/parallel/parallel_design.html#Citation-notice and
@ -5327,7 +5339,7 @@ sub qqx(@) {
# ssh with ssh-agent needs PATH SSH_AUTH_SOCK SSH_AGENT_PID # ssh with ssh-agent needs PATH SSH_AUTH_SOCK SSH_AGENT_PID
# ssh with Kerberos needs KRB5CCNAME # ssh with Kerberos needs KRB5CCNAME
# tmux needs LC_CTYPE # tmux needs LC_CTYPE
# lsh needs LOGNAME HOME # lsh needs HOME LOGNAME
my @keep = qw(PATH SSH_AUTH_SOCK SSH_AGENT_PID KRB5CCNAME LC_CTYPE HOME LOGNAME); my @keep = qw(PATH SSH_AUTH_SOCK SSH_AGENT_PID KRB5CCNAME LC_CTYPE HOME LOGNAME);
@env{@keep} = @ENV{@keep}; @env{@keep} = @ENV{@keep};
local %ENV; local %ENV;
@ -5336,10 +5348,29 @@ sub qqx(@) {
# && true is to force spawning a shell and not just exec'ing # && true is to force spawning a shell and not just exec'ing
return qx{ @_ && true }; return qx{ @_ && true };
} else { } else {
local *STDERR; # CygWin does not respect 2>/dev/null
open(STDERR, ">", "/dev/null"); # so we do that by hand
# && true is to force spawning a shell and not just exec'ing # This trick does not work:
return qx{ @_ && true }; # https://stackoverflow.com/questions/13833088/why-doesnt-local-work-on-stderr-and-stdout
# local *STDERR;
# open(STDERR, ">", "/dev/null");
open(local *CHILD_STDIN, '<', '/dev/null') or die $!;
open(local *CHILD_STDERR, '>', '/dev/null') or die $!;
my $out;
# eval is needed if open3 fails (e.g. command line too long)
eval {
my $pid = open3(
'<&CHILD_STDIN',
$out,
'>&CHILD_STDERR',
# && true is to force spawning a shell and not just exec'ing
"@_ && true");
my @arr = <$out>;
close $out;
# Make sure $? is set
waitpid($pid, 0);
return wantarray ? @arr : join "",@arr;
}
} }
} }
@ -5846,7 +5877,10 @@ sub reap_usleep() {
$Global::timeoutq->process_timeouts(); $Global::timeoutq->process_timeouts();
} }
if($opt::memfree) { if($opt::memfree) {
kill_youngster_if_not_enough_mem(); kill_youngster_if_not_enough_mem($opt::memfree*0.5);
}
if($opt::memsuspend) {
kill_youngster_if_not_enough_mem($opt::memsuspend*0.5);
} }
if($opt::limit) { if($opt::limit) {
kill_youngest_if_over_limit(); kill_youngest_if_over_limit();
@ -5917,6 +5951,7 @@ sub kill_youngster_if_not_enough_mem() {
# Put the child back in the queue. # Put the child back in the queue.
# Uses: # Uses:
# %Global::running # %Global::running
my $limit = shift;
my %jobs_of; my %jobs_of;
my @sshlogins; my @sshlogins;
@ -5928,12 +5963,12 @@ sub kill_youngster_if_not_enough_mem() {
} }
for my $sshlogin (@sshlogins) { for my $sshlogin (@sshlogins) {
for my $job (sort { $b->seq() <=> $a->seq() } @{$jobs_of{$sshlogin}}) { for my $job (sort { $b->seq() <=> $a->seq() } @{$jobs_of{$sshlogin}}) {
if($sshlogin->memfree() < $opt::memfree * 0.5) { if($sshlogin->memfree() < $limit) {
::debug("mem","\n",map { $_->seq()." " } ::debug("mem","\n",map { $_->seq()." " }
(sort { $b->seq() <=> $a->seq() } (sort { $b->seq() <=> $a->seq() }
@{$jobs_of{$sshlogin}})); @{$jobs_of{$sshlogin}}));
::debug("mem","\n", $job->seq(), "killed ", ::debug("mem","\n", $job->seq(), "killed ",
$sshlogin->memfree()," < ",$opt::memfree * 0.5); $sshlogin->memfree()," < ",$limit);
$job->kill(); $job->kill();
$sshlogin->memfree_recompute(); $sshlogin->memfree_recompute();
} else { } else {
@ -5941,7 +5976,7 @@ sub kill_youngster_if_not_enough_mem() {
} }
} }
::debug("mem","Free mem OK ", ::debug("mem","Free mem OK ",
$sshlogin->memfree()," > ",$opt::memfree * 0.5); $sshlogin->memfree()," > ",$limit);
} }
} }
@ -8498,6 +8533,21 @@ sub kill($) {
my $self = shift; my $self = shift;
$self->set_exitstatus(-1); $self->set_exitstatus(-1);
::kill_sleep_seq($self->pid()); ::kill_sleep_seq($self->pid());
# push job onto start stack
if($opt::memsuspend) {
$self->{'suspended'} = 1;
$Global::JobQueue->{'commandlinequeue'}->unget($self);
}
}
sub set_suspended($$) {
my $self = shift;
$self->{'suspended'} = shift;
}
sub suspended($) {
my $self = shift;
return $self->{'suspended'};
} }
sub failed($) { sub failed($) {
@ -9502,6 +9552,11 @@ sub start($) {
} }
my $job = shift; my $job = shift;
if($job->suspended()) {
# Job is kill -STOP'ped: Restart it.
kill "CONT", $job->pid();
return $job;
}
# Get the shell command to be executed (possibly with ssh infront). # Get the shell command to be executed (possibly with ssh infront).
my $command = $job->wrapped(); my $command = $job->wrapped();
my $pid; my $pid;

View file

@ -481,8 +481,8 @@ completed, estimated seconds left, and number of jobs started.
It is compatible with B<zenity>: It is compatible with B<zenity>:
seq 1000 | parallel -j30 --bar '(echo {};sleep 0.1)' \ seq 1000 | parallel -j30 --bar '(echo {};sleep 0.1)' \
2> >(zenity --progress --auto-kill) | wc 2> >(perl -pe 'BEGIN{$/="\r";$|=1};s/\r/\n/g' |
zenity --progress --auto-kill) | wc
=item B<--basefile> I<file> =item B<--basefile> I<file>

View file

@ -1489,7 +1489,8 @@ A progress bar can be shown with B<--bar>:
And a graphic bar can be shown with B<--bar> and B<zenity>: And a graphic bar can be shown with B<--bar> and B<zenity>:
seq 1000 | parallel -j10 --bar '(echo -n {};sleep 0.1)' \ seq 1000 | parallel -j10 --bar '(echo -n {};sleep 0.1)' \
2> >(zenity --progress --auto-kill --auto-close) 2> >(perl -pe 'BEGIN{$/="\r";$|=1};s/\r/\n/g' |
zenity --progress --auto-kill --auto-close)
A logfile of the jobs completed so far can be generated with B<--joblog>: A logfile of the jobs completed so far can be generated with B<--joblog>:

View file

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

View file

@ -65,7 +65,7 @@ portable:
time bash Portable.sh time bash Portable.sh
### Prerequisites ### Prerequisites
prereqlocal: installparallel prereqlocal: installparallel startvm
tcsh -c echo tcsh installed || (echo tcsh is required for testsuite; /bin/false) tcsh -c echo tcsh installed || (echo tcsh is required for testsuite; /bin/false)
seq 1 2 >/dev/null || (echo seq is required for testsuite; /bin/false) seq 1 2 >/dev/null || (echo seq is required for testsuite; /bin/false)
stdout echo || (echo stdout is required for testsuite; /bin/false) stdout echo || (echo stdout is required for testsuite; /bin/false)
@ -81,26 +81,21 @@ prereqlocal: installparallel
which lsh || (echo lsh is required for testsuite; /bin/false) which lsh || (echo lsh is required for testsuite; /bin/false)
timeout 20 ssh sh@lo true || (echo ssh sh@lo is required for testsuite; /bin/false) timeout 20 ssh sh@lo true || (echo ssh sh@lo is required for testsuite; /bin/false)
timeout 5 ssh csh@lo true || (echo ssh csh@lo is required for testsuite; /bin/false) timeout 5 ssh csh@lo true || (echo ssh csh@lo is required for testsuite; /bin/false)
parallel -j1 ssh-keygen -R parallel-server{} ::: 1 2 3 || true
parallel 'ssh vagrant@parallel-server{} mkdir -p bin; scp `which parallel` vagrant@parallel-server{}:bin/' ::: 1 2 3 4
prereqremote: installparallel startvm prereqremote: installparallel startvm
parallel -j0 --timeout 10 --tag ssh parallel@parallel-server{} parallel --minversion 20121021 ::: 1 2 || (echo parallel on remote required for testsuite; /bin/true) parallel -j0 --timeout 10 --tag ssh vagrant@parallel-server{} parallel --minversion 20121021 ::: 1 2 || (echo parallel on remote required for testsuite; /bin/true)
startvm: startvm:
# Make sure we can reach the virtual machines parallel 'cd vagrant/generic/{} && vagrant up' ::: centos8 freebsd11 freebsd12 rhel8
#sudo ifconfig wlp13s0:0 192.168.1.72 || sudo ifconfig wlan0:0 192.168.1.72
sudo ifconfig enp14s0:0 192.168.1.72 || sudo ifconfig eth0:0 192.168.1.72
# If they are already running: Don't fail
VBoxManage startvm CentOS3-root:centos3\ Clone2 || VBoxManage controlvm CentOS3-root:centos3\ Clone2 resume || true
VBoxManage startvm RedHat9-root:redhat9 || VBoxManage controlvm RedHat9-root:redhat9 resume || true
parallel 'ping {} | read' ::: redhat9.tange.dk centos3.tange.dk
stopvm: stopvm:
# || true - because this should not fail if the VM is not running parallel 'cd vagrant/generic/{} && vagrant suspend' ::: centos8 freebsd11 freebsd12 rhel8
VBoxManage controlvm CentOS3-root:centos3 savestate || true
VBoxManage controlvm RedHat9-root:redhat9 savestate || true
VBoxManage controlvm OracleXE savestate || true
startdb: startdb:
true should start Oracle in vagrant
startdb-old:
#echo shutdown abort | sudo su - oracle -c "sqlplus / as sysdba" #echo shutdown abort | sudo su - oracle -c "sqlplus / as sysdba"
sudo parallel /etc/init.d/{} status '||' /etc/init.d/{} restart ::: postgresql mysql # oracle-xe sudo parallel /etc/init.d/{} status '||' /etc/init.d/{} restart ::: postgresql mysql # oracle-xe
VBoxManage startvm OracleXE || true VBoxManage startvm OracleXE || true

View file

@ -3,11 +3,15 @@
echo "### These tests requires VirtualBox running with the following images" echo "### These tests requires VirtualBox running with the following images"
echo `whoami`"@freebsd7" echo `whoami`"@freebsd7"
VBoxManage startvm FreeBSD71 >/dev/null 2>&1 SERVER1=freebsd11
ping -c 1 freebsd7.tange.dk >/dev/null 2>&1 SSHUSER1=vagrant
SSHLOGIN1=$SSHUSER1@$SERVER1
ssh freebsd7.tange.dk touch .parallel/will-cite #VBoxManage startvm FreeBSD71 >/dev/null 2>&1
scp -q .*/src/{parallel,sem,sql,niceload,env_parallel*} freebsd7.tange.dk:bin/ #ping -c 1 freebsd7.tange.dk >/dev/null 2>&1
ssh $SSHLOGIN1 touch .parallel/will-cite
scp -q .*/src/{parallel,sem,sql,niceload,env_parallel*} $SSHLOGIN1:bin/
. `which env_parallel.bash` . `which env_parallel.bash`
env_parallel --session env_parallel --session
@ -49,13 +53,13 @@ par_shebang() {
chmod 755 ./shebang; ./shebang chmod 755 ./shebang; ./shebang
echo 'bug #40134: FreeBSD: --shebang(-wrap) not working' echo 'bug #40134: FreeBSD: --shebang(-wrap) not working'
(echo '#!/usr/bin/env -S parallel --shebang-wrap /usr/bin/perl :::'; (echo '#!/usr/bin/env -S parallel --shebang-wrap /usr/local/bin/perl :::';
echo 'print @ARGV,"\n";') > shebang-wrap echo 'print @ARGV,"\n";') > shebang-wrap
chmod 755 ./shebang-wrap chmod 755 ./shebang-wrap
./shebang-wrap wrap works | sort -r ./shebang-wrap wrap works | sort -r
echo 'bug #40134: FreeBSD: --shebang(-wrap) with options not working' echo 'bug #40134: FreeBSD: --shebang(-wrap) with options not working'
(echo '#!/usr/bin/env -S parallel --shebang-wrap -v -k -j 0 /usr/bin/perl -w :::' (echo '#!/usr/bin/env -S parallel --shebang-wrap -v -k -j 0 /usr/local/bin/perl -w :::'
echo 'print @ARGV,"\n";') > shebang-wrap-opt; echo 'print @ARGV,"\n";') > shebang-wrap-opt;
chmod 755 ./shebang-wrap-opt chmod 755 ./shebang-wrap-opt
./shebang-wrap-opt wrap works with options ./shebang-wrap-opt wrap works with options
@ -108,8 +112,8 @@ unset TMPDIR
# We can safely ignore those. # We can safely ignore those.
PARALLEL_SHELL=sh env_parallel --env _ -vj9 -k --joblog /tmp/jl-`basename $0` --retries 3 \ PARALLEL_SHELL=sh env_parallel --env _ -vj9 -k --joblog /tmp/jl-`basename $0` --retries 3 \
-S freebsd7.tange.dk --tag '{} 2>&1' \ -S $SSHLOGIN1 --tag '{} 2>&1' \
::: $(compgen -A function | grep par_ | sort) \ ::: $(compgen -A function | grep par_ | sort) \
2> >(grep -Ev 'shopt: not found|declare: not found') 2> >(grep -Ev 'shopt: not found|declare: not found')
VBoxManage controlvm FreeBSD71 savestate #VBoxManage controlvm FreeBSD71 savestate

View file

@ -16,7 +16,7 @@ par_bin() {
paste <(seq 10) <(seq 10 -1 1) | paste <(seq 10) <(seq 10 -1 1) |
parallel --pipe --colsep '\t' --bin '2 $_%=2' -j4 wc | sort parallel --pipe --colsep '\t' --bin '2 $_%=2' -j4 wc | sort
# Fails - blocks! # Fails - blocks!
# paste <(seq 10000000) <(seq 10000000 -1 1) | parallel --pipe --colsep '\t' --bin 2 wc # paste <(seq 10) <(seq 10 -1 1) | parallel --pipe --colsep '\t' --bin 2 wc
} }
par_nice() { par_nice() {
@ -103,10 +103,10 @@ par_colsep() {
parallel -k --colsep %+ echo {1} {3} {2} {4} ::: a%c%%b a%c%b%d parallel -k --colsep %+ echo {1} {3} {2} {4} ::: a%c%%b a%c%b%d
(echo 'a% c %%b'; echo a%c% b %d) | parallel -k --colsep %+ echo {1} {3} {2} {4} (echo 'a% c %%b'; echo a%c% b %d) | parallel -k --colsep %+ echo {1} {3} {2} {4}
(echo 'a% c %%b'; echo a%c% b %d) | parallel -k --colsep %+ echo '"{1}_{3}_{2}_{4}"' (echo 'a% c %%b'; echo a%c% b %d) | parallel -k --colsep %+ echo '"{1}_{3}_{2}_{4}"'
echo '### Test of -C' echo '### Test of -C'
(echo 'a% c %%b'; echo a%c% b %d) | parallel -k -C %+ echo '"{1}_{3}_{2}_{4}"' (echo 'a% c %%b'; echo a%c% b %d) | parallel -k -C %+ echo '"{1}_{3}_{2}_{4}"'
echo '### Test of --trim n' echo '### Test of --trim n'
(echo 'a% c %%b'; echo a%c% b %d) | parallel -k --trim n --colsep %+ echo '"{1}_{3}_{2}_{4}"' (echo 'a% c %%b'; echo a%c% b %d) | parallel -k --trim n --colsep %+ echo '"{1}_{3}_{2}_{4}"'
parallel -k -C %+ echo '"{1}_{3}_{2}_{4}"' ::: 'a% c %%b' 'a%c% b %d' parallel -k -C %+ echo '"{1}_{3}_{2}_{4}"' ::: 'a% c %%b' 'a%c% b %d'
@ -276,66 +276,77 @@ par_END() {
par_xargs_compat() { par_xargs_compat() {
echo xargs compatibility echo xargs compatibility
a_b-c() { echo a_b; echo c; }
a_b_-c-d() { echo a_b' '; echo c; echo d; }
a_b_-c-d-e() { echo a_b' '; echo c; echo d; echo e; }
one_mb_line() { perl -e 'print "z"x1000000'; }
stdsort() { "$@" | LC_ALL=C sort; }
echo '### Test -L -l and --max-lines' echo '### Test -L -l and --max-lines'
(echo a_b;echo c) | parallel -km -L2 echo a_b-c | parallel -km -L2 echo
(echo a_b;echo c) | parallel -k -L2 echo a_b-c | parallel -k -L2 echo
(echo a_b;echo c) | xargs -L2 echo a_b-c | xargs -L2 echo
echo '### xargs -L1 echo' echo '### xargs -L1 echo'
(echo a_b;echo c) | parallel -km -L1 echo a_b-c | parallel -km -L1 echo
(echo a_b;echo c) | parallel -k -L1 echo a_b-c | parallel -k -L1 echo
(echo a_b;echo c) | xargs -L1 echo a_b-c | xargs -L1 echo
echo 'Lines ending in space should continue on next line' echo 'Lines ending in space should continue on next line'
echo '### xargs -L1 echo' echo '### xargs -L1 echo'
(echo a_b' ';echo c;echo d) | parallel -km -L1 echo a_b_-c-d | parallel -km -L1 echo
(echo a_b' ';echo c;echo d) | parallel -k -L1 echo a_b_-c-d | parallel -k -L1 echo
(echo a_b' ';echo c;echo d) | xargs -L1 echo a_b_-c-d | xargs -L1 echo
echo '### xargs -L2 echo' echo '### xargs -L2 echo'
(echo a_b' ';echo c;echo d;echo e) | parallel -km -L2 echo a_b_-c-d-e | parallel -km -L2 echo
(echo a_b' ';echo c;echo d;echo e) | parallel -k -L2 echo a_b_-c-d-e | parallel -k -L2 echo
(echo a_b' ';echo c;echo d;echo e) | xargs -L2 echo a_b_-c-d-e | xargs -L2 echo
echo '### xargs -l echo' echo '### xargs -l echo'
(echo a_b' ';echo c;echo d;echo e) | parallel -l -km echo # This behaves wrong a_b_-c-d-e | parallel -l -km echo # This behaves wrong
(echo a_b' ';echo c;echo d;echo e) | parallel -l -k echo # This behaves wrong a_b_-c-d-e | parallel -l -k echo # This behaves wrong
(echo a_b' ';echo c;echo d;echo e) | xargs -l echo a_b_-c-d-e | xargs -l echo
echo '### xargs -l2 echo' echo '### xargs -l2 echo'
(echo a_b' ';echo c;echo d;echo e) | parallel -km -l2 echo a_b_-c-d-e | parallel -km -l2 echo
(echo a_b' ';echo c;echo d;echo e) | parallel -k -l2 echo a_b_-c-d-e | parallel -k -l2 echo
(echo a_b' ';echo c;echo d;echo e) | xargs -l2 echo a_b_-c-d-e | xargs -l2 echo
echo '### xargs -l1 echo' echo '### xargs -l1 echo'
(echo a_b' ';echo c;echo d;echo e) | parallel -km -l1 echo a_b_-c-d-e | parallel -km -l1 echo
(echo a_b' ';echo c;echo d;echo e) | parallel -k -l1 echo a_b_-c-d-e | parallel -k -l1 echo
(echo a_b' ';echo c;echo d;echo e) | xargs -l1 echo a_b_-c-d-e | xargs -l1 echo
echo '### xargs --max-lines=2 echo' echo '### xargs --max-lines=2 echo'
(echo a_b' ';echo c;echo d;echo e) | parallel -km --max-lines 2 echo a_b_-c-d-e | parallel -km --max-lines 2 echo
(echo a_b' ';echo c;echo d;echo e) | parallel -k --max-lines 2 echo a_b_-c-d-e | parallel -k --max-lines 2 echo
(echo a_b' ';echo c;echo d;echo e) | xargs --max-lines=2 echo a_b_-c-d-e | xargs --max-lines=2 echo
echo '### xargs --max-lines echo' echo '### xargs --max-lines echo'
(echo a_b' ';echo c;echo d;echo e) | parallel --max-lines -km echo # This behaves wrong a_b_-c-d-e | parallel --max-lines -km echo # This behaves wrong
(echo a_b' ';echo c;echo d;echo e) | parallel --max-lines -k echo # This behaves wrong a_b_-c-d-e | parallel --max-lines -k echo # This behaves wrong
(echo a_b' ';echo c;echo d;echo e) | xargs --max-lines echo a_b_-c-d-e | xargs --max-lines echo
echo '### test too long args' echo '### test too long args'
perl -e 'print "z"x1000000' | parallel echo 2>&1 one_mb_line | parallel echo 2>&1
perl -e 'print "z"x1000000' | xargs echo 2>&1 one_mb_line | xargs echo 2>&1
(seq 1 10; perl -e 'print "z"x1000000'; seq 12 15) | stdsort parallel -j1 -km -s 10 echo (seq 1 10; one_mb_line; seq 12 15) | stdsort parallel -j1 -km -s 10 echo
(seq 1 10; perl -e 'print "z"x1000000'; seq 12 15) | stdsort xargs -s 10 echo (seq 1 10; one_mb_line; seq 12 15) | stdsort xargs -s 10 echo
(seq 1 10; perl -e 'print "z"x1000000'; seq 12 15) | stdsort parallel -j1 -kX -s 10 echo (seq 1 10; one_mb_line; seq 12 15) | stdsort parallel -j1 -kX -s 10 echo
echo '### Test -x' echo '### Test -x'
echo '-km'
(seq 1 10; echo 12345; seq 12 15) | stdsort parallel -j1 -km -s 10 -x echo (seq 1 10; echo 12345; seq 12 15) | stdsort parallel -j1 -km -s 10 -x echo
echo '-kX'
(seq 1 10; echo 12345; seq 12 15) | stdsort parallel -j1 -kX -s 10 -x echo (seq 1 10; echo 12345; seq 12 15) | stdsort parallel -j1 -kX -s 10 -x echo
echo '-x'
(seq 1 10; echo 12345; seq 12 15) | stdsort xargs -s 10 -x echo (seq 1 10; echo 12345; seq 12 15) | stdsort xargs -s 10 -x echo
echo '-km -x'
(seq 1 10; echo 1234; seq 12 15) | stdsort parallel -j1 -km -s 10 -x echo (seq 1 10; echo 1234; seq 12 15) | stdsort parallel -j1 -km -s 10 -x echo
echo '-kX -x'
(seq 1 10; echo 1234; seq 12 15) | stdsort parallel -j1 -kX -s 10 -x echo (seq 1 10; echo 1234; seq 12 15) | stdsort parallel -j1 -kX -s 10 -x echo
echo '-x'
(seq 1 10; echo 1234; seq 12 15) | stdsort xargs -s 10 -x echo (seq 1 10; echo 1234; seq 12 15) | stdsort xargs -s 10 -x echo
} }
@ -534,6 +545,7 @@ par_retries_all_fail() {
par_sockets_cores_threads() { par_sockets_cores_threads() {
echo '### Test --number-of-sockets/cores/threads' echo '### Test --number-of-sockets/cores/threads'
unset PARALLEL_CPUINFO
parallel --number-of-sockets parallel --number-of-sockets
parallel --number-of-cores parallel --number-of-cores
parallel --number-of-threads parallel --number-of-threads
@ -593,6 +605,8 @@ export -f $(compgen -A function | grep par_)
compgen -A function | grep par_ | LC_ALL=C sort | compgen -A function | grep par_ | LC_ALL=C sort |
parallel --timeout 1000% -j10 --tag -k --joblog /tmp/jl-`basename $0` '{} 2>&1' | parallel --timeout 1000% -j10 --tag -k --joblog /tmp/jl-`basename $0` '{} 2>&1' |
perl -pe 's/,31,0/,15,0/' | perl -pe 's/,31,0/,15,0/' |
perl -pe 's:~:'$HOME':' | perl -pe 's/131\d\d\d/131XXX/' |
perl -pe 's:'$PWD':.:' | # Replace $PWD with . even if given as ~/...
perl -pe 's:'$HOME':~:' perl -pe 's:~:'$HOME':g' |
perl -pe 's:'$PWD':.:g' |
perl -pe 's:'$HOME':~:g'

View file

@ -146,8 +146,11 @@ par_groupby() {
par_groupby_pipepart() { par_groupby_pipepart() {
tsv() { tsv() {
printf "%s\t" a1 b1 c1 d1 e1 f1; echo # TSV file
printf "%s\t" header_a1 head_b1 c1 d1 e1 f1; echo
# Make 6 columns: 123456 => 1\t2\t3\t4\t5\t6
seq 100000 999999 | perl -pe '$_=join"\t",split//' | seq 100000 999999 | perl -pe '$_=join"\t",split//' |
# Sort reverse on column 3 (This should group on col 3)
sort --parallel=8 --buffer-size=50% -rk3 sort --parallel=8 --buffer-size=50% -rk3
} }
export -f tsv export -f tsv
@ -178,7 +181,8 @@ par_groupby_pipepart() {
echo "### test $generator | --colsep $colsep --groupby $groupby" echo "### test $generator | --colsep $colsep --groupby $groupby"
$generator > $tmp $generator > $tmp
parallel --pipepart -a $tmp --colsep "$colsep" --groupby "$groupby" -k 'echo NewRec; wc' parallel --header 1 --pipepart -k \
-a $tmp --colsep "$colsep" --groupby "$groupby" 'echo NewRec; wc'
} }
export -f tester export -f tester
parallel --tag -k tester \ parallel --tag -k tester \
@ -213,7 +217,7 @@ par_memory_leak() {
} }
export -f a_run export -f a_run
echo "### Test for memory leaks" echo "### Test for memory leaks"
echo "Of 100 runs of 1 job none should be bigger than a 3000 job run" echo "Of 100 runs of 1 job at least one should be bigger than a 3000 job run"
. `which env_parallel.bash` . `which env_parallel.bash`
parset small_max,big ::: 'seq 100 | parallel a_run 1 | jq -s max' 'a_run 3000' parset small_max,big ::: 'seq 100 | parallel a_run 1 | jq -s max' 'a_run 3000'
if [ $small_max -lt $big ] ; then if [ $small_max -lt $big ] ; then

View file

@ -4,15 +4,17 @@
par_autossh() { par_autossh() {
echo '### --ssh autossh' echo '### --ssh autossh'
export PARALLEL_SSH=autossh; export AUTOSSH_PORT=0 (
parallel -S lo echo ::: OK export PARALLEL_SSH=autossh; export AUTOSSH_PORT=0
echo OK | parallel --pipe -S lo cat stdout parallel -S lo echo ::: OK
parallel -S lo false ::: a || echo OK should fail echo OK | stdout parallel --pipe -S lo cat
echo '### --ssh autossh - add commands that fail here' stdout parallel -S lo false ::: a || echo OK should fail
touch foo_autossh echo '### --ssh autossh - add commands that fail here'
stdout parallel -S csh@lo --trc {}.out touch {}.out ::: foo_autossh touch foo_autossh
ls foo_autossh* stdout parallel -S csh@lo --trc {}.out touch {}.out ::: foo_autossh
rm foo_autossh* ls foo_autossh*
rm foo_autossh*
) | grep -Ev 'Warning: remote port forwarding failed for listen'
} }
par_basefile_cleanup() { par_basefile_cleanup() {
@ -76,7 +78,6 @@ par_command_len_shellquote() {
stdout parallel --tag -k outer ::: '-Slo -j10' '' | stdout parallel --tag -k outer ::: '-Slo -j10' '' |
perl -pe 's/131\d\d\d/131xxx/g'; perl -pe 's/131\d\d\d/131xxx/g';
} }
export -f $(compgen -A function | grep par_) export -f $(compgen -A function | grep par_)

View file

@ -1713,22 +1713,21 @@ _EOF
par_bash_environment_too_big() { par_bash_environment_too_big() {
myscript=$(cat <<'_EOF' myscript=$(cat <<'_EOF'
echo 'bug #50815: env_parallel should warn if the environment is too big' echo 'bug #50815: env_parallel should warn if the environment is too big'
len_functions=-$(typeset -f | wc -c)/1000 len_overhead=-$( (shopt;alias;typeset -f;typeset -p) | wc -c)/1000
len_variables=-$(typeset -p | wc -c)/1000 len_var=$len_overhead+108
len_var=$len_variables+110 len_var_remote=$len_overhead+50+25+6-3+1
len_var_remote=$len_variables+100-50+25-12+6 len_var_quote=$len_overhead+50+25-12-6
len_var_quote=$len_variables+100-50 len_var_quote_remote=$len_overhead+50-25+12+6-3
len_var_quote_remote=$len_variables+100-50-25+12 len_fun=$len_overhead+100
len_fun=$len_functions+100 len_fun_remote=$len_overhead+50+25
len_fun_remote=$len_functions+100-50+25-12+6 len_fun_quote=$len_overhead+100
len_fun_quote=$len_functions+100 len_fun_quote_remote=$len_overhead+50+25
len_fun_quote_remote=$len_functions+100-50
. `which env_parallel.bash`; . `which env_parallel.bash`;
repeat() { repeat() {
# Repeat input string n*1000 times # Repeat input string n*1000 times
perl -e 'print ((shift)x(eval "1000*(".shift.")"))' "$@" perl -e 'print ((shift)x(eval "1000*int(".shift.")"))' "$@"
} }
bigvar=$(repeat x $len_var) bigvar=$(repeat x $len_var)
@ -2816,8 +2815,8 @@ par_dash_env_parallel_session() {
alias level1alias='echo l1alias' alias level1alias='echo l1alias'
echo '### level0 should be hidden, level1 should be transferred' echo '### level0 should be hidden, level1 should be transferred'
env_parallel -Slo 'echo $level0var; level0func; level0alias; echo ${level0arr[*]}' ::: fail env_parallel -Slo 'echo $level0var; level0func; level0alias; echo ${level0arr[*]}' ::: fail 2>&1
env_parallel 'echo $level0var; level0func; level0alias; echo ${level0arr[*]}' ::: fail env_parallel 'echo $level0var; level0func; level0alias; echo ${level0arr[*]}' ::: fail 2>&1
env_parallel -Slo 'echo $level1var; level1func; level1alias; echo ${level1arr[*]}' ::: OK env_parallel -Slo 'echo $level1var; level1func; level1alias; echo ${level1arr[*]}' ::: OK
env_parallel 'echo $level1var; level1func; level1alias; echo ${level1arr[*]}' ::: OK env_parallel 'echo $level1var; level1func; level1alias; echo ${level1arr[*]}' ::: OK
@ -2830,18 +2829,18 @@ par_dash_env_parallel_session() {
alias level2alias='echo l2alias' alias level2alias='echo l2alias'
echo '### level0+1 should be hidden, level2 should be transferred' echo '### level0+1 should be hidden, level2 should be transferred'
env_parallel -Slo 'echo $level0var; level0func; level0alias; echo ${level0arr[*]}' ::: fail env_parallel -Slo 'echo $level0var; level0func; level0alias; echo ${level0arr[*]}' ::: fail 2>&1
env_parallel 'echo $level0var; level0func; level0alias; echo ${level0arr[*]}' ::: fail env_parallel 'echo $level0var; level0func; level0alias; echo ${level0arr[*]}' ::: fail 2>&1
env_parallel -Slo 'echo $level1var; level1func; level1alias; echo ${level1arr[*]}' ::: fail env_parallel -Slo 'echo $level1var; level1func; level1alias; echo ${level1arr[*]}' ::: fail 2>&1
env_parallel 'echo $level1var; level1func; level1alias; echo ${level1arr[*]}' ::: fail env_parallel 'echo $level1var; level1func; level1alias; echo ${level1arr[*]}' ::: fail 2>&1
env_parallel -Slo 'echo $level2var; level2func; level2alias; echo ${level2arr[*]}' ::: OK env_parallel -Slo 'echo $level2var; level2func; level2alias; echo ${level2arr[*]}' ::: OK
env_parallel 'echo $level2var; level2func; level2alias; echo ${level2arr[*]}' ::: OK env_parallel 'echo $level2var; level2func; level2alias; echo ${level2arr[*]}' ::: OK
env_parallel --endsession env_parallel --endsession
echo '### level0 should be hidden, level1+2 should be transferred' echo '### level0 should be hidden, level1+2 should be transferred'
env_parallel -Slo 'echo $level0var; level0func; level0alias; echo ${level0arr[*]}' ::: fail env_parallel -Slo 'echo $level0var; level0func; level0alias; echo ${level0arr[*]}' ::: fail 2>&1
env_parallel 'echo $level0var; level0func; level0alias; echo ${level0arr[*]}' ::: fail env_parallel 'echo $level0var; level0func; level0alias; echo ${level0arr[*]}' ::: fail 2>&1
env_parallel -Slo 'echo $level1var; level1func; level1alias; echo ${level1arr[*]}' ::: OK env_parallel -Slo 'echo $level1var; level1func; level1alias; echo ${level1arr[*]}' ::: OK
env_parallel 'echo $level1var; level1func; level1alias; echo ${level1arr[*]}' ::: OK env_parallel 'echo $level1var; level1func; level1alias; echo ${level1arr[*]}' ::: OK
env_parallel -Slo 'echo $level2var; level2func; level2alias; echo ${level2arr[*]}' ::: OK env_parallel -Slo 'echo $level2var; level2func; level2alias; echo ${level2arr[*]}' ::: OK
@ -3047,8 +3046,8 @@ par_mksh_env_parallel_session() {
alias level1alias='echo l1alias' alias level1alias='echo l1alias'
echo '### level0 should be hidden, level1 should be transferred' echo '### level0 should be hidden, level1 should be transferred'
env_parallel -Slo 'echo $level0var; level0func; level0alias; echo ${level0arr[*]}' ::: fail env_parallel -Slo 'echo $level0var; level0func; level0alias; echo ${level0arr[*]}' ::: fail 2>&1
env_parallel 'echo $level0var; level0func; level0alias; echo ${level0arr[*]}' ::: fail env_parallel 'echo $level0var; level0func; level0alias; echo ${level0arr[*]}' ::: fail 2>&1
env_parallel -Slo 'echo $level1var; level1func; level1alias; echo ${level1arr[*]}' ::: OK env_parallel -Slo 'echo $level1var; level1func; level1alias; echo ${level1arr[*]}' ::: OK
env_parallel 'echo $level1var; level1func; level1alias; echo ${level1arr[*]}' ::: OK env_parallel 'echo $level1var; level1func; level1alias; echo ${level1arr[*]}' ::: OK
@ -3060,18 +3059,18 @@ par_mksh_env_parallel_session() {
alias level2alias='echo l2alias' alias level2alias='echo l2alias'
echo '### level0+1 should be hidden, level2 should be transferred' echo '### level0+1 should be hidden, level2 should be transferred'
env_parallel -Slo 'echo $level0var; level0func; level0alias; echo ${level0arr[*]}' ::: fail env_parallel -Slo 'echo $level0var; level0func; level0alias; echo ${level0arr[*]}' ::: fail 2>&1
env_parallel 'echo $level0var; level0func; level0alias; echo ${level0arr[*]}' ::: fail env_parallel 'echo $level0var; level0func; level0alias; echo ${level0arr[*]}' ::: fail 2>&1
env_parallel -Slo 'echo $level1var; level1func; level1alias; echo ${level1arr[*]}' ::: fail env_parallel -Slo 'echo $level1var; level1func; level1alias; echo ${level1arr[*]}' ::: fail 2>&1
env_parallel 'echo $level1var; level1func; level1alias; echo ${level1arr[*]}' ::: fail env_parallel 'echo $level1var; level1func; level1alias; echo ${level1arr[*]}' ::: fail 2>&1
env_parallel -Slo 'echo $level2var; level2func; level2alias; echo ${level2arr[*]}' ::: OK env_parallel -Slo 'echo $level2var; level2func; level2alias; echo ${level2arr[*]}' ::: OK
env_parallel 'echo $level2var; level2func; level2alias; echo ${level2arr[*]}' ::: OK env_parallel 'echo $level2var; level2func; level2alias; echo ${level2arr[*]}' ::: OK
env_parallel --endsession env_parallel --endsession
echo '### level0 should be hidden, level1+2 should be transferred' echo '### level0 should be hidden, level1+2 should be transferred'
env_parallel -Slo 'echo $level0var; level0func; level0alias; echo ${level0arr[*]}' ::: fail env_parallel -Slo 'echo $level0var; level0func; level0alias; echo ${level0arr[*]}' ::: fail 2>&1
env_parallel 'echo $level0var; level0func; level0alias; echo ${level0arr[*]}' ::: fail env_parallel 'echo $level0var; level0func; level0alias; echo ${level0arr[*]}' ::: fail 2>&1
env_parallel -Slo 'echo $level1var; level1func; level1alias; echo ${level1arr[*]}' ::: OK env_parallel -Slo 'echo $level1var; level1func; level1alias; echo ${level1arr[*]}' ::: OK
env_parallel 'echo $level1var; level1func; level1alias; echo ${level1arr[*]}' ::: OK env_parallel 'echo $level1var; level1func; level1alias; echo ${level1arr[*]}' ::: OK
env_parallel -Slo 'echo $level2var; level2func; level2alias; echo ${level2arr[*]}' ::: OK env_parallel -Slo 'echo $level2var; level2func; level2alias; echo ${level2arr[*]}' ::: OK
@ -3137,8 +3136,8 @@ par_sh_env_parallel_session() {
# alias level1alias='echo l1alias' # alias level1alias='echo l1alias'
echo '### level0 should be hidden, level1 should be transferred' echo '### level0 should be hidden, level1 should be transferred'
env_parallel -Slo 'echo $level0var; level0func; level0alias; echo ${level0arr[*]}' ::: fail env_parallel -Slo 'echo $level0var; level0func; level0alias; echo ${level0arr[*]}' ::: fail 2>&1
env_parallel 'echo $level0var; level0func; level0alias; echo ${level0arr[*]}' ::: fail env_parallel 'echo $level0var; level0func; level0alias; echo ${level0arr[*]}' ::: fail 2>&1
env_parallel -Slo 'echo $level1var; level1func; level1alias; echo ${level1arr[*]}' ::: OK env_parallel -Slo 'echo $level1var; level1func; level1alias; echo ${level1arr[*]}' ::: OK
env_parallel 'echo $level1var; level1func; level1alias; echo ${level1arr[*]}' ::: OK env_parallel 'echo $level1var; level1func; level1alias; echo ${level1arr[*]}' ::: OK
@ -3150,18 +3149,18 @@ par_sh_env_parallel_session() {
# alias level2alias='echo l2alias' # alias level2alias='echo l2alias'
echo '### level0+1 should be hidden, level2 should be transferred' echo '### level0+1 should be hidden, level2 should be transferred'
env_parallel -Slo 'echo $level0var; level0func; level0alias; echo ${level0arr[*]}' ::: fail env_parallel -Slo 'echo $level0var; level0func; level0alias; echo ${level0arr[*]}' ::: fail 2>&1
env_parallel 'echo $level0var; level0func; level0alias; echo ${level0arr[*]}' ::: fail env_parallel 'echo $level0var; level0func; level0alias; echo ${level0arr[*]}' ::: fail 2>&1
env_parallel -Slo 'echo $level1var; level1func; level1alias; echo ${level1arr[*]}' ::: fail env_parallel -Slo 'echo $level1var; level1func; level1alias; echo ${level1arr[*]}' ::: fail 2>&1
env_parallel 'echo $level1var; level1func; level1alias; echo ${level1arr[*]}' ::: fail env_parallel 'echo $level1var; level1func; level1alias; echo ${level1arr[*]}' ::: fail 2>&1
env_parallel -Slo 'echo $level2var; level2func; level2alias; echo ${level2arr[*]}' ::: OK env_parallel -Slo 'echo $level2var; level2func; level2alias; echo ${level2arr[*]}' ::: OK
env_parallel 'echo $level2var; level2func; level2alias; echo ${level2arr[*]}' ::: OK env_parallel 'echo $level2var; level2func; level2alias; echo ${level2arr[*]}' ::: OK
env_parallel --endsession env_parallel --endsession
echo '### level0 should be hidden, level1+2 should be transferred' echo '### level0 should be hidden, level1+2 should be transferred'
env_parallel -Slo 'echo $level0var; level0func; level0alias; echo ${level0arr[*]}' ::: fail env_parallel -Slo 'echo $level0var; level0func; level0alias; echo ${level0arr[*]}' ::: fail 2>&1
env_parallel 'echo $level0var; level0func; level0alias; echo ${level0arr[*]}' ::: fail env_parallel 'echo $level0var; level0func; level0alias; echo ${level0arr[*]}' ::: fail 2>&1
env_parallel -Slo 'echo $level1var; level1func; level1alias; echo ${level1arr[*]}' ::: OK env_parallel -Slo 'echo $level1var; level1func; level1alias; echo ${level1arr[*]}' ::: OK
env_parallel 'echo $level1var; level1func; level1alias; echo ${level1arr[*]}' ::: OK env_parallel 'echo $level1var; level1func; level1alias; echo ${level1arr[*]}' ::: OK
env_parallel -Slo 'echo $level2var; level2func; level2alias; echo ${level2arr[*]}' ::: OK env_parallel -Slo 'echo $level2var; level2func; level2alias; echo ${level2arr[*]}' ::: OK
@ -3236,8 +3235,8 @@ par_zsh_env_parallel_session() {
alias level1alias='echo l1alias' alias level1alias='echo l1alias'
echo '### level0 should be hidden, level1 should be transferred' echo '### level0 should be hidden, level1 should be transferred'
env_parallel -Slo 'echo $level0var; level0func; level0alias; echo ${level0arr[*]}' ::: fail env_parallel -Slo 'echo $level0var; level0func; level0alias; echo ${level0arr[*]}' ::: fail 2>&1
env_parallel 'echo $level0var; level0func; level0alias; echo ${level0arr[*]}' ::: fail env_parallel 'echo $level0var; level0func; level0alias; echo ${level0arr[*]}' ::: fail 2>&1
env_parallel -Slo 'echo $level1var; level1func; level1alias; echo ${level1arr[*]}' ::: OK env_parallel -Slo 'echo $level1var; level1func; level1alias; echo ${level1arr[*]}' ::: OK
env_parallel 'echo $level1var; level1func; level1alias; echo ${level1arr[*]}' ::: OK env_parallel 'echo $level1var; level1func; level1alias; echo ${level1arr[*]}' ::: OK
@ -3249,18 +3248,18 @@ par_zsh_env_parallel_session() {
alias level2alias='echo l2alias' alias level2alias='echo l2alias'
echo '### level0+1 should be hidden, level2 should be transferred' echo '### level0+1 should be hidden, level2 should be transferred'
env_parallel -Slo 'echo $level0var; level0func; level0alias; echo ${level0arr[*]}' ::: fail env_parallel -Slo 'echo $level0var; level0func; level0alias; echo ${level0arr[*]}' ::: fail 2>&1
env_parallel 'echo $level0var; level0func; level0alias; echo ${level0arr[*]}' ::: fail env_parallel 'echo $level0var; level0func; level0alias; echo ${level0arr[*]}' ::: fail 2>&1
env_parallel -Slo 'echo $level1var; level1func; level1alias; echo ${level1arr[*]}' ::: fail env_parallel -Slo 'echo $level1var; level1func; level1alias; echo ${level1arr[*]}' ::: fail 2>&1
env_parallel 'echo $level1var; level1func; level1alias; echo ${level1arr[*]}' ::: fail env_parallel 'echo $level1var; level1func; level1alias; echo ${level1arr[*]}' ::: fail 2>&1
env_parallel -Slo 'echo $level2var; level2func; level2alias; echo ${level2arr[*]}' ::: OK env_parallel -Slo 'echo $level2var; level2func; level2alias; echo ${level2arr[*]}' ::: OK
env_parallel 'echo $level2var; level2func; level2alias; echo ${level2arr[*]}' ::: OK env_parallel 'echo $level2var; level2func; level2alias; echo ${level2arr[*]}' ::: OK
env_parallel --endsession env_parallel --endsession
echo '### level0 should be hidden, level1+2 should be transferred' echo '### level0 should be hidden, level1+2 should be transferred'
env_parallel -Slo 'echo $level0var; level0func; level0alias; echo ${level0arr[*]}' ::: fail env_parallel -Slo 'echo $level0var; level0func; level0alias; echo ${level0arr[*]}' ::: fail 2>&1
env_parallel 'echo $level0var; level0func; level0alias; echo ${level0arr[*]}' ::: fail env_parallel 'echo $level0var; level0func; level0alias; echo ${level0arr[*]}' ::: fail 2>&1
env_parallel -Slo 'echo $level1var; level1func; level1alias; echo ${level1arr[*]}' ::: OK env_parallel -Slo 'echo $level1var; level1func; level1alias; echo ${level1arr[*]}' ::: OK
env_parallel 'echo $level1var; level1func; level1alias; echo ${level1arr[*]}' ::: OK env_parallel 'echo $level1var; level1func; level1alias; echo ${level1arr[*]}' ::: OK
env_parallel -Slo 'echo $level2var; level2func; level2alias; echo ${level2arr[*]}' ::: OK env_parallel -Slo 'echo $level2var; level2func; level2alias; echo ${level2arr[*]}' ::: OK

View file

@ -7,7 +7,7 @@ par_path_remote_bash() {
rm -rf /tmp/parallel rm -rf /tmp/parallel
cp /usr/local/bin/parallel /tmp cp /usr/local/bin/parallel /tmp
cat <<'_EOS' | stdout ssh nopathbash@lo -T | perl -ne '/logged in/..0 and print' | uniq cat <<'_EOS' |
echo logged in echo logged in
echo BASH Path before: $PATH with no parallel echo BASH Path before: $PATH with no parallel
parallel echo ::: 1 parallel echo ::: 1
@ -21,6 +21,9 @@ par_path_remote_bash() {
# --filter to see if $PATH with parallel is transferred # --filter to see if $PATH with parallel is transferred
env_parallel --filter --env A,PATH -Slo echo '$PATH' ::: OK env_parallel --filter --env A,PATH -Slo echo '$PATH' ::: OK
_EOS _EOS
stdout ssh nopathbash@lo -T |
perl -ne '/logged in/..0 and print' |
uniq
echo echo
} }
@ -29,7 +32,7 @@ par_path_remote_csh() {
rm -rf /tmp/parallel rm -rf /tmp/parallel
cp /usr/local/bin/parallel /tmp cp /usr/local/bin/parallel /tmp
cat <<'_EOS' | stdout ssh nopathcsh@lo -T | perl -ne '/logged in/..0 and print' | uniq cat <<'_EOS' |
echo logged in echo logged in
echo CSH Path before: $PATH with no parallel echo CSH Path before: $PATH with no parallel
which parallel >& /dev/stdout which parallel >& /dev/stdout
@ -49,6 +52,9 @@ par_path_remote_csh() {
sleep 1 sleep 1
echo Done echo Done
_EOS _EOS
stdout ssh nopathcsh@lo -T |
perl -ne '/logged in/..0 and print' |
uniq
} }
par_keep_order() { par_keep_order() {
@ -109,5 +115,5 @@ par_retries_4() {
export -f $(compgen -A function | grep par_) export -f $(compgen -A function | grep par_)
#compgen -A function | grep par_ | sort | parallel --delay $D -j$P --tag -k '{} 2>&1' #compgen -A function | grep par_ | sort | parallel --delay $D -j$P --tag -k '{} 2>&1'
compgen -A function | grep par_ | LC_ALL=C sort | compgen -A function | grep par_ | LC_ALL=C sort |
parallel --joblog /tmp/jl-`basename $0` --delay 0.1 -j10 --tag -k '{} 2>&1' | parallel --joblog /tmp/jl-`basename $0` --delay 0.1 -j10 --tag -k '{} 2>&1'
grep -Ev 'microk8s|smart connected IoT'

View file

@ -119,7 +119,7 @@ echo '### Negative replacement strings'
parallel --colsep ' ' echo '{-3}orrect' ::: "1 c 3 4" parallel --colsep ' ' echo '{-3}orrect' ::: "1 c 3 4"
echo 'bug #38439: "open files" with --files --pipe blocks after a while' echo 'bug #38439: "open files" with --files --pipe blocks after a while'
ulimit -n 20; yes "`seq 3000`" |head -c 20M | parallel --pipe -k echo {#} of 21 ulimit -n 28; yes "`seq 3000`" |head -c 20M | parallel --pipe -k echo {#} of 21
echo 'bug #34241: --pipe should not spawn unneeded processes - part 2' echo 'bug #34241: --pipe should not spawn unneeded processes - part 2'
seq 500 | parallel --tmpdir . -j10 --pipe --block 1k --files wc >/dev/null; seq 500 | parallel --tmpdir . -j10 --pipe --block 1k --files wc >/dev/null;

View file

@ -1,23 +1,5 @@
#!/bin/bash #!/bin/bash
get_tmux() {
# To install tmux in different version run this
cd /tmp
doit() {
wget https://github.com/tmux/tmux/archive/$1.tar.gz
tar xvf $1.tar.gz
cd tmux-$1
./autogen.sh
./configure --prefix /tmp/tmux/$1
make
make install
sudo cp /tmp/tmux/$1/bin/tmux /usr/local/bin/tmux-$1
}
. `which env_parallel.bash`
seq 1.8 0.1 2.9 | env_parallel --tag --lb doit
}
par_tmux_filter() { par_tmux_filter() {
# /tmp/parallel-local7/tmsOU2Ig # /tmp/parallel-local7/tmsOU2Ig
perl -pe 's:(/tmp\S+/tms).....:$1XXXXX:;s/ p\d+/pID/;' perl -pe 's:(/tmp\S+/tms).....:$1XXXXX:;s/ p\d+/pID/;'

View file

@ -1,10 +1,20 @@
#!/bin/bash #!/bin/bash
SERVER1=parallel-server1 SERVER1=parallel-server1
SERVER2=lo SERVER2=parallel-server2
SSHLOGIN1=parallel@parallel-server1 SERVER3=parallel-server3
SSHLOGIN2=parallel@lo SSHUSER1=vagrant
SSHLOGIN3=parallel@parallel-server2 SSHUSER2=vagrant
SSHUSER3=vagrant
SSHLOGIN1=$SSHUSER1@$SERVER1
SSHLOGIN2=$SSHUSER2@$SERVER2
SSHLOGIN3=$SSHUSER3@$SERVER3
#SERVER1=parallel-server1
#SERVER2=lo
#SSHLOGIN1=parallel@parallel-server1
#SSHLOGIN2=parallel@lo
#SSHLOGIN3=parallel@parallel-server2
echo '### Test use special ssh' echo '### Test use special ssh'
echo 'TODO test ssh with > 9 simultaneous' echo 'TODO test ssh with > 9 simultaneous'
@ -21,8 +31,8 @@ echo '### test --filter-hosts with server w/o ssh, non-existing server'
parallel -S 192.168.1.197,8.8.8.8,$SSHLOGIN1,$SSHLOGIN2,$SSHLOGIN3 --filter-hosts --nonall -k --tag echo parallel -S 192.168.1.197,8.8.8.8,$SSHLOGIN1,$SSHLOGIN2,$SSHLOGIN3 --filter-hosts --nonall -k --tag echo
echo '### bug #41964: --controlmaster not seems to reuse OpenSSH connections to the same host' echo '### bug #41964: --controlmaster not seems to reuse OpenSSH connections to the same host'
(parallel -S redhat9.tange.dk true ::: {1..20}; echo No --controlmaster - finish last) & (parallel -S $SSHLOGIN1 true ::: {1..20}; echo No --controlmaster - finish last) &
(parallel -M -S redhat9.tange.dk true ::: {1..20}; echo With --controlmaster - finish first) & (parallel -M -S $SSHLOGIN1 true ::: {1..20}; echo With --controlmaster - finish first) &
wait wait
echo '### --filter-hosts - OK, non-such-user, connection refused, wrong host' echo '### --filter-hosts - OK, non-such-user, connection refused, wrong host'

View file

@ -2,8 +2,15 @@
SERVER1=parallel-server1 SERVER1=parallel-server1
SERVER2=parallel-server2 SERVER2=parallel-server2
SSHLOGIN1=parallel@$SERVER1 SSHUSER1=vagrant
SSHLOGIN2=parallel@$SERVER2 SSHUSER2=vagrant
SSHLOGIN1=$SSHUSER1@$SERVER1
SSHLOGIN2=$SSHUSER2@$SERVER2
#SERVER1=parallel-server1
#SERVER2=parallel-server2
#SSHLOGIN1=parallel@$SERVER1
#SSHLOGIN2=parallel@$SERVER2
export PARALLEL=-j0 export PARALLEL=-j0
#export PARALLEL="--sshdelay 0.3" #export PARALLEL="--sshdelay 0.3"

View file

@ -2,8 +2,12 @@
SERVER1=parallel-server1 SERVER1=parallel-server1
SERVER2=parallel-server2 SERVER2=parallel-server2
SSHLOGIN1=parallel@$SERVER1 SSHUSER1=vagrant
SSHLOGIN2=parallel@$SERVER2 SSHUSER2=vagrant
SSHLOGIN1=$SSHUSER1@$SERVER1
SSHLOGIN2=$SSHUSER2@$SERVER2
#SSHLOGIN1=parallel@$SERVER1
#SSHLOGIN2=parallel@$SERVER2
echo '### Check -S .. and --serverloginfile ..' echo '### Check -S .. and --serverloginfile ..'
echo $SSHLOGIN1 > ~/.parallel/sshloginfile echo $SSHLOGIN1 > ~/.parallel/sshloginfile
@ -19,7 +23,7 @@ cd /tmp
(echo ':'; echo file:name; echo file:name.foo; echo file: name.foo; echo file : name.foo;) \ (echo ':'; echo file:name; echo file:name.foo; echo file: name.foo; echo file : name.foo;) \
> /tmp/test18 > /tmp/test18
cat /tmp/test18 | parallel echo content-{} ">" {} cat /tmp/test18 | parallel echo content-{} ">" {}
cat /tmp/test18 | parallel -j1 --trc {}.{.} -S $SSHLOGIN1,parallel@$SERVER2,: \ cat /tmp/test18 | parallel -j1 --trc {}.{.} -S $SSHLOGIN1,$SSHLOGIN2,: \
'(echo remote-{}.{.};cat {}) > {}.{.}' '(echo remote-{}.{.};cat {}) > {}.{.}'
cat /tmp/test18 | parallel -j1 -k 'cat {}.{.}' cat /tmp/test18 | parallel -j1 -k 'cat {}.{.}'
@ -34,10 +38,10 @@ echo | stdout parallel -k --cleanup echo
echo '### Test --sshlogin -S --sshloginfile' echo '### Test --sshlogin -S --sshloginfile'
echo localhost >/tmp/parallel-sshlogin echo localhost >/tmp/parallel-sshlogin
seq 1 3 | parallel -k --sshlogin 8/$SSHLOGIN1 -S "7/ssh -l parallel $SERVER2",: --sshloginfile /tmp/parallel-sshlogin echo seq 1 3 | parallel -k --sshlogin 8/$SSHLOGIN1 -S "7/ssh -l $SSHUSER2 $SERVER2",: --sshloginfile /tmp/parallel-sshlogin echo
echo '### Test --sshloginfile with extra content' echo '### Test --sshloginfile with extra content'
echo "2/ssh -l parallel $SERVER2" >>/tmp/parallel-sshlogin echo "2/ssh -l $SSHUSER2 $SERVER2" >>/tmp/parallel-sshlogin
echo ":" >>/tmp/parallel-sshlogin echo ":" >>/tmp/parallel-sshlogin
echo "#2/ssh -l tange nothing" >>/tmp/parallel-sshlogin echo "#2/ssh -l tange nothing" >>/tmp/parallel-sshlogin
seq 1 10 | parallel -k --sshloginfile /tmp/parallel-sshlogin echo seq 1 10 | parallel -k --sshloginfile /tmp/parallel-sshlogin echo

View file

@ -4,8 +4,12 @@
SERVER1=parallel-server1 SERVER1=parallel-server1
SERVER2=parallel-server2 SERVER2=parallel-server2
SSHLOGIN1=parallel@parallel-server1 SSHUSER1=vagrant
SSHLOGIN2=parallel@parallel-server2 SSHUSER2=vagrant
#SSHLOGIN1=parallel@$SERVER1
#SSHLOGIN2=parallel@$SERVER2
SSHLOGIN1=$SSHUSER1@$SERVER1
SSHLOGIN2=$SSHUSER2@$SERVER2
echo '### Test --transfer --return --cleanup - files with newline' echo '### Test --transfer --return --cleanup - files with newline'

View file

@ -2,23 +2,33 @@
SERVER1=parallel-server1 SERVER1=parallel-server1
SERVER2=parallel-server2 SERVER2=parallel-server2
SERVER2=parallel-server3
SSHUSER1=vagrant
SSHUSER2=vagrant
SSHUSER3=vagrant
SSHLOGIN1=$SSHUSER1@$SERVER1
SSHLOGIN2=$SSHUSER2@$SERVER2
SSHLOGIN3=$SSHUSER3@$SERVER3
#SERVER1=parallel-server1
#SERVER2=parallel-server2
echo '### Test $PARALLEL - single line' echo '### Test $PARALLEL - single line'
echo | PARALLEL=--number-of-cpus parallel echo | PARALLEL=--number-of-cpus parallel
(echo 1; echo 1) | PARALLEL="-Sparallel\@$SERVER1 -Sssh\ -l\ parallel\ $SERVER2 -j1" parallel -kv hostname\; echo | sort (echo 1; echo 1) | PARALLEL="-S$SSHLOGIN1 -Sssh\ -l\ $SSHUSER2\ $SERVER2 -j1" parallel -kv hostname\; echo | sort
echo '### Test $PARALLEL - multi line' echo '### Test $PARALLEL - multi line'
(echo 1; echo 1) | PARALLEL="-Sparallel\@$SERVER1 (echo 1; echo 1) | PARALLEL="-S$SSHLOGIN1
-Sssh\ -l\ parallel\ $SERVER2 -Sssh\ -l\ $SSHUSER2\ $SERVER2
-j1" parallel -kv hostname\; echo | sort -j1" parallel -kv hostname\; echo | sort
echo '### Test ~/.parallel/config - single line' echo '### Test ~/.parallel/config - single line'
echo "-Sparallel\@$SERVER1 -Sssh\ -l\ parallel\ $SERVER2 -j1" > ~/.parallel/config echo "-S$SSHLOGIN1 -Sssh\ -l\ $SSHUSER2\ $SERVER2 -j1" > ~/.parallel/config
(echo 1; echo 1) | parallel -kv hostname\; echo | sort (echo 1; echo 1) | parallel -kv hostname\; echo | sort
echo '### Test ~/.parallel/config - multi line' echo '### Test ~/.parallel/config - multi line'
echo "-Sparallel\@$SERVER1 echo "-S$SSHLOGIN1
-Sssh\ -l\ parallel\ $SERVER2 -Sssh\ -l\ $SSHUSER2\ $SERVER2
-j1" > ~/.parallel/config -j1" > ~/.parallel/config
(echo 1; echo 1) | parallel -kv hostname\; echo | sort (echo 1; echo 1) | parallel -kv hostname\; echo | sort
rm ~/.parallel/config rm ~/.parallel/config

View file

@ -2,8 +2,12 @@
SERVER1=parallel-server1 SERVER1=parallel-server1
SERVER2=parallel-server2 SERVER2=parallel-server2
SSHLOGIN1=parallel@$SERVER1 SSHUSER1=vagrant
SSHLOGIN2=parallel@$SERVER2 SSHUSER2=vagrant
#SSHLOGIN1=parallel@$SERVER1
#SSHLOGIN2=parallel@$SERVER2
SSHLOGIN1=$SSHUSER1@$SERVER1
SSHLOGIN2=$SSHUSER2@$SERVER2
cd /tmp cd /tmp

View file

@ -1,5 +1,12 @@
#!/bin/bash #!/bin/bash
SERVER1=parallel-server1
SERVER2=parallel-server2
SSHUSER1=vagrant
SSHUSER2=vagrant
SSHLOGIN1=$SSHUSER1@$SERVER1
SSHLOGIN2=$SSHUSER2@$SERVER2
cat <<'EOF' | sed -e s/\$SERVER1/$SERVER1/\;s/\$SERVER2/$SERVER2/ | parallel -vj10 -k --joblog /tmp/jl-`basename $0` -L1 -r cat <<'EOF' | sed -e s/\$SERVER1/$SERVER1/\;s/\$SERVER2/$SERVER2/ | parallel -vj10 -k --joblog /tmp/jl-`basename $0` -L1 -r
echo '### Test of --eta' echo '### Test of --eta'
seq 1 10 | stdout parallel --eta "sleep 1; echo {}" | wc -l seq 1 10 | stdout parallel --eta "sleep 1; echo {}" | wc -l
@ -14,5 +21,5 @@ echo '### Test of --progress with no jobs'
stdout parallel --progress "sleep 1; echo {}" < /dev/null stdout parallel --progress "sleep 1; echo {}" < /dev/null
echo '### --timeout --onall on remote machines: 2*slept 1, 2 jobs failed' echo '### --timeout --onall on remote machines: 2*slept 1, 2 jobs failed'
parallel -j0 --timeout 6 --onall -S localhost,parallel@parallel-server1 'sleep {}; echo slept {}' ::: 1 8 9 ; echo jobs failed: $? parallel -j0 --timeout 6 --onall -S localhost,$SSHLOGIN1 'sleep {}; echo slept {}' ::: 1 8 9 ; echo jobs failed: $?
EOF EOF

View file

@ -1,19 +1,23 @@
#!/bin/bash #!/bin/bash
SERVER1=parallel-server1
SSHUSER1=vagrant
SSHLOGIN1=$SSHUSER1@$SERVER1
rsync -Ha --delete input-files/testdir/ tmp/ rsync -Ha --delete input-files/testdir/ tmp/
cd tmp cd tmp
SERVER2=parallel@parallel-server2 SERVER2=parallel@parallel-server2
echo $SERVER2 >~/.parallel/sshloginfile echo $SSHLOGIN1 >~/.parallel/sshloginfile
echo '### Test --wd newtempdir/newdir/tmp/ with space dirs'; echo '### Test --wd newtempdir/newdir/tmp/ with space dirs';
ssh $SERVER2 rm -rf newtempdir; ssh $SSHLOGIN1 rm -rf newtempdir;
stdout parallel -j9 -k --wd newtempdir/newdir/tmp/ --basefile 1-col.txt --trc {}.6 -S .. -v echo ">"{}.6 ::: './ ab/c"d/ef g' ' ab/c"d/efg' ./b/bar ./b/foo "./ ab /c' d/ ef\"g" ./2-col.txt './a b/cd / ef/efg'; stdout parallel -j9 -k --wd newtempdir/newdir/tmp/ --basefile 1-col.txt --trc {}.6 -S .. -v echo ">"{}.6 ::: './ ab/c"d/ef g' ' ab/c"d/efg' ./b/bar ./b/foo "./ ab /c' d/ ef\"g" ./2-col.txt './a b/cd / ef/efg';
find . -name '*.6' | LC_ALL=C sort find . -name '*.6' | LC_ALL=C sort
echo '### Test --wd /tmp/newtempdir/newdir/tmp/ with space dirs'; echo '### Test --wd /tmp/newtempdir/newdir/tmp/ with space dirs';
ssh $SERVER2 rm -rf /tmp/newtempdir; ssh $SSHLOGIN1 rm -rf /tmp/newtempdir;
stdout parallel -j9 -k --wd /tmp/newtempdir/newdir/tmp/ --basefile 1-col.txt --trc {}.7 -S .. -v echo ">"{}.7 ::: './ ab/c"d/ef g' ' ab/c"d/efg' ./b/bar ./b/foo "./ ab /c' d/ ef\"g" ./2-col.txt './a b/cd / ef/efg'; stdout parallel -j9 -k --wd /tmp/newtempdir/newdir/tmp/ --basefile 1-col.txt --trc {}.7 -S .. -v echo ">"{}.7 ::: './ ab/c"d/ef g' ' ab/c"d/efg' ./b/bar ./b/foo "./ ab /c' d/ ef\"g" ./2-col.txt './a b/cd / ef/efg';
find . -name '*.7' | LC_ALL=C sort find . -name '*.7' | LC_ALL=C sort

View file

@ -2,15 +2,25 @@
SERVER1=parallel-server1 SERVER1=parallel-server1
SERVER2=parallel-server2 SERVER2=parallel-server2
SERVER2=parallel-server3
SSHUSER1=vagrant
SSHUSER2=vagrant
SSHUSER3=vagrant
SSHLOGIN1=$SSHUSER1@$SERVER1
SSHLOGIN2=$SSHUSER2@$SERVER2
SSHLOGIN3=$SSHUSER3@$SERVER3
#SERVER1=parallel-server1
#SERVER2=parallel-server2
echo '### Test $PARALLEL_SEQ - local' echo '### Test $PARALLEL_SEQ - local'
seq 1 20 | parallel -kN2 echo arg1:{1} seq:'$'PARALLEL_SEQ arg2:{2} seq 1 20 | parallel -kN2 echo arg1:{1} seq:'$'PARALLEL_SEQ arg2:{2}
echo '### Test $PARALLEL_SEQ - remote' echo '### Test $PARALLEL_SEQ - remote'
seq 1 20 | parallel -kN2 -S parallel@$SERVER1,parallel@$SERVER2 echo arg1:{1} seq:'$'PARALLEL_SEQ arg2:{2} seq 1 20 | parallel -kN2 -S $SSHLOGIN1,$SSHLOGIN2 echo arg1:{1} seq:'$'PARALLEL_SEQ arg2:{2}
echo '### Test $PARALLEL_PID - local' echo '### Test $PARALLEL_PID - local'
seq 1 20 | parallel -kN2 echo arg1:{1} pid:'$'PARALLEL_PID arg2:{2} | perl -pe 's/\d{3,}/0/g' seq 1 20 | parallel -kN2 echo arg1:{1} pid:'$'PARALLEL_PID arg2:{2} | perl -pe 's/\d{3,}/0/g'
echo '### Test $PARALLEL_PID - remote' echo '### Test $PARALLEL_PID - remote'
seq 1 20 | parallel -kN2 -S parallel@$SERVER1,parallel@$SERVER2 echo arg1:{1} pid:'$'PARALLEL_PID arg2:{2} | perl -pe 's/\d{3,}/0/g' seq 1 20 | parallel -kN2 -S $SSHLOGIN1,$SSHLOGIN2 echo arg1:{1} pid:'$'PARALLEL_PID arg2:{2} | perl -pe 's/\d{3,}/0/g'

View file

@ -1,7 +1,11 @@
#!/bin/bash #!/bin/bash
SERVER1=redhat9.tange.dk SERVER1=parallel-server1
SERVER2=centos3.tange.dk SERVER2=parallel-server2
SSHUSER1=vagrant
SSHUSER2=vagrant
SSHLOGIN1=$SSHUSER1@$SERVER1
SSHLOGIN2=$SSHUSER2@$SERVER2
echo '### Test $PARALLEL' echo '### Test $PARALLEL'
PARALLEL="-k PARALLEL="-k
@ -27,7 +31,7 @@ PARALLEL="-k --jobs 1 echo 1" parallel -v echo 2 ::: a b c
echo '### Test ugly quoting from $PARALLEL' echo '### Test ugly quoting from $PARALLEL'
PARALLEL="-k --jobs 1 perl -pe \'\$a=1; print\$a\'" parallel -v ::: <(echo a) <(echo b) PARALLEL="-k --jobs 1 perl -pe \'\$a=1; print\$a\'" parallel -v ::: <(echo a) <(echo b)
PARALLEL='-k --jobs 1 -S parallel@'$SERVER1' perl -pe \"\\$a=1; print\\$a\"' parallel -v '<(echo {})' ::: foo PARALLEL='-k --jobs 1 -S '$SSHLOGIN1' perl -pe \"\\$a=1; print\\$a\"' parallel -v '<(echo {})' ::: foo
echo '### Test ugly quoting from profile file' echo '### Test ugly quoting from profile file'
cat <<EOF >~/.parallel/test_profile cat <<EOF >~/.parallel/test_profile
@ -39,27 +43,27 @@ parallel -v -J test_profile ::: <(echo a) <(echo b)
echo '### Test ugly quoting from profile file --plain' echo '### Test ugly quoting from profile file --plain'
parallel -v -J test_profile --plain echo ::: <(echo a) <(echo b) parallel -v -J test_profile --plain echo ::: <(echo a) <(echo b)
PARALLEL='-k --jobs 1 echo' parallel -S ssh\ parallel\@$SERVER1 -v ::: foo PARALLEL='-k --jobs 1 echo' parallel -S ssh\ $SSHLOGIN1 -v ::: foo
PARALLEL='-k --jobs 1 perl -pe \"\\$a=1; print \\$a\"' parallel -S ssh\ parallel\@$SERVER1 -v '<(echo {})' ::: foo PARALLEL='-k --jobs 1 perl -pe \"\\$a=1; print \\$a\"' parallel -S ssh\ $SSHLOGIN1 -v '<(echo {})' ::: foo
echo '### Test quoting of $ in command from profile file' echo '### Test quoting of $ in command from profile file'
cat <<EOF >~/.parallel/test_profile cat <<EOF >~/.parallel/test_profile
-k --jobs 1 perl -pe \'\\\$a=1; print \\\$a\' -k --jobs 1 perl -pe \'\\\$a=1; print \\\$a\'
EOF EOF
parallel -v -J test_profile -S ssh\ parallel\@$SERVER1 '<(echo {})' ::: foo parallel -v -J test_profile -S ssh\ $SSHLOGIN1 '<(echo {})' ::: foo
echo '### Test quoting of $ in command from profile file --plain' echo '### Test quoting of $ in command from profile file --plain'
parallel -v -J test_profile --plain -S ssh\ parallel\@$SERVER1 'cat <(echo {})' ::: foo parallel -v -J test_profile --plain -S ssh\ $SSHLOGIN1 'cat <(echo {})' ::: foo
echo '### Test quoting of $ in command from $PARALLEL' echo '### Test quoting of $ in command from $PARALLEL'
PARALLEL='-k --jobs 1 perl -pe \"\\$a=1; print \\$a\" ' parallel -S ssh\ parallel\@$SERVER1 -v '<(echo {})' ::: foo PARALLEL='-k --jobs 1 perl -pe \"\\$a=1; print \\$a\" ' parallel -S ssh\ $SSHLOGIN1 -v '<(echo {})' ::: foo
echo '### Test quoting of $ in command from $PARALLEL --plain' echo '### Test quoting of $ in command from $PARALLEL --plain'
PARALLEL='-k --jobs 1 perl -pe \"\\$a=1; print \\$a\" ' parallel --plain -S ssh\ parallel\@$SERVER1 -v 'cat <(echo {})' ::: foo PARALLEL='-k --jobs 1 perl -pe \"\\$a=1; print \\$a\" ' parallel --plain -S ssh\ $SSHLOGIN1 -v 'cat <(echo {})' ::: foo
echo '### Test quoting of space in arguments (-S) from profile file' echo '### Test quoting of space in arguments (-S) from profile file'
cat <<EOF >~/.parallel/test_profile cat <<EOF >~/.parallel/test_profile
-k --jobs 1 -S ssh\ parallel\@$SERVER1 perl -pe \'\$a=1; print \$a\' -k --jobs 1 -S ssh\ $SSHLOGIN1 perl -pe \'\$a=1; print \$a\'
EOF EOF
parallel -v -J test_profile '<(echo {})' ::: foo parallel -v -J test_profile '<(echo {})' ::: foo
@ -67,23 +71,23 @@ echo '### Test quoting of space in arguments (-S) from profile file --plain'
parallel -v -J test_profile --plain 'cat <(echo {})' ::: foo parallel -v -J test_profile --plain 'cat <(echo {})' ::: foo
echo '### Test quoting of space in arguments (-S) from $PARALLEL' echo '### Test quoting of space in arguments (-S) from $PARALLEL'
PARALLEL='-k --jobs 1 -S ssh\ parallel@'$SERVER1' perl -pe \"\\$a=1; print \\$a\" ' parallel -v '<(echo {})' ::: foo PARALLEL='-k --jobs 1 -S ssh\ '$SSHLOGIN1' perl -pe \"\\$a=1; print \\$a\" ' parallel -v '<(echo {})' ::: foo
echo '### Test quoting of space in long arguments (--sshlogin) from profile file' echo '### Test quoting of space in long arguments (--sshlogin) from profile file'
cat <<EOF >~/.parallel/test_profile cat <<EOF >~/.parallel/test_profile
# testprofile # testprofile
-k --jobs 1 --sshlogin ssh\ parallel\@$SERVER1 perl -pe \'\$a=1; print \$a\' -k --jobs 1 --sshlogin ssh\ $SSHLOGIN1 perl -pe \'\$a=1; print \$a\'
EOF EOF
parallel -v -J test_profile '<(echo {})' ::: foo parallel -v -J test_profile '<(echo {})' ::: foo
echo '### Test quoting of space in arguments (-S) from $PARALLEL' echo '### Test quoting of space in arguments (-S) from $PARALLEL'
PARALLEL='-k --jobs 1 --sshlogin ssh\ parallel\@'$SERVER1' perl -pe \"\\$a=1; print \\$a\" ' parallel -v '<(echo {})' ::: foo PARALLEL='-k --jobs 1 --sshlogin ssh\ '$SSHLOGIN1' perl -pe \"\\$a=1; print \\$a\" ' parallel -v '<(echo {})' ::: foo
echo '### Test merging of profiles - sort needed because -k only works on the single machine' echo '### Test merging of profiles - sort needed because -k only works on the single machine'
echo --tag > ~/.parallel/test_tag echo --tag > ~/.parallel/test_tag
echo -S .. > ~/.parallel/test_S.. echo -S .. > ~/.parallel/test_S..
echo parallel@parallel-server1 > ~/.parallel/sshloginfile echo $SSHLOGIN1 > ~/.parallel/sshloginfile
echo parallel@parallel-server2 >> ~/.parallel/sshloginfile echo $SSHLOGIN2 >> ~/.parallel/sshloginfile
parallel -Jtest_tag -Jtest_S.. --nonall echo a | sort parallel -Jtest_tag -Jtest_S.. --nonall echo a | sort
echo '### Test merging of profiles - sort needed because -k only works on the single machine --plain' echo '### Test merging of profiles - sort needed because -k only works on the single machine --plain'

View file

@ -2,8 +2,12 @@
SERVER1=parallel-server1 SERVER1=parallel-server1
SERVER2=parallel-server2 SERVER2=parallel-server2
SSHUSER1=vagrant
SSHUSER2=vagrant
SSHLOGIN1=$SSHUSER1@$SERVER1
SSHLOGIN2=$SSHUSER2@$SERVER2
echo '### Test -M (--retries to avoid false errors)' echo '### Test -M (--retries to avoid false errors)'
seq 1 30 | parallel -j5 --retries 3 -k -M -S parallel@$SERVER1,parallel@$SERVER2 echo 2>/dev/null seq 1 30 | parallel -j5 --retries 3 -k -M -S $SSHLOGIN1,$SSHLOGIN2 echo 2>/dev/null
seq 1 30 | parallel -j10 --retries 3 -k -M -S parallel@$SERVER1,parallel@$SERVER2 echo 2>/dev/null seq 1 30 | parallel -j10 --retries 3 -k -M -S $SSHLOGIN1,$SSHLOGIN2 echo 2>/dev/null

View file

@ -1,10 +1,20 @@
#!/bin/bash #!/bin/bash
# must be other servers than localhost
SERVER1=parallel-server1 SERVER1=parallel-server1
SERVER2=parallel-server2 SERVER2=parallel-server2
SSHLOGIN1=parallel@$SERVER1 SERVER2=parallel-server3
SSHLOGIN2=parallel@$SERVER2 SSHUSER1=vagrant
SSHUSER2=vagrant
SSHUSER3=vagrant
SSHLOGIN1=$SSHUSER1@$SERVER1
SSHLOGIN2=$SSHUSER2@$SERVER2
SSHLOGIN3=$SSHUSER3@$SERVER3
## must be other servers than localhost
#SERVER1=parallel-server1
#SERVER2=parallel-server2
#SSHLOGIN1=parallel@$SERVER1
#SSHLOGIN2=parallel@$SERVER2
export SSHLOGIN1 export SSHLOGIN1
export SSHLOGIN2 export SSHLOGIN2
# Minimal version of test17 # Minimal version of test17

View file

@ -2,8 +2,15 @@
SERVER1=parallel-server1 SERVER1=parallel-server1
SERVER2=parallel-server2 SERVER2=parallel-server2
SSHLOGIN1=parallel@$SERVER1 SSHUSER1=vagrant
SSHLOGIN2=parallel@$SERVER2 SSHUSER2=vagrant
SSHLOGIN1=$SSHUSER1@$SERVER1
SSHLOGIN2=$SSHUSER2@$SERVER2
#SERVER1=parallel-server1
#SERVER2=parallel-server2
#SSHLOGIN1=parallel@$SERVER1
#SSHLOGIN2=parallel@$SERVER2
# -L1 will join lines ending in ' ' # -L1 will join lines ending in ' '
cat <<'EOF' | sed -e s/\$SERVER1/$SERVER1/\;s/\$SERVER2/$SERVER2/\;s/\$SSHLOGIN1/$SSHLOGIN1/\;s/\$SSHLOGIN2/$SSHLOGIN2/ | parallel -vj10 -k --joblog /tmp/jl-`basename $0` -L1 -r cat <<'EOF' | sed -e s/\$SERVER1/$SERVER1/\;s/\$SERVER2/$SERVER2/\;s/\$SSHLOGIN1/$SSHLOGIN1/\;s/\$SSHLOGIN2/$SSHLOGIN2/ | parallel -vj10 -k --joblog /tmp/jl-`basename $0` -L1 -r

View file

@ -2,10 +2,14 @@
SERVER1=parallel-server1 SERVER1=parallel-server1
SERVER2=parallel-server2 SERVER2=parallel-server2
SSHUSER1=vagrant
SSHUSER2=vagrant
SSHLOGIN1=$SSHUSER1@$SERVER1
SSHLOGIN2=$SSHUSER2@$SERVER2
cat <<'EOF' | sed -e s/\$SERVER1/$SERVER1/\;s/\$SERVER2/$SERVER2/ | parallel -vj10 -k --joblog /tmp/jl-`basename $0` -L1 -r | perl -pe 's/(PARALLEL_PID....)\d+/$1XXXXX/g' cat <<'EOF' | sed -e s/\$SERVER1/$SERVER1/\;s/\$SERVER2/$SERVER2/ | parallel -vj10 -k --joblog /tmp/jl-`basename $0` -L1 -r | perl -pe 's/(PARALLEL_PID....)\d+/$1XXXXX/g'
echo '### Test --return of weirdly named file' echo '### Test --return of weirdly named file'
stdout parallel --return {} -vv -S parallel\@$SERVER1 echo '>'{} ::: 'aa<${#}" b' | stdout parallel --return {} -vv -S $SSHLOGIN1 echo '>'{} ::: 'aa<${#}" b' |
perl -pe 's/\S*parallel-server\S*/one-server/;s:[a-z+=/\\0-9]{500,}:base64:i;'; rm 'aa<${#}" b' perl -pe 's/\S*parallel-server\S*/one-server/;s:[a-z+=/\\0-9]{500,}:base64:i;'; rm 'aa<${#}" b'
echo '### Test if remote login shell is csh' echo '### Test if remote login shell is csh'

View file

@ -0,0 +1,75 @@
# -*- mode: ruby -*-
# vi: set ft=ruby :
# All Vagrant configuration is done below. The "2" in Vagrant.configure
# configures the configuration version (we support older styles for
# backwards compatibility). Please don't change it unless you know what
# you're doing.
Vagrant.configure("2") do |config|
# The most common configuration options are documented and commented below.
# For a complete reference, please see the online documentation at
# https://docs.vagrantup.com.
# Every Vagrant development environment requires a box. You can search for
# boxes at https://vagrantcloud.com/search.
config.vm.box = "%%VMBOX%%"
# Disable automatic box update checking. If you disable this, then
# boxes will only be checked for updates when the user runs
# `vagrant box outdated`. This is not recommended.
# config.vm.box_check_update = false
# Create a forwarded port mapping which allows access to a specific port
# within the machine from a port on the host machine. In the example below,
# accessing "localhost:8080" will access port 80 on the guest machine.
# NOTE: This will enable public access to the opened port
# config.vm.network "forwarded_port", guest: 80, host: 8080
# Create a forwarded port mapping which allows access to a specific port
# within the machine from a port on the host machine and only allow access
# via 127.0.0.1 to disable public access
# config.vm.network "forwarded_port", guest: 80, host: 8080, host_ip: "127.0.0.1"
# Create a private network, which allows host-only access to the machine
# using a specific IP.
config.vm.network "private_network", ip: "%%IP%%"
# Create a public network, which generally matched to bridged network.
# Bridged networks make the machine appear as another physical device on
# your network.
# config.vm.network "public_network"
# Share an additional folder to the guest VM. The first argument is
# the path on the host to the actual folder. The second argument is
# the path on the guest to mount the folder. And the optional third
# argument is a set of non-required options.
# config.vm.synced_folder "../data", "/vagrant_data"
# Provider-specific configuration so you can fine-tune various
# backing providers for Vagrant. These expose provider-specific options.
# Example for VirtualBox:
#
config.vm.provider "virtualbox" do |vb|
# # Display the VirtualBox GUI when booting the machine
# vb.gui = true
#
# # Customize the amount of memory on the VM:
vb.memory = "512"
end
#
# View the documentation for the provider you are using for more
# information on available options.
# Enable provisioning with a shell script. Additional provisioners such as
# Puppet, Chef, Ansible, Salt, and Docker are also available. Please see the
# documentation for more information about their specific syntax and use.
config.vm.provision "shell" do |s|
ssh_pub_key = File.readlines("../../authorized_keys").first.strip
s.inline = <<-SHELL
mkdir /root/.ssh
echo #{ssh_pub_key} >> /home/vagrant/.ssh/authorized_keys
echo #{ssh_pub_key} >> /root/.ssh/authorized_keys
sudo apt install rsync || sudo yum install -y rsync || sudo pkg install -y rsync
SHELL
end
end

107
testsuite/vagrant/setup.sh Normal file
View file

@ -0,0 +1,107 @@
#!/bin/bash
setup_one() {
# setup_one ubuntu/trusty64 172.27.27.2
if [ -z "$2" ] ; then
echo Usage: setup_one ubuntu/trusty64 172.27.27.2
return 1
fi
vfile="$1"/Vagrantfile
mkdir -p "$1"
cp Vagrantfile.tmpl "$vfile"
(
cd "$1"
perl -i -pe "s{%%VMBOX%%}{$1}g;s/%%IP%%/$2/" Vagrantfile
vagrant up
vagrant ssh -c 'ip addr || ifconfig'
)
ssh-keygen -R $2
ssh vagrant@$2 hostname
}
export -f setup_one
destroy_one() {
(
cd "$1"
vagrant destroy -f
)
rm -r ./"$1"
}
export -f destroy_one
server_list() {
cat <<SSHOK
generic/arch.98
generic/centos6.6
generic/centos7.7
generic/centos8.8
generic/debian8.18
generic/debian9.19
generic/debian10.30
generic/devuan3.43
generic/freebsd11.71
generic/freebsd12.72
generic/gentoo.99
generic/netbsd9.89
generic/oracle7.127
generic/rhel6.106
generic/rhel7.107
generic/rhel8.108
generic/ubuntu1604.216
generic/ubuntu1804.218
generic/ubuntu2004.220
SSHOK
# Ignore for now
true <<EOF
generic/alpine310
generic/alpine311
generic/alpine312
generic/alpine35
generic/alpine36
generic/alpine37
generic/alpine38
generic/alpine39
generic/dragonflybsd5
generic/fedora25
generic/fedora26
generic/fedora27
generic/fedora28
generic/fedora29
generic/fedora30
generic/fedora31
generic/fedora32
generic/hardenedbsd11
generic/hardenedbsd12
generic/netbsd8
generic/openbsd6
generic/opensuse15
generic/opensuse42
generic/oracle8
generic/ubuntu1604
generic/ubuntu1610
generic/ubuntu1704
generic/ubuntu1710
generic/ubuntu1804
generic/ubuntu1810
generic/ubuntu1904
generic/ubuntu1910
generic/ubuntu2004
EOF
}
destroy_all() {
server_list | parallel -j50% --plus --tag destroy_one {.} 172.27.27.{+.}
}
# No ssh to ip-addr
# generic/devuan1
# generic/devuan2
# Gamle: Centos3, Centos5, OracleXE, Debian7
setup_all() {
# IP address *.2 and up
server_list | parallel -j50% --plus --tag setup_one {.} 172.27.27.{+.}
}

View file

@ -24,6 +24,25 @@ par__pipepart_spawn 1:local / 2+ / 2+2+2+
par__pipepart_tee bug #45479: --pipe/--pipepart --tee par__pipepart_tee bug #45479: --pipe/--pipepart --tee
par__pipepart_tee --pipepart --tee par__pipepart_tee --pipepart --tee
par__pipepart_tee 314572800 par__pipepart_tee 314572800
par_bin ### Test --bin
par_bin 2 2 4
par_bin 2 2 4
par_bin 3 3 6
par_bin 3 3 7
par_bin 2 4 8
par_bin 2 4 8
par_bin 3 6 13
par_bin 3 6 13
par_bin ### Test --bin with expression that gives 1..n
par_bin 0 0 0
par_bin 0 0 0
par_bin 5 10 21
par_bin 5 10 21
par_bin ### Test --bin with expression that gives 0..n-1
par_bin 0 0 0
par_bin 0 0 0
par_bin 5 10 21
par_bin 5 10 21
par_colsep ### Test of --colsep par_colsep ### Test of --colsep
par_colsep a b c par_colsep a b c
par_colsep a b c par_colsep a b c
@ -469,7 +488,7 @@ par_long_line_remote ### Deal with long command lines on remote servers
par_long_line_remote 2 6 30006 par_long_line_remote 2 6 30006
par_long_line_remote 3 50 250050 par_long_line_remote 3 50 250050
par_maxlinelen_X_I ### Test max line length -X -I par_maxlinelen_X_I ### Test max line length -X -I
par_maxlinelen_X_I 3cfc69ee81b0fe7fdbe8eb059ad2da61 - par_maxlinelen_X_I 201ecb8ca789cecf39ee914a6d75611b -
par_maxlinelen_X_I Chars per line (817788/7): 116826 par_maxlinelen_X_I Chars per line (817788/7): 116826
par_maxlinelen_m_I ### Test max line length -m -I par_maxlinelen_m_I ### Test max line length -m -I
par_maxlinelen_m_I c78bd0799bc23d8946732f8b3ae3c94e - par_maxlinelen_m_I c78bd0799bc23d8946732f8b3ae3c94e -
@ -939,15 +958,77 @@ par_xargs_compat a_b c
par_xargs_compat d par_xargs_compat d
par_xargs_compat e par_xargs_compat e
par_xargs_compat ### test too long args par_xargs_compat ### test too long args
par_xargs_compat parallel: Error: Command line too long (1000005 >= 131049) at input 0: zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz... par_xargs_compat parallel: Error: Command line too long (1000005 >= 131XXX) at input 0: zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz...
par_xargs_compat xargs: argument line too long par_xargs_compat xargs: argument line too long
par_xargs_compat environment: line 109: stdsort: command not found par_xargs_compat parallel: Error: Command line too long (1000007 >= 10) at input 0: zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz...
par_xargs_compat environment: line 112: stdsort: command not found par_xargs_compat 1 2
par_xargs_compat environment: line 115: stdsort: command not found par_xargs_compat 3 4
par_xargs_compat 5 6
par_xargs_compat 7 8
par_xargs_compat 9 10
par_xargs_compat xargs: argument line too long
par_xargs_compat 1 2
par_xargs_compat 3 4
par_xargs_compat 5 6
par_xargs_compat 7 8
par_xargs_compat 9 10
par_xargs_compat parallel: Error: Command line too long (1000007 >= 10) at input 0: zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz...
par_xargs_compat 1 2
par_xargs_compat 3 4
par_xargs_compat 5 6
par_xargs_compat 7 8
par_xargs_compat 9 10
par_xargs_compat ### Test -x par_xargs_compat ### Test -x
par_xargs_compat environment: line 119: stdsort: command not found par_xargs_compat -km
par_xargs_compat environment: line 122: stdsort: command not found par_xargs_compat parallel: Error: Command line too long (10 >= 10) at input 0: 12345
par_xargs_compat environment: line 125: stdsort: command not found par_xargs_compat 1 2
par_xargs_compat environment: line 128: stdsort: command not found par_xargs_compat 3 4
par_xargs_compat environment: line 131: stdsort: command not found par_xargs_compat 5 6
par_xargs_compat environment: line 134: stdsort: command not found par_xargs_compat 7 8
par_xargs_compat 9 10
par_xargs_compat -kX
par_xargs_compat parallel: Error: Command line too long (10 >= 10) at input 0: 12345
par_xargs_compat 1 2
par_xargs_compat 3 4
par_xargs_compat 5 6
par_xargs_compat 7 8
par_xargs_compat 9 10
par_xargs_compat -x
par_xargs_compat xargs: argument line too long
par_xargs_compat 1 2
par_xargs_compat 3 4
par_xargs_compat 5 6
par_xargs_compat 7 8
par_xargs_compat -km -x
par_xargs_compat 1 2
par_xargs_compat 12
par_xargs_compat 1234
par_xargs_compat 13
par_xargs_compat 14
par_xargs_compat 15
par_xargs_compat 3 4
par_xargs_compat 5 6
par_xargs_compat 7 8
par_xargs_compat 9 10
par_xargs_compat -kX -x
par_xargs_compat 1 2
par_xargs_compat 12
par_xargs_compat 1234
par_xargs_compat 13
par_xargs_compat 14
par_xargs_compat 15
par_xargs_compat 3 4
par_xargs_compat 5 6
par_xargs_compat 7 8
par_xargs_compat 9 10
par_xargs_compat -x
par_xargs_compat 1 2
par_xargs_compat 12
par_xargs_compat 1234
par_xargs_compat 13
par_xargs_compat 14
par_xargs_compat 15
par_xargs_compat 3 4
par_xargs_compat 5 6
par_xargs_compat 7 8
par_xargs_compat 9 10

View file

@ -740,448 +740,424 @@ par_groupby --block 20 C1 $_%=2 csv , parallel: Warning: A record was longer tha
par_groupby --block 20 C1 $_%=2 csv , parallel: Warning: A record was longer than 50. Increasing to --blocksize 66. par_groupby --block 20 C1 $_%=2 csv , parallel: Warning: A record was longer than 50. Increasing to --blocksize 66.
par_groupby_pipepart tsv \t 3 $_%=2 ### test tsv | --colsep \t --groupby 3 $_%=2 par_groupby_pipepart tsv \t 3 $_%=2 ### test tsv | --colsep \t --groupby 3 $_%=2
par_groupby_pipepart tsv \t 3 $_%=2 NewRec par_groupby_pipepart tsv \t 3 $_%=2 NewRec
par_groupby_pipepart tsv \t 3 $_%=2 1 6 19 par_groupby_pipepart tsv \t 3 $_%=2 90001 540006 1170031
par_groupby_pipepart tsv \t 3 $_%=2 NewRec par_groupby_pipepart tsv \t 3 $_%=2 NewRec
par_groupby_pipepart tsv \t 3 $_%=2 90000 540000 1170000 par_groupby_pipepart tsv \t 3 $_%=2 90001 540006 1170031
par_groupby_pipepart tsv \t 3 $_%=2 NewRec par_groupby_pipepart tsv \t 3 $_%=2 NewRec
par_groupby_pipepart tsv \t 3 $_%=2 90000 540000 1170000 par_groupby_pipepart tsv \t 3 $_%=2 90001 540006 1170031
par_groupby_pipepart tsv \t 3 $_%=2 NewRec par_groupby_pipepart tsv \t 3 $_%=2 NewRec
par_groupby_pipepart tsv \t 3 $_%=2 90000 540000 1170000 par_groupby_pipepart tsv \t 3 $_%=2 90001 540006 1170031
par_groupby_pipepart tsv \t 3 $_%=2 NewRec par_groupby_pipepart tsv \t 3 $_%=2 NewRec
par_groupby_pipepart tsv \t 3 $_%=2 90000 540000 1170000 par_groupby_pipepart tsv \t 3 $_%=2 90001 540006 1170031
par_groupby_pipepart tsv \t 3 $_%=2 NewRec par_groupby_pipepart tsv \t 3 $_%=2 NewRec
par_groupby_pipepart tsv \t 3 $_%=2 90000 540000 1170000 par_groupby_pipepart tsv \t 3 $_%=2 90001 540006 1170031
par_groupby_pipepart tsv \t 3 $_%=2 NewRec par_groupby_pipepart tsv \t 3 $_%=2 NewRec
par_groupby_pipepart tsv \t 3 $_%=2 90000 540000 1170000 par_groupby_pipepart tsv \t 3 $_%=2 90001 540006 1170031
par_groupby_pipepart tsv \t 3 $_%=2 NewRec par_groupby_pipepart tsv \t 3 $_%=2 NewRec
par_groupby_pipepart tsv \t 3 $_%=2 90000 540000 1170000 par_groupby_pipepart tsv \t 3 $_%=2 90001 540006 1170031
par_groupby_pipepart tsv \t 3 $_%=2 NewRec par_groupby_pipepart tsv \t 3 $_%=2 NewRec
par_groupby_pipepart tsv \t 3 $_%=2 90000 540000 1170000 par_groupby_pipepart tsv \t 3 $_%=2 90001 540006 1170031
par_groupby_pipepart tsv \t 3 $_%=2 NewRec par_groupby_pipepart tsv \t 3 $_%=2 NewRec
par_groupby_pipepart tsv \t 3 $_%=2 90000 540000 1170000 par_groupby_pipepart tsv \t 3 $_%=2 90001 540006 1170031
par_groupby_pipepart tsv \t 3 $_%=2 NewRec
par_groupby_pipepart tsv \t 3 $_%=2 90000 540000 1170000
par_groupby_pipepart tsv \t 3 ### test tsv | --colsep \t --groupby 3 par_groupby_pipepart tsv \t 3 ### test tsv | --colsep \t --groupby 3
par_groupby_pipepart tsv \t 3 NewRec par_groupby_pipepart tsv \t 3 NewRec
par_groupby_pipepart tsv \t 3 1 6 19 par_groupby_pipepart tsv \t 3 90001 540006 1170031
par_groupby_pipepart tsv \t 3 NewRec par_groupby_pipepart tsv \t 3 NewRec
par_groupby_pipepart tsv \t 3 90000 540000 1170000 par_groupby_pipepart tsv \t 3 90001 540006 1170031
par_groupby_pipepart tsv \t 3 NewRec par_groupby_pipepart tsv \t 3 NewRec
par_groupby_pipepart tsv \t 3 90000 540000 1170000 par_groupby_pipepart tsv \t 3 90001 540006 1170031
par_groupby_pipepart tsv \t 3 NewRec par_groupby_pipepart tsv \t 3 NewRec
par_groupby_pipepart tsv \t 3 90000 540000 1170000 par_groupby_pipepart tsv \t 3 90001 540006 1170031
par_groupby_pipepart tsv \t 3 NewRec par_groupby_pipepart tsv \t 3 NewRec
par_groupby_pipepart tsv \t 3 90000 540000 1170000 par_groupby_pipepart tsv \t 3 90001 540006 1170031
par_groupby_pipepart tsv \t 3 NewRec par_groupby_pipepart tsv \t 3 NewRec
par_groupby_pipepart tsv \t 3 90000 540000 1170000 par_groupby_pipepart tsv \t 3 90001 540006 1170031
par_groupby_pipepart tsv \t 3 NewRec par_groupby_pipepart tsv \t 3 NewRec
par_groupby_pipepart tsv \t 3 90000 540000 1170000 par_groupby_pipepart tsv \t 3 90001 540006 1170031
par_groupby_pipepart tsv \t 3 NewRec par_groupby_pipepart tsv \t 3 NewRec
par_groupby_pipepart tsv \t 3 90000 540000 1170000 par_groupby_pipepart tsv \t 3 90001 540006 1170031
par_groupby_pipepart tsv \t 3 NewRec par_groupby_pipepart tsv \t 3 NewRec
par_groupby_pipepart tsv \t 3 90000 540000 1170000 par_groupby_pipepart tsv \t 3 90001 540006 1170031
par_groupby_pipepart tsv \t 3 NewRec par_groupby_pipepart tsv \t 3 NewRec
par_groupby_pipepart tsv \t 3 90000 540000 1170000 par_groupby_pipepart tsv \t 3 90001 540006 1170031
par_groupby_pipepart tsv \t 3 NewRec
par_groupby_pipepart tsv \t 3 90000 540000 1170000
par_groupby_pipepart tsv \t c1 ### test tsv | --colsep \t --groupby c1 par_groupby_pipepart tsv \t c1 ### test tsv | --colsep \t --groupby c1
par_groupby_pipepart tsv \t c1 NewRec par_groupby_pipepart tsv \t c1 NewRec
par_groupby_pipepart tsv \t c1 90001 540006 1170019 par_groupby_pipepart tsv \t c1 90001 540006 1170031
par_groupby_pipepart tsv \t c1 NewRec par_groupby_pipepart tsv \t c1 NewRec
par_groupby_pipepart tsv \t c1 90000 540000 1170000 par_groupby_pipepart tsv \t c1 90001 540006 1170031
par_groupby_pipepart tsv \t c1 NewRec par_groupby_pipepart tsv \t c1 NewRec
par_groupby_pipepart tsv \t c1 90000 540000 1170000 par_groupby_pipepart tsv \t c1 90001 540006 1170031
par_groupby_pipepart tsv \t c1 NewRec par_groupby_pipepart tsv \t c1 NewRec
par_groupby_pipepart tsv \t c1 90000 540000 1170000 par_groupby_pipepart tsv \t c1 90001 540006 1170031
par_groupby_pipepart tsv \t c1 NewRec par_groupby_pipepart tsv \t c1 NewRec
par_groupby_pipepart tsv \t c1 90000 540000 1170000 par_groupby_pipepart tsv \t c1 90001 540006 1170031
par_groupby_pipepart tsv \t c1 NewRec par_groupby_pipepart tsv \t c1 NewRec
par_groupby_pipepart tsv \t c1 90000 540000 1170000 par_groupby_pipepart tsv \t c1 90001 540006 1170031
par_groupby_pipepart tsv \t c1 NewRec par_groupby_pipepart tsv \t c1 NewRec
par_groupby_pipepart tsv \t c1 90000 540000 1170000 par_groupby_pipepart tsv \t c1 90001 540006 1170031
par_groupby_pipepart tsv \t c1 NewRec par_groupby_pipepart tsv \t c1 NewRec
par_groupby_pipepart tsv \t c1 90000 540000 1170000 par_groupby_pipepart tsv \t c1 90001 540006 1170031
par_groupby_pipepart tsv \t c1 NewRec par_groupby_pipepart tsv \t c1 NewRec
par_groupby_pipepart tsv \t c1 90000 540000 1170000 par_groupby_pipepart tsv \t c1 90001 540006 1170031
par_groupby_pipepart tsv \t c1 NewRec par_groupby_pipepart tsv \t c1 NewRec
par_groupby_pipepart tsv \t c1 90000 540000 1170000 par_groupby_pipepart tsv \t c1 90001 540006 1170031
par_groupby_pipepart tsv \t c1 $_%=2 ### test tsv | --colsep \t --groupby c1 $_%=2 par_groupby_pipepart tsv \t c1 $_%=2 ### test tsv | --colsep \t --groupby c1 $_%=2
par_groupby_pipepart tsv \t c1 $_%=2 NewRec par_groupby_pipepart tsv \t c1 $_%=2 NewRec
par_groupby_pipepart tsv \t c1 $_%=2 90001 540006 1170019 par_groupby_pipepart tsv \t c1 $_%=2 90001 540006 1170031
par_groupby_pipepart tsv \t c1 $_%=2 NewRec par_groupby_pipepart tsv \t c1 $_%=2 NewRec
par_groupby_pipepart tsv \t c1 $_%=2 90000 540000 1170000 par_groupby_pipepart tsv \t c1 $_%=2 90001 540006 1170031
par_groupby_pipepart tsv \t c1 $_%=2 NewRec par_groupby_pipepart tsv \t c1 $_%=2 NewRec
par_groupby_pipepart tsv \t c1 $_%=2 90000 540000 1170000 par_groupby_pipepart tsv \t c1 $_%=2 90001 540006 1170031
par_groupby_pipepart tsv \t c1 $_%=2 NewRec par_groupby_pipepart tsv \t c1 $_%=2 NewRec
par_groupby_pipepart tsv \t c1 $_%=2 90000 540000 1170000 par_groupby_pipepart tsv \t c1 $_%=2 90001 540006 1170031
par_groupby_pipepart tsv \t c1 $_%=2 NewRec par_groupby_pipepart tsv \t c1 $_%=2 NewRec
par_groupby_pipepart tsv \t c1 $_%=2 90000 540000 1170000 par_groupby_pipepart tsv \t c1 $_%=2 90001 540006 1170031
par_groupby_pipepart tsv \t c1 $_%=2 NewRec par_groupby_pipepart tsv \t c1 $_%=2 NewRec
par_groupby_pipepart tsv \t c1 $_%=2 90000 540000 1170000 par_groupby_pipepart tsv \t c1 $_%=2 90001 540006 1170031
par_groupby_pipepart tsv \t c1 $_%=2 NewRec par_groupby_pipepart tsv \t c1 $_%=2 NewRec
par_groupby_pipepart tsv \t c1 $_%=2 90000 540000 1170000 par_groupby_pipepart tsv \t c1 $_%=2 90001 540006 1170031
par_groupby_pipepart tsv \t c1 $_%=2 NewRec par_groupby_pipepart tsv \t c1 $_%=2 NewRec
par_groupby_pipepart tsv \t c1 $_%=2 90000 540000 1170000 par_groupby_pipepart tsv \t c1 $_%=2 90001 540006 1170031
par_groupby_pipepart tsv \t c1 $_%=2 NewRec par_groupby_pipepart tsv \t c1 $_%=2 NewRec
par_groupby_pipepart tsv \t c1 $_%=2 90000 540000 1170000 par_groupby_pipepart tsv \t c1 $_%=2 90001 540006 1170031
par_groupby_pipepart tsv \t c1 $_%=2 NewRec par_groupby_pipepart tsv \t c1 $_%=2 NewRec
par_groupby_pipepart tsv \t c1 $_%=2 90000 540000 1170000 par_groupby_pipepart tsv \t c1 $_%=2 90001 540006 1170031
par_groupby_pipepart tsv \t s/^(\d+[\t ,]+){2}(\d+).*/$2/ ### test tsv | --colsep \t --groupby s/^(\d+[\t ,]+){2}(\d+).*/$2/ par_groupby_pipepart tsv \t s/^(\d+[\t ,]+){2}(\d+).*/$2/ ### test tsv | --colsep \t --groupby s/^(\d+[\t ,]+){2}(\d+).*/$2/
par_groupby_pipepart tsv \t s/^(\d+[\t ,]+){2}(\d+).*/$2/ NewRec par_groupby_pipepart tsv \t s/^(\d+[\t ,]+){2}(\d+).*/$2/ NewRec
par_groupby_pipepart tsv \t s/^(\d+[\t ,]+){2}(\d+).*/$2/ 1 6 19 par_groupby_pipepart tsv \t s/^(\d+[\t ,]+){2}(\d+).*/$2/ 90001 540006 1170031
par_groupby_pipepart tsv \t s/^(\d+[\t ,]+){2}(\d+).*/$2/ NewRec par_groupby_pipepart tsv \t s/^(\d+[\t ,]+){2}(\d+).*/$2/ NewRec
par_groupby_pipepart tsv \t s/^(\d+[\t ,]+){2}(\d+).*/$2/ 90000 540000 1170000 par_groupby_pipepart tsv \t s/^(\d+[\t ,]+){2}(\d+).*/$2/ 90001 540006 1170031
par_groupby_pipepart tsv \t s/^(\d+[\t ,]+){2}(\d+).*/$2/ NewRec par_groupby_pipepart tsv \t s/^(\d+[\t ,]+){2}(\d+).*/$2/ NewRec
par_groupby_pipepart tsv \t s/^(\d+[\t ,]+){2}(\d+).*/$2/ 90000 540000 1170000 par_groupby_pipepart tsv \t s/^(\d+[\t ,]+){2}(\d+).*/$2/ 90001 540006 1170031
par_groupby_pipepart tsv \t s/^(\d+[\t ,]+){2}(\d+).*/$2/ NewRec par_groupby_pipepart tsv \t s/^(\d+[\t ,]+){2}(\d+).*/$2/ NewRec
par_groupby_pipepart tsv \t s/^(\d+[\t ,]+){2}(\d+).*/$2/ 90000 540000 1170000 par_groupby_pipepart tsv \t s/^(\d+[\t ,]+){2}(\d+).*/$2/ 90001 540006 1170031
par_groupby_pipepart tsv \t s/^(\d+[\t ,]+){2}(\d+).*/$2/ NewRec par_groupby_pipepart tsv \t s/^(\d+[\t ,]+){2}(\d+).*/$2/ NewRec
par_groupby_pipepart tsv \t s/^(\d+[\t ,]+){2}(\d+).*/$2/ 90000 540000 1170000 par_groupby_pipepart tsv \t s/^(\d+[\t ,]+){2}(\d+).*/$2/ 90001 540006 1170031
par_groupby_pipepart tsv \t s/^(\d+[\t ,]+){2}(\d+).*/$2/ NewRec par_groupby_pipepart tsv \t s/^(\d+[\t ,]+){2}(\d+).*/$2/ NewRec
par_groupby_pipepart tsv \t s/^(\d+[\t ,]+){2}(\d+).*/$2/ 90000 540000 1170000 par_groupby_pipepart tsv \t s/^(\d+[\t ,]+){2}(\d+).*/$2/ 90001 540006 1170031
par_groupby_pipepart tsv \t s/^(\d+[\t ,]+){2}(\d+).*/$2/ NewRec par_groupby_pipepart tsv \t s/^(\d+[\t ,]+){2}(\d+).*/$2/ NewRec
par_groupby_pipepart tsv \t s/^(\d+[\t ,]+){2}(\d+).*/$2/ 90000 540000 1170000 par_groupby_pipepart tsv \t s/^(\d+[\t ,]+){2}(\d+).*/$2/ 90001 540006 1170031
par_groupby_pipepart tsv \t s/^(\d+[\t ,]+){2}(\d+).*/$2/ NewRec par_groupby_pipepart tsv \t s/^(\d+[\t ,]+){2}(\d+).*/$2/ NewRec
par_groupby_pipepart tsv \t s/^(\d+[\t ,]+){2}(\d+).*/$2/ 90000 540000 1170000 par_groupby_pipepart tsv \t s/^(\d+[\t ,]+){2}(\d+).*/$2/ 90001 540006 1170031
par_groupby_pipepart tsv \t s/^(\d+[\t ,]+){2}(\d+).*/$2/ NewRec par_groupby_pipepart tsv \t s/^(\d+[\t ,]+){2}(\d+).*/$2/ NewRec
par_groupby_pipepart tsv \t s/^(\d+[\t ,]+){2}(\d+).*/$2/ 90000 540000 1170000 par_groupby_pipepart tsv \t s/^(\d+[\t ,]+){2}(\d+).*/$2/ 90001 540006 1170031
par_groupby_pipepart tsv \t s/^(\d+[\t ,]+){2}(\d+).*/$2/ NewRec par_groupby_pipepart tsv \t s/^(\d+[\t ,]+){2}(\d+).*/$2/ NewRec
par_groupby_pipepart tsv \t s/^(\d+[\t ,]+){2}(\d+).*/$2/ 90000 540000 1170000 par_groupby_pipepart tsv \t s/^(\d+[\t ,]+){2}(\d+).*/$2/ 90001 540006 1170031
par_groupby_pipepart tsv \t s/^(\d+[\t ,]+){2}(\d+).*/$2/ NewRec
par_groupby_pipepart tsv \t s/^(\d+[\t ,]+){2}(\d+).*/$2/ 90000 540000 1170000
par_groupby_pipepart ssv \s+ 3 $_%=2 ### test ssv | --colsep \s+ --groupby 3 $_%=2 par_groupby_pipepart ssv \s+ 3 $_%=2 ### test ssv | --colsep \s+ --groupby 3 $_%=2
par_groupby_pipepart ssv \s+ 3 $_%=2 NewRec par_groupby_pipepart ssv \s+ 3 $_%=2 NewRec
par_groupby_pipepart ssv \s+ 3 $_%=2 1 6 19 par_groupby_pipepart ssv \s+ 3 $_%=2 90001 540006 1170031
par_groupby_pipepart ssv \s+ 3 $_%=2 NewRec par_groupby_pipepart ssv \s+ 3 $_%=2 NewRec
par_groupby_pipepart ssv \s+ 3 $_%=2 90000 540000 1170000 par_groupby_pipepart ssv \s+ 3 $_%=2 90001 540006 1170031
par_groupby_pipepart ssv \s+ 3 $_%=2 NewRec par_groupby_pipepart ssv \s+ 3 $_%=2 NewRec
par_groupby_pipepart ssv \s+ 3 $_%=2 90000 540000 1170000 par_groupby_pipepart ssv \s+ 3 $_%=2 90001 540006 1170031
par_groupby_pipepart ssv \s+ 3 $_%=2 NewRec par_groupby_pipepart ssv \s+ 3 $_%=2 NewRec
par_groupby_pipepart ssv \s+ 3 $_%=2 90000 540000 1170000 par_groupby_pipepart ssv \s+ 3 $_%=2 90001 540006 1170031
par_groupby_pipepart ssv \s+ 3 $_%=2 NewRec par_groupby_pipepart ssv \s+ 3 $_%=2 NewRec
par_groupby_pipepart ssv \s+ 3 $_%=2 90000 540000 1170000 par_groupby_pipepart ssv \s+ 3 $_%=2 90001 540006 1170031
par_groupby_pipepart ssv \s+ 3 $_%=2 NewRec par_groupby_pipepart ssv \s+ 3 $_%=2 NewRec
par_groupby_pipepart ssv \s+ 3 $_%=2 90000 540000 1170000 par_groupby_pipepart ssv \s+ 3 $_%=2 90001 540006 1170031
par_groupby_pipepart ssv \s+ 3 $_%=2 NewRec par_groupby_pipepart ssv \s+ 3 $_%=2 NewRec
par_groupby_pipepart ssv \s+ 3 $_%=2 90000 540000 1170000 par_groupby_pipepart ssv \s+ 3 $_%=2 90001 540006 1170031
par_groupby_pipepart ssv \s+ 3 $_%=2 NewRec par_groupby_pipepart ssv \s+ 3 $_%=2 NewRec
par_groupby_pipepart ssv \s+ 3 $_%=2 90000 540000 1170000 par_groupby_pipepart ssv \s+ 3 $_%=2 90001 540006 1170031
par_groupby_pipepart ssv \s+ 3 $_%=2 NewRec par_groupby_pipepart ssv \s+ 3 $_%=2 NewRec
par_groupby_pipepart ssv \s+ 3 $_%=2 90000 540000 1170000 par_groupby_pipepart ssv \s+ 3 $_%=2 90001 540006 1170031
par_groupby_pipepart ssv \s+ 3 $_%=2 NewRec par_groupby_pipepart ssv \s+ 3 $_%=2 NewRec
par_groupby_pipepart ssv \s+ 3 $_%=2 90000 540000 1170000 par_groupby_pipepart ssv \s+ 3 $_%=2 90001 540006 1170031
par_groupby_pipepart ssv \s+ 3 $_%=2 NewRec
par_groupby_pipepart ssv \s+ 3 $_%=2 90000 540000 1170000
par_groupby_pipepart ssv \s+ 3 ### test ssv | --colsep \s+ --groupby 3 par_groupby_pipepart ssv \s+ 3 ### test ssv | --colsep \s+ --groupby 3
par_groupby_pipepart ssv \s+ 3 NewRec par_groupby_pipepart ssv \s+ 3 NewRec
par_groupby_pipepart ssv \s+ 3 1 6 19 par_groupby_pipepart ssv \s+ 3 90001 540006 1170031
par_groupby_pipepart ssv \s+ 3 NewRec par_groupby_pipepart ssv \s+ 3 NewRec
par_groupby_pipepart ssv \s+ 3 90000 540000 1170000 par_groupby_pipepart ssv \s+ 3 90001 540006 1170031
par_groupby_pipepart ssv \s+ 3 NewRec par_groupby_pipepart ssv \s+ 3 NewRec
par_groupby_pipepart ssv \s+ 3 90000 540000 1170000 par_groupby_pipepart ssv \s+ 3 90001 540006 1170031
par_groupby_pipepart ssv \s+ 3 NewRec par_groupby_pipepart ssv \s+ 3 NewRec
par_groupby_pipepart ssv \s+ 3 90000 540000 1170000 par_groupby_pipepart ssv \s+ 3 90001 540006 1170031
par_groupby_pipepart ssv \s+ 3 NewRec par_groupby_pipepart ssv \s+ 3 NewRec
par_groupby_pipepart ssv \s+ 3 90000 540000 1170000 par_groupby_pipepart ssv \s+ 3 90001 540006 1170031
par_groupby_pipepart ssv \s+ 3 NewRec par_groupby_pipepart ssv \s+ 3 NewRec
par_groupby_pipepart ssv \s+ 3 90000 540000 1170000 par_groupby_pipepart ssv \s+ 3 90001 540006 1170031
par_groupby_pipepart ssv \s+ 3 NewRec par_groupby_pipepart ssv \s+ 3 NewRec
par_groupby_pipepart ssv \s+ 3 90000 540000 1170000 par_groupby_pipepart ssv \s+ 3 90001 540006 1170031
par_groupby_pipepart ssv \s+ 3 NewRec par_groupby_pipepart ssv \s+ 3 NewRec
par_groupby_pipepart ssv \s+ 3 90000 540000 1170000 par_groupby_pipepart ssv \s+ 3 90001 540006 1170031
par_groupby_pipepart ssv \s+ 3 NewRec par_groupby_pipepart ssv \s+ 3 NewRec
par_groupby_pipepart ssv \s+ 3 90000 540000 1170000 par_groupby_pipepart ssv \s+ 3 90001 540006 1170031
par_groupby_pipepart ssv \s+ 3 NewRec par_groupby_pipepart ssv \s+ 3 NewRec
par_groupby_pipepart ssv \s+ 3 90000 540000 1170000 par_groupby_pipepart ssv \s+ 3 90001 540006 1170031
par_groupby_pipepart ssv \s+ 3 NewRec
par_groupby_pipepart ssv \s+ 3 90000 540000 1170000
par_groupby_pipepart ssv \s+ c1 ### test ssv | --colsep \s+ --groupby c1 par_groupby_pipepart ssv \s+ c1 ### test ssv | --colsep \s+ --groupby c1
par_groupby_pipepart ssv \s+ c1 NewRec par_groupby_pipepart ssv \s+ c1 NewRec
par_groupby_pipepart ssv \s+ c1 90001 540006 1170019 par_groupby_pipepart ssv \s+ c1 90001 540006 1170031
par_groupby_pipepart ssv \s+ c1 NewRec par_groupby_pipepart ssv \s+ c1 NewRec
par_groupby_pipepart ssv \s+ c1 90000 540000 1170000 par_groupby_pipepart ssv \s+ c1 90001 540006 1170031
par_groupby_pipepart ssv \s+ c1 NewRec par_groupby_pipepart ssv \s+ c1 NewRec
par_groupby_pipepart ssv \s+ c1 90000 540000 1170000 par_groupby_pipepart ssv \s+ c1 90001 540006 1170031
par_groupby_pipepart ssv \s+ c1 NewRec par_groupby_pipepart ssv \s+ c1 NewRec
par_groupby_pipepart ssv \s+ c1 90000 540000 1170000 par_groupby_pipepart ssv \s+ c1 90001 540006 1170031
par_groupby_pipepart ssv \s+ c1 NewRec par_groupby_pipepart ssv \s+ c1 NewRec
par_groupby_pipepart ssv \s+ c1 90000 540000 1170000 par_groupby_pipepart ssv \s+ c1 90001 540006 1170031
par_groupby_pipepart ssv \s+ c1 NewRec par_groupby_pipepart ssv \s+ c1 NewRec
par_groupby_pipepart ssv \s+ c1 90000 540000 1170000 par_groupby_pipepart ssv \s+ c1 90001 540006 1170031
par_groupby_pipepart ssv \s+ c1 NewRec par_groupby_pipepart ssv \s+ c1 NewRec
par_groupby_pipepart ssv \s+ c1 90000 540000 1170000 par_groupby_pipepart ssv \s+ c1 90001 540006 1170031
par_groupby_pipepart ssv \s+ c1 NewRec par_groupby_pipepart ssv \s+ c1 NewRec
par_groupby_pipepart ssv \s+ c1 90000 540000 1170000 par_groupby_pipepart ssv \s+ c1 90001 540006 1170031
par_groupby_pipepart ssv \s+ c1 NewRec par_groupby_pipepart ssv \s+ c1 NewRec
par_groupby_pipepart ssv \s+ c1 90000 540000 1170000 par_groupby_pipepart ssv \s+ c1 90001 540006 1170031
par_groupby_pipepart ssv \s+ c1 NewRec par_groupby_pipepart ssv \s+ c1 NewRec
par_groupby_pipepart ssv \s+ c1 90000 540000 1170000 par_groupby_pipepart ssv \s+ c1 90001 540006 1170031
par_groupby_pipepart ssv \s+ c1 $_%=2 ### test ssv | --colsep \s+ --groupby c1 $_%=2 par_groupby_pipepart ssv \s+ c1 $_%=2 ### test ssv | --colsep \s+ --groupby c1 $_%=2
par_groupby_pipepart ssv \s+ c1 $_%=2 NewRec par_groupby_pipepart ssv \s+ c1 $_%=2 NewRec
par_groupby_pipepart ssv \s+ c1 $_%=2 90001 540006 1170019 par_groupby_pipepart ssv \s+ c1 $_%=2 90001 540006 1170031
par_groupby_pipepart ssv \s+ c1 $_%=2 NewRec par_groupby_pipepart ssv \s+ c1 $_%=2 NewRec
par_groupby_pipepart ssv \s+ c1 $_%=2 90000 540000 1170000 par_groupby_pipepart ssv \s+ c1 $_%=2 90001 540006 1170031
par_groupby_pipepart ssv \s+ c1 $_%=2 NewRec par_groupby_pipepart ssv \s+ c1 $_%=2 NewRec
par_groupby_pipepart ssv \s+ c1 $_%=2 90000 540000 1170000 par_groupby_pipepart ssv \s+ c1 $_%=2 90001 540006 1170031
par_groupby_pipepart ssv \s+ c1 $_%=2 NewRec par_groupby_pipepart ssv \s+ c1 $_%=2 NewRec
par_groupby_pipepart ssv \s+ c1 $_%=2 90000 540000 1170000 par_groupby_pipepart ssv \s+ c1 $_%=2 90001 540006 1170031
par_groupby_pipepart ssv \s+ c1 $_%=2 NewRec par_groupby_pipepart ssv \s+ c1 $_%=2 NewRec
par_groupby_pipepart ssv \s+ c1 $_%=2 90000 540000 1170000 par_groupby_pipepart ssv \s+ c1 $_%=2 90001 540006 1170031
par_groupby_pipepart ssv \s+ c1 $_%=2 NewRec par_groupby_pipepart ssv \s+ c1 $_%=2 NewRec
par_groupby_pipepart ssv \s+ c1 $_%=2 90000 540000 1170000 par_groupby_pipepart ssv \s+ c1 $_%=2 90001 540006 1170031
par_groupby_pipepart ssv \s+ c1 $_%=2 NewRec par_groupby_pipepart ssv \s+ c1 $_%=2 NewRec
par_groupby_pipepart ssv \s+ c1 $_%=2 90000 540000 1170000 par_groupby_pipepart ssv \s+ c1 $_%=2 90001 540006 1170031
par_groupby_pipepart ssv \s+ c1 $_%=2 NewRec par_groupby_pipepart ssv \s+ c1 $_%=2 NewRec
par_groupby_pipepart ssv \s+ c1 $_%=2 90000 540000 1170000 par_groupby_pipepart ssv \s+ c1 $_%=2 90001 540006 1170031
par_groupby_pipepart ssv \s+ c1 $_%=2 NewRec par_groupby_pipepart ssv \s+ c1 $_%=2 NewRec
par_groupby_pipepart ssv \s+ c1 $_%=2 90000 540000 1170000 par_groupby_pipepart ssv \s+ c1 $_%=2 90001 540006 1170031
par_groupby_pipepart ssv \s+ c1 $_%=2 NewRec par_groupby_pipepart ssv \s+ c1 $_%=2 NewRec
par_groupby_pipepart ssv \s+ c1 $_%=2 90000 540000 1170000 par_groupby_pipepart ssv \s+ c1 $_%=2 90001 540006 1170031
par_groupby_pipepart ssv \s+ s/^(\d+[\t ,]+){2}(\d+).*/$2/ ### test ssv | --colsep \s+ --groupby s/^(\d+[\t ,]+){2}(\d+).*/$2/ par_groupby_pipepart ssv \s+ s/^(\d+[\t ,]+){2}(\d+).*/$2/ ### test ssv | --colsep \s+ --groupby s/^(\d+[\t ,]+){2}(\d+).*/$2/
par_groupby_pipepart ssv \s+ s/^(\d+[\t ,]+){2}(\d+).*/$2/ NewRec par_groupby_pipepart ssv \s+ s/^(\d+[\t ,]+){2}(\d+).*/$2/ NewRec
par_groupby_pipepart ssv \s+ s/^(\d+[\t ,]+){2}(\d+).*/$2/ 1 6 19 par_groupby_pipepart ssv \s+ s/^(\d+[\t ,]+){2}(\d+).*/$2/ 90001 540006 1170031
par_groupby_pipepart ssv \s+ s/^(\d+[\t ,]+){2}(\d+).*/$2/ NewRec par_groupby_pipepart ssv \s+ s/^(\d+[\t ,]+){2}(\d+).*/$2/ NewRec
par_groupby_pipepart ssv \s+ s/^(\d+[\t ,]+){2}(\d+).*/$2/ 90000 540000 1170000 par_groupby_pipepart ssv \s+ s/^(\d+[\t ,]+){2}(\d+).*/$2/ 90001 540006 1170031
par_groupby_pipepart ssv \s+ s/^(\d+[\t ,]+){2}(\d+).*/$2/ NewRec par_groupby_pipepart ssv \s+ s/^(\d+[\t ,]+){2}(\d+).*/$2/ NewRec
par_groupby_pipepart ssv \s+ s/^(\d+[\t ,]+){2}(\d+).*/$2/ 90000 540000 1170000 par_groupby_pipepart ssv \s+ s/^(\d+[\t ,]+){2}(\d+).*/$2/ 90001 540006 1170031
par_groupby_pipepart ssv \s+ s/^(\d+[\t ,]+){2}(\d+).*/$2/ NewRec par_groupby_pipepart ssv \s+ s/^(\d+[\t ,]+){2}(\d+).*/$2/ NewRec
par_groupby_pipepart ssv \s+ s/^(\d+[\t ,]+){2}(\d+).*/$2/ 90000 540000 1170000 par_groupby_pipepart ssv \s+ s/^(\d+[\t ,]+){2}(\d+).*/$2/ 90001 540006 1170031
par_groupby_pipepart ssv \s+ s/^(\d+[\t ,]+){2}(\d+).*/$2/ NewRec par_groupby_pipepart ssv \s+ s/^(\d+[\t ,]+){2}(\d+).*/$2/ NewRec
par_groupby_pipepart ssv \s+ s/^(\d+[\t ,]+){2}(\d+).*/$2/ 90000 540000 1170000 par_groupby_pipepart ssv \s+ s/^(\d+[\t ,]+){2}(\d+).*/$2/ 90001 540006 1170031
par_groupby_pipepart ssv \s+ s/^(\d+[\t ,]+){2}(\d+).*/$2/ NewRec par_groupby_pipepart ssv \s+ s/^(\d+[\t ,]+){2}(\d+).*/$2/ NewRec
par_groupby_pipepart ssv \s+ s/^(\d+[\t ,]+){2}(\d+).*/$2/ 90000 540000 1170000 par_groupby_pipepart ssv \s+ s/^(\d+[\t ,]+){2}(\d+).*/$2/ 90001 540006 1170031
par_groupby_pipepart ssv \s+ s/^(\d+[\t ,]+){2}(\d+).*/$2/ NewRec par_groupby_pipepart ssv \s+ s/^(\d+[\t ,]+){2}(\d+).*/$2/ NewRec
par_groupby_pipepart ssv \s+ s/^(\d+[\t ,]+){2}(\d+).*/$2/ 90000 540000 1170000 par_groupby_pipepart ssv \s+ s/^(\d+[\t ,]+){2}(\d+).*/$2/ 90001 540006 1170031
par_groupby_pipepart ssv \s+ s/^(\d+[\t ,]+){2}(\d+).*/$2/ NewRec par_groupby_pipepart ssv \s+ s/^(\d+[\t ,]+){2}(\d+).*/$2/ NewRec
par_groupby_pipepart ssv \s+ s/^(\d+[\t ,]+){2}(\d+).*/$2/ 90000 540000 1170000 par_groupby_pipepart ssv \s+ s/^(\d+[\t ,]+){2}(\d+).*/$2/ 90001 540006 1170031
par_groupby_pipepart ssv \s+ s/^(\d+[\t ,]+){2}(\d+).*/$2/ NewRec par_groupby_pipepart ssv \s+ s/^(\d+[\t ,]+){2}(\d+).*/$2/ NewRec
par_groupby_pipepart ssv \s+ s/^(\d+[\t ,]+){2}(\d+).*/$2/ 90000 540000 1170000 par_groupby_pipepart ssv \s+ s/^(\d+[\t ,]+){2}(\d+).*/$2/ 90001 540006 1170031
par_groupby_pipepart ssv \s+ s/^(\d+[\t ,]+){2}(\d+).*/$2/ NewRec par_groupby_pipepart ssv \s+ s/^(\d+[\t ,]+){2}(\d+).*/$2/ NewRec
par_groupby_pipepart ssv \s+ s/^(\d+[\t ,]+){2}(\d+).*/$2/ 90000 540000 1170000 par_groupby_pipepart ssv \s+ s/^(\d+[\t ,]+){2}(\d+).*/$2/ 90001 540006 1170031
par_groupby_pipepart ssv \s+ s/^(\d+[\t ,]+){2}(\d+).*/$2/ NewRec
par_groupby_pipepart ssv \s+ s/^(\d+[\t ,]+){2}(\d+).*/$2/ 90000 540000 1170000
par_groupby_pipepart cssv [\s,]+ 3 $_%=2 ### test cssv | --colsep [\s,]+ --groupby 3 $_%=2 par_groupby_pipepart cssv [\s,]+ 3 $_%=2 ### test cssv | --colsep [\s,]+ --groupby 3 $_%=2
par_groupby_pipepart cssv [\s,]+ 3 $_%=2 NewRec par_groupby_pipepart cssv [\s,]+ 3 $_%=2 NewRec
par_groupby_pipepart cssv [\s,]+ 3 $_%=2 1 6 25 par_groupby_pipepart cssv [\s,]+ 3 $_%=2 90001 540006 1710037
par_groupby_pipepart cssv [\s,]+ 3 $_%=2 NewRec par_groupby_pipepart cssv [\s,]+ 3 $_%=2 NewRec
par_groupby_pipepart cssv [\s,]+ 3 $_%=2 90000 540000 1710000 par_groupby_pipepart cssv [\s,]+ 3 $_%=2 90001 540006 1710037
par_groupby_pipepart cssv [\s,]+ 3 $_%=2 NewRec par_groupby_pipepart cssv [\s,]+ 3 $_%=2 NewRec
par_groupby_pipepart cssv [\s,]+ 3 $_%=2 90000 540000 1710000 par_groupby_pipepart cssv [\s,]+ 3 $_%=2 90001 540006 1710037
par_groupby_pipepart cssv [\s,]+ 3 $_%=2 NewRec par_groupby_pipepart cssv [\s,]+ 3 $_%=2 NewRec
par_groupby_pipepart cssv [\s,]+ 3 $_%=2 90000 540000 1710000 par_groupby_pipepart cssv [\s,]+ 3 $_%=2 90001 540006 1710037
par_groupby_pipepart cssv [\s,]+ 3 $_%=2 NewRec par_groupby_pipepart cssv [\s,]+ 3 $_%=2 NewRec
par_groupby_pipepart cssv [\s,]+ 3 $_%=2 90000 540000 1710000 par_groupby_pipepart cssv [\s,]+ 3 $_%=2 90001 540006 1710037
par_groupby_pipepart cssv [\s,]+ 3 $_%=2 NewRec par_groupby_pipepart cssv [\s,]+ 3 $_%=2 NewRec
par_groupby_pipepart cssv [\s,]+ 3 $_%=2 90000 540000 1710000 par_groupby_pipepart cssv [\s,]+ 3 $_%=2 90001 540006 1710037
par_groupby_pipepart cssv [\s,]+ 3 $_%=2 NewRec par_groupby_pipepart cssv [\s,]+ 3 $_%=2 NewRec
par_groupby_pipepart cssv [\s,]+ 3 $_%=2 90000 540000 1710000 par_groupby_pipepart cssv [\s,]+ 3 $_%=2 90001 540006 1710037
par_groupby_pipepart cssv [\s,]+ 3 $_%=2 NewRec par_groupby_pipepart cssv [\s,]+ 3 $_%=2 NewRec
par_groupby_pipepart cssv [\s,]+ 3 $_%=2 90000 540000 1710000 par_groupby_pipepart cssv [\s,]+ 3 $_%=2 90001 540006 1710037
par_groupby_pipepart cssv [\s,]+ 3 $_%=2 NewRec par_groupby_pipepart cssv [\s,]+ 3 $_%=2 NewRec
par_groupby_pipepart cssv [\s,]+ 3 $_%=2 90000 540000 1710000 par_groupby_pipepart cssv [\s,]+ 3 $_%=2 90001 540006 1710037
par_groupby_pipepart cssv [\s,]+ 3 $_%=2 NewRec par_groupby_pipepart cssv [\s,]+ 3 $_%=2 NewRec
par_groupby_pipepart cssv [\s,]+ 3 $_%=2 90000 540000 1710000 par_groupby_pipepart cssv [\s,]+ 3 $_%=2 90001 540006 1710037
par_groupby_pipepart cssv [\s,]+ 3 $_%=2 NewRec
par_groupby_pipepart cssv [\s,]+ 3 $_%=2 90000 540000 1710000
par_groupby_pipepart cssv [\s,]+ 3 ### test cssv | --colsep [\s,]+ --groupby 3 par_groupby_pipepart cssv [\s,]+ 3 ### test cssv | --colsep [\s,]+ --groupby 3
par_groupby_pipepart cssv [\s,]+ 3 NewRec par_groupby_pipepart cssv [\s,]+ 3 NewRec
par_groupby_pipepart cssv [\s,]+ 3 1 6 25 par_groupby_pipepart cssv [\s,]+ 3 90001 540006 1710037
par_groupby_pipepart cssv [\s,]+ 3 NewRec par_groupby_pipepart cssv [\s,]+ 3 NewRec
par_groupby_pipepart cssv [\s,]+ 3 90000 540000 1710000 par_groupby_pipepart cssv [\s,]+ 3 90001 540006 1710037
par_groupby_pipepart cssv [\s,]+ 3 NewRec par_groupby_pipepart cssv [\s,]+ 3 NewRec
par_groupby_pipepart cssv [\s,]+ 3 90000 540000 1710000 par_groupby_pipepart cssv [\s,]+ 3 90001 540006 1710037
par_groupby_pipepart cssv [\s,]+ 3 NewRec par_groupby_pipepart cssv [\s,]+ 3 NewRec
par_groupby_pipepart cssv [\s,]+ 3 90000 540000 1710000 par_groupby_pipepart cssv [\s,]+ 3 90001 540006 1710037
par_groupby_pipepart cssv [\s,]+ 3 NewRec par_groupby_pipepart cssv [\s,]+ 3 NewRec
par_groupby_pipepart cssv [\s,]+ 3 90000 540000 1710000 par_groupby_pipepart cssv [\s,]+ 3 90001 540006 1710037
par_groupby_pipepart cssv [\s,]+ 3 NewRec par_groupby_pipepart cssv [\s,]+ 3 NewRec
par_groupby_pipepart cssv [\s,]+ 3 90000 540000 1710000 par_groupby_pipepart cssv [\s,]+ 3 90001 540006 1710037
par_groupby_pipepart cssv [\s,]+ 3 NewRec par_groupby_pipepart cssv [\s,]+ 3 NewRec
par_groupby_pipepart cssv [\s,]+ 3 90000 540000 1710000 par_groupby_pipepart cssv [\s,]+ 3 90001 540006 1710037
par_groupby_pipepart cssv [\s,]+ 3 NewRec par_groupby_pipepart cssv [\s,]+ 3 NewRec
par_groupby_pipepart cssv [\s,]+ 3 90000 540000 1710000 par_groupby_pipepart cssv [\s,]+ 3 90001 540006 1710037
par_groupby_pipepart cssv [\s,]+ 3 NewRec par_groupby_pipepart cssv [\s,]+ 3 NewRec
par_groupby_pipepart cssv [\s,]+ 3 90000 540000 1710000 par_groupby_pipepart cssv [\s,]+ 3 90001 540006 1710037
par_groupby_pipepart cssv [\s,]+ 3 NewRec par_groupby_pipepart cssv [\s,]+ 3 NewRec
par_groupby_pipepart cssv [\s,]+ 3 90000 540000 1710000 par_groupby_pipepart cssv [\s,]+ 3 90001 540006 1710037
par_groupby_pipepart cssv [\s,]+ 3 NewRec
par_groupby_pipepart cssv [\s,]+ 3 90000 540000 1710000
par_groupby_pipepart cssv [\s,]+ c1 ### test cssv | --colsep [\s,]+ --groupby c1 par_groupby_pipepart cssv [\s,]+ c1 ### test cssv | --colsep [\s,]+ --groupby c1
par_groupby_pipepart cssv [\s,]+ c1 NewRec par_groupby_pipepart cssv [\s,]+ c1 NewRec
par_groupby_pipepart cssv [\s,]+ c1 90001 540006 1710025 par_groupby_pipepart cssv [\s,]+ c1 90001 540006 1710037
par_groupby_pipepart cssv [\s,]+ c1 NewRec par_groupby_pipepart cssv [\s,]+ c1 NewRec
par_groupby_pipepart cssv [\s,]+ c1 90000 540000 1710000 par_groupby_pipepart cssv [\s,]+ c1 90001 540006 1710037
par_groupby_pipepart cssv [\s,]+ c1 NewRec par_groupby_pipepart cssv [\s,]+ c1 NewRec
par_groupby_pipepart cssv [\s,]+ c1 90000 540000 1710000 par_groupby_pipepart cssv [\s,]+ c1 90001 540006 1710037
par_groupby_pipepart cssv [\s,]+ c1 NewRec par_groupby_pipepart cssv [\s,]+ c1 NewRec
par_groupby_pipepart cssv [\s,]+ c1 90000 540000 1710000 par_groupby_pipepart cssv [\s,]+ c1 90001 540006 1710037
par_groupby_pipepart cssv [\s,]+ c1 NewRec par_groupby_pipepart cssv [\s,]+ c1 NewRec
par_groupby_pipepart cssv [\s,]+ c1 90000 540000 1710000 par_groupby_pipepart cssv [\s,]+ c1 90001 540006 1710037
par_groupby_pipepart cssv [\s,]+ c1 NewRec par_groupby_pipepart cssv [\s,]+ c1 NewRec
par_groupby_pipepart cssv [\s,]+ c1 90000 540000 1710000 par_groupby_pipepart cssv [\s,]+ c1 90001 540006 1710037
par_groupby_pipepart cssv [\s,]+ c1 NewRec par_groupby_pipepart cssv [\s,]+ c1 NewRec
par_groupby_pipepart cssv [\s,]+ c1 90000 540000 1710000 par_groupby_pipepart cssv [\s,]+ c1 90001 540006 1710037
par_groupby_pipepart cssv [\s,]+ c1 NewRec par_groupby_pipepart cssv [\s,]+ c1 NewRec
par_groupby_pipepart cssv [\s,]+ c1 90000 540000 1710000 par_groupby_pipepart cssv [\s,]+ c1 90001 540006 1710037
par_groupby_pipepart cssv [\s,]+ c1 NewRec par_groupby_pipepart cssv [\s,]+ c1 NewRec
par_groupby_pipepart cssv [\s,]+ c1 90000 540000 1710000 par_groupby_pipepart cssv [\s,]+ c1 90001 540006 1710037
par_groupby_pipepart cssv [\s,]+ c1 NewRec par_groupby_pipepart cssv [\s,]+ c1 NewRec
par_groupby_pipepart cssv [\s,]+ c1 90000 540000 1710000 par_groupby_pipepart cssv [\s,]+ c1 90001 540006 1710037
par_groupby_pipepart cssv [\s,]+ c1 $_%=2 ### test cssv | --colsep [\s,]+ --groupby c1 $_%=2 par_groupby_pipepart cssv [\s,]+ c1 $_%=2 ### test cssv | --colsep [\s,]+ --groupby c1 $_%=2
par_groupby_pipepart cssv [\s,]+ c1 $_%=2 NewRec par_groupby_pipepart cssv [\s,]+ c1 $_%=2 NewRec
par_groupby_pipepart cssv [\s,]+ c1 $_%=2 90001 540006 1710025 par_groupby_pipepart cssv [\s,]+ c1 $_%=2 90001 540006 1710037
par_groupby_pipepart cssv [\s,]+ c1 $_%=2 NewRec par_groupby_pipepart cssv [\s,]+ c1 $_%=2 NewRec
par_groupby_pipepart cssv [\s,]+ c1 $_%=2 90000 540000 1710000 par_groupby_pipepart cssv [\s,]+ c1 $_%=2 90001 540006 1710037
par_groupby_pipepart cssv [\s,]+ c1 $_%=2 NewRec par_groupby_pipepart cssv [\s,]+ c1 $_%=2 NewRec
par_groupby_pipepart cssv [\s,]+ c1 $_%=2 90000 540000 1710000 par_groupby_pipepart cssv [\s,]+ c1 $_%=2 90001 540006 1710037
par_groupby_pipepart cssv [\s,]+ c1 $_%=2 NewRec par_groupby_pipepart cssv [\s,]+ c1 $_%=2 NewRec
par_groupby_pipepart cssv [\s,]+ c1 $_%=2 90000 540000 1710000 par_groupby_pipepart cssv [\s,]+ c1 $_%=2 90001 540006 1710037
par_groupby_pipepart cssv [\s,]+ c1 $_%=2 NewRec par_groupby_pipepart cssv [\s,]+ c1 $_%=2 NewRec
par_groupby_pipepart cssv [\s,]+ c1 $_%=2 90000 540000 1710000 par_groupby_pipepart cssv [\s,]+ c1 $_%=2 90001 540006 1710037
par_groupby_pipepart cssv [\s,]+ c1 $_%=2 NewRec par_groupby_pipepart cssv [\s,]+ c1 $_%=2 NewRec
par_groupby_pipepart cssv [\s,]+ c1 $_%=2 90000 540000 1710000 par_groupby_pipepart cssv [\s,]+ c1 $_%=2 90001 540006 1710037
par_groupby_pipepart cssv [\s,]+ c1 $_%=2 NewRec par_groupby_pipepart cssv [\s,]+ c1 $_%=2 NewRec
par_groupby_pipepart cssv [\s,]+ c1 $_%=2 90000 540000 1710000 par_groupby_pipepart cssv [\s,]+ c1 $_%=2 90001 540006 1710037
par_groupby_pipepart cssv [\s,]+ c1 $_%=2 NewRec par_groupby_pipepart cssv [\s,]+ c1 $_%=2 NewRec
par_groupby_pipepart cssv [\s,]+ c1 $_%=2 90000 540000 1710000 par_groupby_pipepart cssv [\s,]+ c1 $_%=2 90001 540006 1710037
par_groupby_pipepart cssv [\s,]+ c1 $_%=2 NewRec par_groupby_pipepart cssv [\s,]+ c1 $_%=2 NewRec
par_groupby_pipepart cssv [\s,]+ c1 $_%=2 90000 540000 1710000 par_groupby_pipepart cssv [\s,]+ c1 $_%=2 90001 540006 1710037
par_groupby_pipepart cssv [\s,]+ c1 $_%=2 NewRec par_groupby_pipepart cssv [\s,]+ c1 $_%=2 NewRec
par_groupby_pipepart cssv [\s,]+ c1 $_%=2 90000 540000 1710000 par_groupby_pipepart cssv [\s,]+ c1 $_%=2 90001 540006 1710037
par_groupby_pipepart cssv [\s,]+ s/^(\d+[\t ,]+){2}(\d+).*/$2/ ### test cssv | --colsep [\s,]+ --groupby s/^(\d+[\t ,]+){2}(\d+).*/$2/ par_groupby_pipepart cssv [\s,]+ s/^(\d+[\t ,]+){2}(\d+).*/$2/ ### test cssv | --colsep [\s,]+ --groupby s/^(\d+[\t ,]+){2}(\d+).*/$2/
par_groupby_pipepart cssv [\s,]+ s/^(\d+[\t ,]+){2}(\d+).*/$2/ NewRec par_groupby_pipepart cssv [\s,]+ s/^(\d+[\t ,]+){2}(\d+).*/$2/ NewRec
par_groupby_pipepart cssv [\s,]+ s/^(\d+[\t ,]+){2}(\d+).*/$2/ 1 6 25 par_groupby_pipepart cssv [\s,]+ s/^(\d+[\t ,]+){2}(\d+).*/$2/ 90001 540006 1710037
par_groupby_pipepart cssv [\s,]+ s/^(\d+[\t ,]+){2}(\d+).*/$2/ NewRec par_groupby_pipepart cssv [\s,]+ s/^(\d+[\t ,]+){2}(\d+).*/$2/ NewRec
par_groupby_pipepart cssv [\s,]+ s/^(\d+[\t ,]+){2}(\d+).*/$2/ 90000 540000 1710000 par_groupby_pipepart cssv [\s,]+ s/^(\d+[\t ,]+){2}(\d+).*/$2/ 90001 540006 1710037
par_groupby_pipepart cssv [\s,]+ s/^(\d+[\t ,]+){2}(\d+).*/$2/ NewRec par_groupby_pipepart cssv [\s,]+ s/^(\d+[\t ,]+){2}(\d+).*/$2/ NewRec
par_groupby_pipepart cssv [\s,]+ s/^(\d+[\t ,]+){2}(\d+).*/$2/ 90000 540000 1710000 par_groupby_pipepart cssv [\s,]+ s/^(\d+[\t ,]+){2}(\d+).*/$2/ 90001 540006 1710037
par_groupby_pipepart cssv [\s,]+ s/^(\d+[\t ,]+){2}(\d+).*/$2/ NewRec par_groupby_pipepart cssv [\s,]+ s/^(\d+[\t ,]+){2}(\d+).*/$2/ NewRec
par_groupby_pipepart cssv [\s,]+ s/^(\d+[\t ,]+){2}(\d+).*/$2/ 90000 540000 1710000 par_groupby_pipepart cssv [\s,]+ s/^(\d+[\t ,]+){2}(\d+).*/$2/ 90001 540006 1710037
par_groupby_pipepart cssv [\s,]+ s/^(\d+[\t ,]+){2}(\d+).*/$2/ NewRec par_groupby_pipepart cssv [\s,]+ s/^(\d+[\t ,]+){2}(\d+).*/$2/ NewRec
par_groupby_pipepart cssv [\s,]+ s/^(\d+[\t ,]+){2}(\d+).*/$2/ 90000 540000 1710000 par_groupby_pipepart cssv [\s,]+ s/^(\d+[\t ,]+){2}(\d+).*/$2/ 90001 540006 1710037
par_groupby_pipepart cssv [\s,]+ s/^(\d+[\t ,]+){2}(\d+).*/$2/ NewRec par_groupby_pipepart cssv [\s,]+ s/^(\d+[\t ,]+){2}(\d+).*/$2/ NewRec
par_groupby_pipepart cssv [\s,]+ s/^(\d+[\t ,]+){2}(\d+).*/$2/ 90000 540000 1710000 par_groupby_pipepart cssv [\s,]+ s/^(\d+[\t ,]+){2}(\d+).*/$2/ 90001 540006 1710037
par_groupby_pipepart cssv [\s,]+ s/^(\d+[\t ,]+){2}(\d+).*/$2/ NewRec par_groupby_pipepart cssv [\s,]+ s/^(\d+[\t ,]+){2}(\d+).*/$2/ NewRec
par_groupby_pipepart cssv [\s,]+ s/^(\d+[\t ,]+){2}(\d+).*/$2/ 90000 540000 1710000 par_groupby_pipepart cssv [\s,]+ s/^(\d+[\t ,]+){2}(\d+).*/$2/ 90001 540006 1710037
par_groupby_pipepart cssv [\s,]+ s/^(\d+[\t ,]+){2}(\d+).*/$2/ NewRec par_groupby_pipepart cssv [\s,]+ s/^(\d+[\t ,]+){2}(\d+).*/$2/ NewRec
par_groupby_pipepart cssv [\s,]+ s/^(\d+[\t ,]+){2}(\d+).*/$2/ 90000 540000 1710000 par_groupby_pipepart cssv [\s,]+ s/^(\d+[\t ,]+){2}(\d+).*/$2/ 90001 540006 1710037
par_groupby_pipepart cssv [\s,]+ s/^(\d+[\t ,]+){2}(\d+).*/$2/ NewRec par_groupby_pipepart cssv [\s,]+ s/^(\d+[\t ,]+){2}(\d+).*/$2/ NewRec
par_groupby_pipepart cssv [\s,]+ s/^(\d+[\t ,]+){2}(\d+).*/$2/ 90000 540000 1710000 par_groupby_pipepart cssv [\s,]+ s/^(\d+[\t ,]+){2}(\d+).*/$2/ 90001 540006 1710037
par_groupby_pipepart cssv [\s,]+ s/^(\d+[\t ,]+){2}(\d+).*/$2/ NewRec par_groupby_pipepart cssv [\s,]+ s/^(\d+[\t ,]+){2}(\d+).*/$2/ NewRec
par_groupby_pipepart cssv [\s,]+ s/^(\d+[\t ,]+){2}(\d+).*/$2/ 90000 540000 1710000 par_groupby_pipepart cssv [\s,]+ s/^(\d+[\t ,]+){2}(\d+).*/$2/ 90001 540006 1710037
par_groupby_pipepart cssv [\s,]+ s/^(\d+[\t ,]+){2}(\d+).*/$2/ NewRec
par_groupby_pipepart cssv [\s,]+ s/^(\d+[\t ,]+){2}(\d+).*/$2/ 90000 540000 1710000
par_groupby_pipepart csv , 3 $_%=2 ### test csv | --colsep , --groupby 3 $_%=2 par_groupby_pipepart csv , 3 $_%=2 ### test csv | --colsep , --groupby 3 $_%=2
par_groupby_pipepart csv , 3 $_%=2 NewRec par_groupby_pipepart csv , 3 $_%=2 NewRec
par_groupby_pipepart csv , 3 $_%=2 1 1 19 par_groupby_pipepart csv , 3 $_%=2 90001 90001 1170031
par_groupby_pipepart csv , 3 $_%=2 NewRec par_groupby_pipepart csv , 3 $_%=2 NewRec
par_groupby_pipepart csv , 3 $_%=2 90000 90000 1170000 par_groupby_pipepart csv , 3 $_%=2 90001 90001 1170031
par_groupby_pipepart csv , 3 $_%=2 NewRec par_groupby_pipepart csv , 3 $_%=2 NewRec
par_groupby_pipepart csv , 3 $_%=2 90000 90000 1170000 par_groupby_pipepart csv , 3 $_%=2 90001 90001 1170031
par_groupby_pipepart csv , 3 $_%=2 NewRec par_groupby_pipepart csv , 3 $_%=2 NewRec
par_groupby_pipepart csv , 3 $_%=2 90000 90000 1170000 par_groupby_pipepart csv , 3 $_%=2 90001 90001 1170031
par_groupby_pipepart csv , 3 $_%=2 NewRec par_groupby_pipepart csv , 3 $_%=2 NewRec
par_groupby_pipepart csv , 3 $_%=2 90000 90000 1170000 par_groupby_pipepart csv , 3 $_%=2 90001 90001 1170031
par_groupby_pipepart csv , 3 $_%=2 NewRec par_groupby_pipepart csv , 3 $_%=2 NewRec
par_groupby_pipepart csv , 3 $_%=2 90000 90000 1170000 par_groupby_pipepart csv , 3 $_%=2 90001 90001 1170031
par_groupby_pipepart csv , 3 $_%=2 NewRec par_groupby_pipepart csv , 3 $_%=2 NewRec
par_groupby_pipepart csv , 3 $_%=2 90000 90000 1170000 par_groupby_pipepart csv , 3 $_%=2 90001 90001 1170031
par_groupby_pipepart csv , 3 $_%=2 NewRec par_groupby_pipepart csv , 3 $_%=2 NewRec
par_groupby_pipepart csv , 3 $_%=2 90000 90000 1170000 par_groupby_pipepart csv , 3 $_%=2 90001 90001 1170031
par_groupby_pipepart csv , 3 $_%=2 NewRec par_groupby_pipepart csv , 3 $_%=2 NewRec
par_groupby_pipepart csv , 3 $_%=2 90000 90000 1170000 par_groupby_pipepart csv , 3 $_%=2 90001 90001 1170031
par_groupby_pipepart csv , 3 $_%=2 NewRec par_groupby_pipepart csv , 3 $_%=2 NewRec
par_groupby_pipepart csv , 3 $_%=2 90000 90000 1170000 par_groupby_pipepart csv , 3 $_%=2 90001 90001 1170031
par_groupby_pipepart csv , 3 $_%=2 NewRec
par_groupby_pipepart csv , 3 $_%=2 90000 90000 1170000
par_groupby_pipepart csv , 3 ### test csv | --colsep , --groupby 3 par_groupby_pipepart csv , 3 ### test csv | --colsep , --groupby 3
par_groupby_pipepart csv , 3 NewRec par_groupby_pipepart csv , 3 NewRec
par_groupby_pipepart csv , 3 1 1 19 par_groupby_pipepart csv , 3 90001 90001 1170031
par_groupby_pipepart csv , 3 NewRec par_groupby_pipepart csv , 3 NewRec
par_groupby_pipepart csv , 3 90000 90000 1170000 par_groupby_pipepart csv , 3 90001 90001 1170031
par_groupby_pipepart csv , 3 NewRec par_groupby_pipepart csv , 3 NewRec
par_groupby_pipepart csv , 3 90000 90000 1170000 par_groupby_pipepart csv , 3 90001 90001 1170031
par_groupby_pipepart csv , 3 NewRec par_groupby_pipepart csv , 3 NewRec
par_groupby_pipepart csv , 3 90000 90000 1170000 par_groupby_pipepart csv , 3 90001 90001 1170031
par_groupby_pipepart csv , 3 NewRec par_groupby_pipepart csv , 3 NewRec
par_groupby_pipepart csv , 3 90000 90000 1170000 par_groupby_pipepart csv , 3 90001 90001 1170031
par_groupby_pipepart csv , 3 NewRec par_groupby_pipepart csv , 3 NewRec
par_groupby_pipepart csv , 3 90000 90000 1170000 par_groupby_pipepart csv , 3 90001 90001 1170031
par_groupby_pipepart csv , 3 NewRec par_groupby_pipepart csv , 3 NewRec
par_groupby_pipepart csv , 3 90000 90000 1170000 par_groupby_pipepart csv , 3 90001 90001 1170031
par_groupby_pipepart csv , 3 NewRec par_groupby_pipepart csv , 3 NewRec
par_groupby_pipepart csv , 3 90000 90000 1170000 par_groupby_pipepart csv , 3 90001 90001 1170031
par_groupby_pipepart csv , 3 NewRec par_groupby_pipepart csv , 3 NewRec
par_groupby_pipepart csv , 3 90000 90000 1170000 par_groupby_pipepart csv , 3 90001 90001 1170031
par_groupby_pipepart csv , 3 NewRec par_groupby_pipepart csv , 3 NewRec
par_groupby_pipepart csv , 3 90000 90000 1170000 par_groupby_pipepart csv , 3 90001 90001 1170031
par_groupby_pipepart csv , 3 NewRec
par_groupby_pipepart csv , 3 90000 90000 1170000
par_groupby_pipepart csv , c1 ### test csv | --colsep , --groupby c1 par_groupby_pipepart csv , c1 ### test csv | --colsep , --groupby c1
par_groupby_pipepart csv , c1 NewRec par_groupby_pipepart csv , c1 NewRec
par_groupby_pipepart csv , c1 90001 90001 1170019 par_groupby_pipepart csv , c1 90001 90001 1170031
par_groupby_pipepart csv , c1 NewRec par_groupby_pipepart csv , c1 NewRec
par_groupby_pipepart csv , c1 90000 90000 1170000 par_groupby_pipepart csv , c1 90001 90001 1170031
par_groupby_pipepart csv , c1 NewRec par_groupby_pipepart csv , c1 NewRec
par_groupby_pipepart csv , c1 90000 90000 1170000 par_groupby_pipepart csv , c1 90001 90001 1170031
par_groupby_pipepart csv , c1 NewRec par_groupby_pipepart csv , c1 NewRec
par_groupby_pipepart csv , c1 90000 90000 1170000 par_groupby_pipepart csv , c1 90001 90001 1170031
par_groupby_pipepart csv , c1 NewRec par_groupby_pipepart csv , c1 NewRec
par_groupby_pipepart csv , c1 90000 90000 1170000 par_groupby_pipepart csv , c1 90001 90001 1170031
par_groupby_pipepart csv , c1 NewRec par_groupby_pipepart csv , c1 NewRec
par_groupby_pipepart csv , c1 90000 90000 1170000 par_groupby_pipepart csv , c1 90001 90001 1170031
par_groupby_pipepart csv , c1 NewRec par_groupby_pipepart csv , c1 NewRec
par_groupby_pipepart csv , c1 90000 90000 1170000 par_groupby_pipepart csv , c1 90001 90001 1170031
par_groupby_pipepart csv , c1 NewRec par_groupby_pipepart csv , c1 NewRec
par_groupby_pipepart csv , c1 90000 90000 1170000 par_groupby_pipepart csv , c1 90001 90001 1170031
par_groupby_pipepart csv , c1 NewRec par_groupby_pipepart csv , c1 NewRec
par_groupby_pipepart csv , c1 90000 90000 1170000 par_groupby_pipepart csv , c1 90001 90001 1170031
par_groupby_pipepart csv , c1 NewRec par_groupby_pipepart csv , c1 NewRec
par_groupby_pipepart csv , c1 90000 90000 1170000 par_groupby_pipepart csv , c1 90001 90001 1170031
par_groupby_pipepart csv , c1 $_%=2 ### test csv | --colsep , --groupby c1 $_%=2 par_groupby_pipepart csv , c1 $_%=2 ### test csv | --colsep , --groupby c1 $_%=2
par_groupby_pipepart csv , c1 $_%=2 NewRec par_groupby_pipepart csv , c1 $_%=2 NewRec
par_groupby_pipepart csv , c1 $_%=2 90001 90001 1170019 par_groupby_pipepart csv , c1 $_%=2 90001 90001 1170031
par_groupby_pipepart csv , c1 $_%=2 NewRec par_groupby_pipepart csv , c1 $_%=2 NewRec
par_groupby_pipepart csv , c1 $_%=2 90000 90000 1170000 par_groupby_pipepart csv , c1 $_%=2 90001 90001 1170031
par_groupby_pipepart csv , c1 $_%=2 NewRec par_groupby_pipepart csv , c1 $_%=2 NewRec
par_groupby_pipepart csv , c1 $_%=2 90000 90000 1170000 par_groupby_pipepart csv , c1 $_%=2 90001 90001 1170031
par_groupby_pipepart csv , c1 $_%=2 NewRec par_groupby_pipepart csv , c1 $_%=2 NewRec
par_groupby_pipepart csv , c1 $_%=2 90000 90000 1170000 par_groupby_pipepart csv , c1 $_%=2 90001 90001 1170031
par_groupby_pipepart csv , c1 $_%=2 NewRec par_groupby_pipepart csv , c1 $_%=2 NewRec
par_groupby_pipepart csv , c1 $_%=2 90000 90000 1170000 par_groupby_pipepart csv , c1 $_%=2 90001 90001 1170031
par_groupby_pipepart csv , c1 $_%=2 NewRec par_groupby_pipepart csv , c1 $_%=2 NewRec
par_groupby_pipepart csv , c1 $_%=2 90000 90000 1170000 par_groupby_pipepart csv , c1 $_%=2 90001 90001 1170031
par_groupby_pipepart csv , c1 $_%=2 NewRec par_groupby_pipepart csv , c1 $_%=2 NewRec
par_groupby_pipepart csv , c1 $_%=2 90000 90000 1170000 par_groupby_pipepart csv , c1 $_%=2 90001 90001 1170031
par_groupby_pipepart csv , c1 $_%=2 NewRec par_groupby_pipepart csv , c1 $_%=2 NewRec
par_groupby_pipepart csv , c1 $_%=2 90000 90000 1170000 par_groupby_pipepart csv , c1 $_%=2 90001 90001 1170031
par_groupby_pipepart csv , c1 $_%=2 NewRec par_groupby_pipepart csv , c1 $_%=2 NewRec
par_groupby_pipepart csv , c1 $_%=2 90000 90000 1170000 par_groupby_pipepart csv , c1 $_%=2 90001 90001 1170031
par_groupby_pipepart csv , c1 $_%=2 NewRec par_groupby_pipepart csv , c1 $_%=2 NewRec
par_groupby_pipepart csv , c1 $_%=2 90000 90000 1170000 par_groupby_pipepart csv , c1 $_%=2 90001 90001 1170031
par_groupby_pipepart csv , s/^(\d+[\t ,]+){2}(\d+).*/$2/ ### test csv | --colsep , --groupby s/^(\d+[\t ,]+){2}(\d+).*/$2/ par_groupby_pipepart csv , s/^(\d+[\t ,]+){2}(\d+).*/$2/ ### test csv | --colsep , --groupby s/^(\d+[\t ,]+){2}(\d+).*/$2/
par_groupby_pipepart csv , s/^(\d+[\t ,]+){2}(\d+).*/$2/ NewRec par_groupby_pipepart csv , s/^(\d+[\t ,]+){2}(\d+).*/$2/ NewRec
par_groupby_pipepart csv , s/^(\d+[\t ,]+){2}(\d+).*/$2/ 1 1 19 par_groupby_pipepart csv , s/^(\d+[\t ,]+){2}(\d+).*/$2/ 90001 90001 1170031
par_groupby_pipepart csv , s/^(\d+[\t ,]+){2}(\d+).*/$2/ NewRec par_groupby_pipepart csv , s/^(\d+[\t ,]+){2}(\d+).*/$2/ NewRec
par_groupby_pipepart csv , s/^(\d+[\t ,]+){2}(\d+).*/$2/ 90000 90000 1170000 par_groupby_pipepart csv , s/^(\d+[\t ,]+){2}(\d+).*/$2/ 90001 90001 1170031
par_groupby_pipepart csv , s/^(\d+[\t ,]+){2}(\d+).*/$2/ NewRec par_groupby_pipepart csv , s/^(\d+[\t ,]+){2}(\d+).*/$2/ NewRec
par_groupby_pipepart csv , s/^(\d+[\t ,]+){2}(\d+).*/$2/ 90000 90000 1170000 par_groupby_pipepart csv , s/^(\d+[\t ,]+){2}(\d+).*/$2/ 90001 90001 1170031
par_groupby_pipepart csv , s/^(\d+[\t ,]+){2}(\d+).*/$2/ NewRec par_groupby_pipepart csv , s/^(\d+[\t ,]+){2}(\d+).*/$2/ NewRec
par_groupby_pipepart csv , s/^(\d+[\t ,]+){2}(\d+).*/$2/ 90000 90000 1170000 par_groupby_pipepart csv , s/^(\d+[\t ,]+){2}(\d+).*/$2/ 90001 90001 1170031
par_groupby_pipepart csv , s/^(\d+[\t ,]+){2}(\d+).*/$2/ NewRec par_groupby_pipepart csv , s/^(\d+[\t ,]+){2}(\d+).*/$2/ NewRec
par_groupby_pipepart csv , s/^(\d+[\t ,]+){2}(\d+).*/$2/ 90000 90000 1170000 par_groupby_pipepart csv , s/^(\d+[\t ,]+){2}(\d+).*/$2/ 90001 90001 1170031
par_groupby_pipepart csv , s/^(\d+[\t ,]+){2}(\d+).*/$2/ NewRec par_groupby_pipepart csv , s/^(\d+[\t ,]+){2}(\d+).*/$2/ NewRec
par_groupby_pipepart csv , s/^(\d+[\t ,]+){2}(\d+).*/$2/ 90000 90000 1170000 par_groupby_pipepart csv , s/^(\d+[\t ,]+){2}(\d+).*/$2/ 90001 90001 1170031
par_groupby_pipepart csv , s/^(\d+[\t ,]+){2}(\d+).*/$2/ NewRec par_groupby_pipepart csv , s/^(\d+[\t ,]+){2}(\d+).*/$2/ NewRec
par_groupby_pipepart csv , s/^(\d+[\t ,]+){2}(\d+).*/$2/ 90000 90000 1170000 par_groupby_pipepart csv , s/^(\d+[\t ,]+){2}(\d+).*/$2/ 90001 90001 1170031
par_groupby_pipepart csv , s/^(\d+[\t ,]+){2}(\d+).*/$2/ NewRec par_groupby_pipepart csv , s/^(\d+[\t ,]+){2}(\d+).*/$2/ NewRec
par_groupby_pipepart csv , s/^(\d+[\t ,]+){2}(\d+).*/$2/ 90000 90000 1170000 par_groupby_pipepart csv , s/^(\d+[\t ,]+){2}(\d+).*/$2/ 90001 90001 1170031
par_groupby_pipepart csv , s/^(\d+[\t ,]+){2}(\d+).*/$2/ NewRec par_groupby_pipepart csv , s/^(\d+[\t ,]+){2}(\d+).*/$2/ NewRec
par_groupby_pipepart csv , s/^(\d+[\t ,]+){2}(\d+).*/$2/ 90000 90000 1170000 par_groupby_pipepart csv , s/^(\d+[\t ,]+){2}(\d+).*/$2/ 90001 90001 1170031
par_groupby_pipepart csv , s/^(\d+[\t ,]+){2}(\d+).*/$2/ NewRec par_groupby_pipepart csv , s/^(\d+[\t ,]+){2}(\d+).*/$2/ NewRec
par_groupby_pipepart csv , s/^(\d+[\t ,]+){2}(\d+).*/$2/ 90000 90000 1170000 par_groupby_pipepart csv , s/^(\d+[\t ,]+){2}(\d+).*/$2/ 90001 90001 1170031
par_groupby_pipepart csv , s/^(\d+[\t ,]+){2}(\d+).*/$2/ NewRec
par_groupby_pipepart csv , s/^(\d+[\t ,]+){2}(\d+).*/$2/ 90000 90000 1170000
par_keeporder_roundrobin bug #50081: --keep-order --round-robin should give predictable results par_keeporder_roundrobin bug #50081: --keep-order --round-robin should give predictable results
par_keeporder_roundrobin OK par_keeporder_roundrobin OK
par_macron ### See if \257\256 \257<\257> is replaced correctly par_macron ### See if \257\256 \257<\257> is replaced correctly
@ -1295,7 +1271,7 @@ par_memfree Free mem: 1k
par_memfree parallel: Warning: This job was killed because it timed out: par_memfree parallel: Warning: This job was killed because it timed out:
par_memfree parallel: Warning: parallel --memfree 1t echo Free mem: ::: 1t par_memfree parallel: Warning: parallel --memfree 1t echo Free mem: ::: 1t
par_memory_leak ### Test for memory leaks par_memory_leak ### Test for memory leaks
par_memory_leak Of 100 runs of 1 job none should be bigger than a 3000 job run par_memory_leak Of 100 runs of 1 job at least one should be bigger than a 3000 job run
par_memory_leak Good: No memleak detected. par_memory_leak Good: No memleak detected.
par_no_newline_compress bug #41613: --compress --line-buffer - no newline par_no_newline_compress bug #41613: --compress --line-buffer - no newline
par_no_newline_compress tagstring=--tagstring {#} compress=--compress par_no_newline_compress tagstring=--tagstring {#} compress=--compress

View file

@ -1,22 +1,3 @@
par_bin ### Test --bin
par_bin 2 2 4
par_bin 2 2 4
par_bin 3 3 6
par_bin 3 3 7
par_bin 2 4 8
par_bin 2 4 8
par_bin 3 6 13
par_bin 3 6 13
par_bin ### Test --bin with expression that gives 1..n
par_bin 0 0 0
par_bin 0 0 0
par_bin 5 10 21
par_bin 5 10 21
par_bin ### Test --bin with expression that gives 0..n-1
par_bin 0 0 0
par_bin 0 0 0
par_bin 5 10 21
par_bin 5 10 21
par_children_receive_sig ### Do children receive --termseq signals par_children_receive_sig ### Do children receive --termseq signals
par_children_receive_sig parallel: Warning: This job was killed because it timed out: par_children_receive_sig parallel: Warning: This job was killed because it timed out:
par_children_receive_sig parallel: Warning: show_signals '' par_children_receive_sig parallel: Warning: show_signals ''

View file

@ -2110,37 +2110,10 @@ par_bash_environment_too_big env_parallel: Error: env_parallel --record-env
par_bash_environment_too_big env_parallel: Error: And then use '--env _' par_bash_environment_too_big env_parallel: Error: And then use '--env _'
par_bash_environment_too_big env_parallel: Error: For details see: man env_parallel par_bash_environment_too_big env_parallel: Error: For details see: man env_parallel
par_bash_environment_too_big parallel: Error: Command line too long (XXX >= XXX) at input 0: fail_bigvar_quote_remote par_bash_environment_too_big parallel: Error: Command line too long (XXX >= XXX) at input 0: fail_bigvar_quote_remote
par_bash_environment_too_big /usr/local/bin/env_parallel.bash: line XXX: /bin/perl: Argument list too long par_bash_environment_too_big parallel: Error: Command line too long (XXX >= XXX) at input 0: fail_bigfunc
par_bash_environment_too_big env_parallel: Error: Your environment is too big.
par_bash_environment_too_big env_parallel: Error: You can try 3 different approaches:
par_bash_environment_too_big env_parallel: Error: 1. Run 'env_parallel --session' before you set
par_bash_environment_too_big env_parallel: Error: variables or define functions.
par_bash_environment_too_big env_parallel: Error: 2. Use --env and only mention the names to copy.
par_bash_environment_too_big env_parallel: Error: 3. Try running this in a clean environment once:
par_bash_environment_too_big env_parallel: Error: env_parallel --record-env
par_bash_environment_too_big env_parallel: Error: And then use '--env _'
par_bash_environment_too_big env_parallel: Error: For details see: man env_parallel
par_bash_environment_too_big parallel: Error: Command line too long (XXX >= XXX) at input 0: fail_bigfunc_remote par_bash_environment_too_big parallel: Error: Command line too long (XXX >= XXX) at input 0: fail_bigfunc_remote
par_bash_environment_too_big /usr/local/bin/env_parallel.bash: line XXX: /bin/perl: Argument list too long par_bash_environment_too_big parallel: Error: Command line too long (XXX >= XXX) at input 0: fail_bigfunc_quote
par_bash_environment_too_big env_parallel: Error: Your environment is too big. par_bash_environment_too_big parallel: Error: Command line too long (XXX >= XXX) at input 0: fail_bigfunc_quote_remote
par_bash_environment_too_big env_parallel: Error: You can try 3 different approaches:
par_bash_environment_too_big env_parallel: Error: 1. Run 'env_parallel --session' before you set
par_bash_environment_too_big env_parallel: Error: variables or define functions.
par_bash_environment_too_big env_parallel: Error: 2. Use --env and only mention the names to copy.
par_bash_environment_too_big env_parallel: Error: 3. Try running this in a clean environment once:
par_bash_environment_too_big env_parallel: Error: env_parallel --record-env
par_bash_environment_too_big env_parallel: Error: And then use '--env _'
par_bash_environment_too_big env_parallel: Error: For details see: man env_parallel
par_bash_environment_too_big /usr/local/bin/env_parallel.bash: line XXX: /bin/perl: Argument list too long
par_bash_environment_too_big env_parallel: Error: Your environment is too big.
par_bash_environment_too_big env_parallel: Error: You can try 3 different approaches:
par_bash_environment_too_big env_parallel: Error: 1. Run 'env_parallel --session' before you set
par_bash_environment_too_big env_parallel: Error: variables or define functions.
par_bash_environment_too_big env_parallel: Error: 2. Use --env and only mention the names to copy.
par_bash_environment_too_big env_parallel: Error: 3. Try running this in a clean environment once:
par_bash_environment_too_big env_parallel: Error: env_parallel --record-env
par_bash_environment_too_big env_parallel: Error: And then use '--env _'
par_bash_environment_too_big env_parallel: Error: For details see: man env_parallel
par_bash_env_parallel_session ### Test env_parallel --session / --end-session par_bash_env_parallel_session ### Test env_parallel --session / --end-session
par_bash_env_parallel_session ### level0 should be hidden, level1 should be transferred par_bash_env_parallel_session ### level0 should be hidden, level1 should be transferred
par_bash_env_parallel_session par_bash_env_parallel_session
@ -2254,6 +2227,14 @@ par_bash_env_parallel OK
par_bash_env_parallel OK par_bash_env_parallel OK
par_bash_env_parallel alias line 1 par_bash_env_parallel alias line 1
par_bash_env_parallel alias line 1 par_bash_env_parallel alias line 1
par_bash_env_parallel alias line 2
par_bash_env_parallel alias line 2
par_bash_env_parallel alias line 3
par_bash_env_parallel alias line 3
par_bash_env_parallel alias2 line 1
par_bash_env_parallel alias2 line 1
par_bash_env_parallel alias2 line 2
par_bash_env_parallel alias2 line 2
par_bash_env_parallel bug #50435: Remote fifo broke in 20150522 par_bash_env_parallel bug #50435: Remote fifo broke in 20150522
par_bash_env_parallel bug #52534: Tail of multiline alias is ignored par_bash_env_parallel bug #52534: Tail of multiline alias is ignored
par_bash_env_parallel data from stdin par_bash_env_parallel data from stdin

View file

@ -278,7 +278,7 @@ correct
correct correct
echo 'bug #38439: "open files" with --files --pipe blocks after a while' echo 'bug #38439: "open files" with --files --pipe blocks after a while'
bug #38439: "open files" with --files --pipe blocks after a while bug #38439: "open files" with --files --pipe blocks after a while
ulimit -n 20; yes "`seq 3000`" |head -c 20M | parallel --pipe -k echo {#} of 21 ulimit -n 28; yes "`seq 3000`" |head -c 20M | parallel --pipe -k echo {#} of 21
1 of 21 1 of 21
2 of 21 2 of 21
3 of 21 3 of 21
@ -300,8 +300,8 @@ bug #38439: "open files" with --files --pipe blocks after a while
19 of 21 19 of 21
20 of 21 20 of 21
21 of 21 21 of 21
parallel: Warning: Only enough file handles to run 1 jobs in parallel. parallel: Warning: Only enough file handles to run 2 jobs in parallel.
parallel: Warning: Running 'parallel -j0 -N 1 --pipe parallel -j0' or parallel: Warning: Running 'parallel -j0 -N 2 --pipe parallel -j0' or
parallel: Warning: raising 'ulimit -n' or 'nofile' in /etc/security/limits.conf parallel: Warning: raising 'ulimit -n' or 'nofile' in /etc/security/limits.conf
parallel: Warning: or /proc/sys/fs/file-max may help. parallel: Warning: or /proc/sys/fs/file-max may help.
echo 'bug #34241: --pipe should not spawn unneeded processes - part 2' echo 'bug #34241: --pipe should not spawn unneeded processes - part 2'

View file

@ -107,7 +107,7 @@ a1.gif 2.gif 3.gif 4.gif 5.gif 6.gifb1 2 3 4 5 6c1 2 3 4 5 6
a1.gifb1c1 a2.gifb2c2 a3.gifb3c3 a4.gifb4c4 a5.gifb5c5 a6.gifb6c6 a1.gifb1c1 a2.gifb2c2 a3.gifb3c3 a4.gifb4c4 a5.gifb5c5 a6.gifb6c6
echo '### Test -m with 10000 args'; seq 10000 | perl -pe 's/$/.gif/' | parallel -j1 -km echo a{}b{.}c{.} | tee >(wc; sleep 1) >(md5sum; sleep 1) >/dev/null; wait; sleep 1 echo '### Test -m with 10000 args'; seq 10000 | perl -pe 's/$/.gif/' | parallel -j1 -km echo a{}b{.}c{.} | tee >(wc; sleep 1) >(md5sum; sleep 1) >/dev/null; wait; sleep 1
### Test -m with 10000 args ### Test -m with 10000 args
dc1624c3316077d0d95803a2eb30f455 - c606aec1723ee5cc15f2a1b95d83d3cf -
2 29996 186684 2 29996 186684
echo '### Test -X with 10000 args'; seq 10000 | perl -pe 's/$/.gif/' | parallel -j1 -kX echo a{}b{.}c{.} | tee >(wc; sleep 1) >(md5sum; sleep 1) >/dev/null; wait; sleep 1 echo '### Test -X with 10000 args'; seq 10000 | perl -pe 's/$/.gif/' | parallel -j1 -kX echo a{}b{.}c{.} | tee >(wc; sleep 1) >(md5sum; sleep 1) >/dev/null; wait; sleep 1
### Test -X with 10000 args ### Test -X with 10000 args

View file

@ -5,12 +5,12 @@ Chars per line: 116300
6 119994 697800 6 119994 697800
echo '### Test of xargs -X command lines > 130k'; seq 1 60000 | parallel -X -j1 echo a{}b{}c | tee >(wc >/tmp/bwc$$) >(sort | (sleep 1; md5sum)) >/tmp/b$$; wait; CHAR=$(cat /tmp/b$$ | wc -c); LINES=$(cat /tmp/b$$ | wc -l); echo "Chars per line:" $(echo "$CHAR/$LINES" | bc); cat /tmp/bwc$$; rm /tmp/b$$ /tmp/bwc$$ echo '### Test of xargs -X command lines > 130k'; seq 1 60000 | parallel -X -j1 echo a{}b{}c | tee >(wc >/tmp/bwc$$) >(sort | (sleep 1; md5sum)) >/tmp/b$$; wait; CHAR=$(cat /tmp/b$$ | wc -c); LINES=$(cat /tmp/b$$ | wc -l); echo "Chars per line:" $(echo "$CHAR/$LINES" | bc); cat /tmp/bwc$$; rm /tmp/b$$ /tmp/bwc$$
### Test of xargs -X command lines > 130k ### Test of xargs -X command lines > 130k
3cfc69ee81b0fe7fdbe8eb059ad2da61 - 201ecb8ca789cecf39ee914a6d75611b -
Chars per line: 116826 Chars per line: 116826
7 60000 817788 7 60000 817788
echo '### Test of xargs -m command lines > 130k'; seq 1 60000 | parallel -k -j1 -m echo | md5sum echo '### Test of xargs -m command lines > 130k'; seq 1 60000 | parallel -k -j1 -m echo | md5sum
### Test of xargs -m command lines > 130k ### Test of xargs -m command lines > 130k
00b8aed2c1bc28368381273aa2ae104e - 590091fd85dcb98f91c5e89cdddf21ef -
echo '### This causes problems if we kill child processes'; # 2>/dev/null to avoid parallel: Warning: Starting 45 processes took > 2 sec. echo '### This causes problems if we kill child processes'; # 2>/dev/null to avoid parallel: Warning: Starting 45 processes took > 2 sec.
### This causes problems if we kill child processes ### This causes problems if we kill child processes
seq 2 40 | parallel -j 0 seq 1 10 2>/dev/null | sort | md5sum seq 2 40 | parallel -j 0 seq 1 10 2>/dev/null | sort | md5sum

View file

@ -73,8 +73,8 @@ please cite as described in 'parallel --citation'.
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"}' | $NICEPAR --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"'
131040 131052
37854 37842
echo '### --delay should grow by 3 sec per arg' echo '### --delay should grow by 3 sec per arg'
### --delay should grow by 3 sec per arg ### --delay should grow by 3 sec per arg
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 3 true ::: 1 2 | perl -ne '$_ >= 3 and $_ <= 8 and print "OK\n"'

View file

@ -102,19 +102,16 @@ TODO test ssh with > 9 simultaneous
100 100
echo '### test --timeout --retries' echo '### test --timeout --retries'
### test --timeout --retries ### test --timeout --retries
parallel -j0 --timeout 5 --retries 3 -k ssh {} echo {} ::: 192.168.1.197 8.8.8.8 parallel@parallel-server1 parallel@lo parallel@parallel-server2 parallel -j0 --timeout 5 --retries 3 -k ssh {} echo {} ::: 192.168.1.197 8.8.8.8 vagrant@parallel-server1 vagrant@parallel-server2 vagrant@parallel-server3
parallel@parallel-server1 vagrant@parallel-server1
parallel@lo vagrant@parallel-server2
parallel@parallel-server2 vagrant@parallel-server3
echo '### test --filter-hosts with server w/o ssh, non-existing server' echo '### test --filter-hosts with server w/o ssh, non-existing server'
### test --filter-hosts with server w/o ssh, non-existing server ### test --filter-hosts with server w/o ssh, non-existing server
parallel -S 192.168.1.197,8.8.8.8,parallel@parallel-server1,parallel@lo,parallel@parallel-server2 --filter-hosts --nonall -k --tag echo parallel -S 192.168.1.197,8.8.8.8,vagrant@parallel-server1,vagrant@parallel-server2,vagrant@parallel-server3 --filter-hosts --nonall -k --tag echo
parallel@lo
parallel@parallel-server1
parallel@parallel-server2
echo '### bug #41964: --controlmaster not seems to reuse OpenSSH connections to the same host' echo '### bug #41964: --controlmaster not seems to reuse OpenSSH connections to the same host'
### bug #41964: --controlmaster not seems to reuse OpenSSH connections to the same host ### bug #41964: --controlmaster not seems to reuse OpenSSH connections to the same host
(parallel -S redhat9.tange.dk true ::: {1..20}; echo No --controlmaster - finish last) & (parallel -M -S redhat9.tange.dk true ::: {1..20}; echo With --controlmaster - finish first) & wait (parallel -S vagrant@parallel-server1 true ::: {1..20}; echo No --controlmaster - finish last) & (parallel -M -S vagrant@parallel-server1 true ::: {1..20}; echo With --controlmaster - finish first) & wait
With --controlmaster - finish first With --controlmaster - finish first
No --controlmaster - finish last No --controlmaster - finish last
echo '### --filter-hosts - OK, non-such-user, connection refused, wrong host' echo '### --filter-hosts - OK, non-such-user, connection refused, wrong host'
@ -123,7 +120,7 @@ echo '### --filter-hosts - OK, non-such-user, connection refused, wrong host'
aspire aspire
echo '### test --workdir . in $HOME' echo '### test --workdir . in $HOME'
### test --workdir . in $HOME ### test --workdir . in $HOME
cd && mkdir -p parallel-test && cd parallel-test && echo OK > testfile && parallel --workdir . --transfer -S parallel@parallel-server1 cat {} ::: testfile cd && mkdir -p parallel-test && cd parallel-test && echo OK > testfile && parallel --workdir . --transfer -S vagrant@parallel-server1 cat {} ::: testfile
OK OK
echo '### TODO: test --filter-hosts proxied through the one host' echo '### TODO: test --filter-hosts proxied through the one host'
### TODO: test --filter-hosts proxied through the one host ### TODO: test --filter-hosts proxied through the one host

View file

@ -565,7 +565,8 @@ Computers / CPU cores / Max jobs to run
1:local / 8 / 8 1:local / 8 / 8
Computer:jobs running/jobs completed/%of started jobs/Average seconds to complete Computer:jobs running/jobs completed/%of started jobs/Average seconds to complete
seq 1000 | parallel -j10 --bar '(echo -n {};sleep 0.1)' \ seq 1000 | parallel -j10 --bar '(echo -n {};sleep 0.1)' \
2> >(zenity --timeout=15 --progress --auto-kill --auto-close) 2> >(perl -pe 'BEGIN{$/="\r";$|=1};s/\r/\n/g' |
zenity --timeout=15 --progress --auto-kill --auto-close)
BASE64--joblog /tmp/log exit ::: 1 2 3 0 BASE64--joblog /tmp/log exit ::: 1 2 3 0
cat /tmp/log; cat /tmp/log;
parallel --joblog /tmp/log exit ::: 1 2 3 0 parallel --joblog /tmp/log exit ::: 1 2 3 0
@ -1424,4 +1425,4 @@ C
echo A echo A
echo B echo B
echo C echo C
7 8

View file

@ -37,7 +37,7 @@ bytes
3072 3072
Current command: sqlite3 Current command: sqlite3
foo foo
sqltest.sqlite3: SQLite 3.x database, last written using SQLite version 3022000 sqltest.sqlite3: SQLite 3.x database, last written using SQLite version 3031001
n|t n|t
1|Line 1 1|Line 1
2|Line 2 2|Line 2

View file

@ -4,25 +4,25 @@
file>fire file>fire
file : & ) \n*.jpg file : & ) \n*.jpg
good if no file good if no file
ls: /tmp/parallel.file*: No such file or directory ls: cannot access '/tmp/parallel.file*': No such file or directory
ls: /tmp/parallel.file*: No such file or directory ls: /tmp/parallel.file*: No such file or directory
### --transfer - relpath ### --transfer - relpath
file>fire file>fire
file : & ) \n*.jpg file : & ) \n*.jpg
good if no file good if no file
ls: tmp/parallel.file*: No such file or directory ls: cannot access 'tmp/parallel.file*': No such file or directory
ls: tmp/parallel.file*: No such file or directory ls: tmp/parallel.file*: No such file or directory
### --transfer --cleanup - abspath ### --transfer --cleanup - abspath
file>fire file>fire
file : & ) \n*.jpg file : & ) \n*.jpg
good if no file good if no file
ls: /tmp/parallel.file*: No such file or directory ls: cannot access '/tmp/parallel.file*': No such file or directory
ls: /tmp/parallel.file*: No such file or directory ls: /tmp/parallel.file*: No such file or directory
### --transfer --cleanup - relpath ### --transfer --cleanup - relpath
file>fire file>fire
file : & ) \n*.jpg file : & ) \n*.jpg
good if no file good if no file
ls: tmp/parallel.file*: No such file or directory ls: cannot access 'tmp/parallel.file*': No such file or directory
OK OK
ls: tmp/parallel.file*: No such file or directory ls: tmp/parallel.file*: No such file or directory
OK OK
@ -61,7 +61,7 @@ good if no file
/tmp/parallel.file>fire.file.done /tmp/parallel.file>fire.file.done
/tmp/parallel.file>fire.out /tmp/parallel.file>fire.out
good if no file good if no file
ls: /tmp/parallel.file*: No such file or directory ls: cannot access '/tmp/parallel.file*': No such file or directory
OK OK
ls: /tmp/parallel.file*: No such file or directory ls: /tmp/parallel.file*: No such file or directory
OK OK
@ -71,7 +71,7 @@ OK
/tmp/parallel.file>fire.file.done /tmp/parallel.file>fire.file.done
/tmp/parallel.file>fire.out /tmp/parallel.file>fire.out
good if no file good if no file
ls: tmp/parallel.file*: No such file or directory ls: cannot access 'tmp/parallel.file*': No such file or directory
OK OK
ls: tmp/parallel.file*: No such file or directory ls: tmp/parallel.file*: No such file or directory
OK OK
@ -80,7 +80,7 @@ OK
/tmp/parallel.file : & ) \n*.jpg.out /tmp/parallel.file : & ) \n*.jpg.out
/tmp/parallel.file>fire.file.done /tmp/parallel.file>fire.file.done
/tmp/parallel.file>fire.out /tmp/parallel.file>fire.out
ls: tmp/parallel.file*: No such file or directory ls: cannot access 'tmp/parallel.file*': No such file or directory
OK OK
ls: tmp/parallel.file*: No such file or directory ls: tmp/parallel.file*: No such file or directory
OK OK
@ -90,7 +90,7 @@ OK
/tmp/parallel.file>fire.file.done /tmp/parallel.file>fire.file.done
/tmp/parallel.file>fire.out /tmp/parallel.file>fire.out
good if no file good if no file
ls: /tmp/parallel.file*: No such file or directory ls: cannot access '/tmp/parallel.file*': No such file or directory
OK OK
ls: /tmp/parallel.file*: No such file or directory ls: /tmp/parallel.file*: No such file or directory
OK OK
@ -100,7 +100,7 @@ tmp/parallel.file : & ) \n*.jpg.out
tmp/parallel.file>fire.file.done tmp/parallel.file>fire.file.done
tmp/parallel.file>fire.out tmp/parallel.file>fire.out
good if no file good if no file
ls: tmp/parallel.file*: No such file or directory ls: cannot access 'tmp/parallel.file*': No such file or directory
OK OK
ls: tmp/parallel.file*: No such file or directory ls: tmp/parallel.file*: No such file or directory
OK OK
@ -110,7 +110,7 @@ OK
/tmp/parallel.file>fire.file.done /tmp/parallel.file>fire.file.done
/tmp/parallel.file>fire.out /tmp/parallel.file>fire.out
good if no file good if no file
ls: /tmp/parallel.file*: No such file or directory ls: cannot access '/tmp/parallel.file*': No such file or directory
OK OK
ls: /tmp/parallel.file*: No such file or directory ls: /tmp/parallel.file*: No such file or directory
OK OK

View file

@ -91,13 +91,13 @@ aspire
aspire aspire
aspire aspire
aspire aspire
redhat9.tange.dk centos8.localdomain
redhat9.tange.dk centos8.localdomain
redhat9.tange.dk centos8.localdomain
redhat9.tange.dk centos8.localdomain
redhat9.tange.dk centos8.localdomain
redhat9.tange.dk centos8.localdomain
redhat9.tange.dk centos8.localdomain
### Check more than 9 simultaneous sshlogins ### Check more than 9 simultaneous sshlogins
1 1
2 2

View file

@ -3,13 +3,13 @@
newline newline
newline newline
good if no file good if no file
ls: tmp/parallel.file*: No such file or directory ls: cannot access 'tmp/parallel.file*': No such file or directory
ls: tmp/parallel.file*: No such file or directory ls: tmp/parallel.file*: No such file or directory
### --transfer --cleanup - file with newline ### --transfer --cleanup - file with newline
newline newline
newline newline
good if no file good if no file
ls: tmp/parallel.file*: No such file or directory ls: cannot access 'tmp/parallel.file*': No such file or directory
ls: tmp/parallel.file*: No such file or directory ls: tmp/parallel.file*: No such file or directory
### --return - file with newline ### --return - file with newline
tmp/parallel.file. tmp/parallel.file.
@ -22,7 +22,7 @@ newline1.out
tmp/parallel.file. tmp/parallel.file.
newline2.out newline2.out
good if no file good if no file
ls: tmp/parallel.file*: No such file or directory ls: cannot access 'tmp/parallel.file*': No such file or directory
OK OK
ls: tmp/parallel.file*: No such file or directory ls: tmp/parallel.file*: No such file or directory
OK OK
@ -32,7 +32,7 @@ newline1.out
tmp/parallel.file. tmp/parallel.file.
newline2.out newline2.out
good if no file good if no file
ls: tmp/parallel.file*: No such file or directory ls: cannot access 'tmp/parallel.file*': No such file or directory
OK OK
ls: tmp/parallel.file*: No such file or directory ls: tmp/parallel.file*: No such file or directory
OK OK
@ -42,7 +42,7 @@ newline1.out
tmp/parallel.file. tmp/parallel.file.
newline2.out newline2.out
good if no file good if no file
ls: tmp/parallel.file*: No such file or directory ls: cannot access 'tmp/parallel.file*': No such file or directory
OK OK
ls: tmp/parallel.file*: No such file or directory ls: tmp/parallel.file*: No such file or directory
OK OK
@ -56,7 +56,7 @@ newline2.out
tmp/parallel.file. tmp/parallel.file.
newline2.out2 newline2.out2
good if no file good if no file
ls: tmp/parallel.file*: No such file or directory ls: cannot access 'tmp/parallel.file*': No such file or directory
OK OK
ls: tmp/parallel.file*: No such file or directory ls: tmp/parallel.file*: No such file or directory
OK OK
@ -70,34 +70,34 @@ newline2.out
tmp/parallel.file. tmp/parallel.file.
newline2.out2 newline2.out2
good if no file good if no file
ls: tmp/parallel.file*: No such file or directory ls: cannot access 'tmp/parallel.file*': No such file or directory
OK OK
ls: tmp/parallel.file*: No such file or directory ls: tmp/parallel.file*: No such file or directory
OK OK
Input for ssh Input for ssh
-l parallel one-server -- mkdir -p ./. -l vagrant one-server -- mkdir -p ./.
-l parallel one-server rsync --server -lDrRze.iLsfxC . ./. -l vagrant one-server rsync --server -lDrRze.iLsfxC . ./.
-l parallel one-server -- exec perl -e '@GNU_Parallel=split/_/,"use_IPC::Open3;_use_MIME::Base64";eval"@GNU_Parallel";$chld=$SIG{CHLD};$SIG{CHLD}="IGNORE";my$zip=(grep{-x$_}"/usr/local/bin/bzip2")[0]||"bzip2";open3($in,$out,">&STDERR",$zip,"-dc");if(my$perlpid=fork){close$in;$eval=join"",<$out>;close$out;}else{close$out;print$in(decode_base64(join"",@ARGV));close$in;exit;}wait;$SIG{CHLD}=$chld;eval$eval;' base64 -l vagrant one-server -- exec perl -e '@GNU_Parallel=split/_/,"use_IPC::Open3;_use_MIME::Base64";eval"@GNU_Parallel";$chld=$SIG{CHLD};$SIG{CHLD}="IGNORE";my$zip=(grep{-x$_}"/usr/local/bin/bzip2")[0]||"bzip2";open3($in,$out,">&STDERR",$zip,"-dc");if(my$perlpid=fork){close$in;$eval=join"",<$out>;close$out;}else{close$out;print$in(decode_base64(join"",@ARGV));close$in;exit;}wait;$SIG{CHLD}=$chld;eval$eval;' base64
-l parallel one-server cd ././tmp; rsync --server --sender -lDrRze.iLsfxC . './parallel.file. -l vagrant one-server cd ././tmp; rsync --server --sender -lDrRze.iLsfxC . './parallel.file.
newlineX.out' newlineX.out'
-l parallel one-server cd ././tmp; rsync --server --sender -lDrRze.iLsfxC . './parallel.file. -l vagrant one-server cd ././tmp; rsync --server --sender -lDrRze.iLsfxC . './parallel.file.
newlineX.out2' newlineX.out2'
-l parallel one-server -- rm -f './tmp/parallel.file. -l vagrant one-server -- rm -f './tmp/parallel.file.
newlineX'; sh -c 'rmdir ./tmp/ ./ 2>/dev/null;' newlineX'; sh -c 'rmdir ./tmp/ ./ 2>/dev/null;'
-l parallel one-server -- rm -f './tmp/parallel.file. -l vagrant one-server -- rm -f './tmp/parallel.file.
newlineX.out'; sh -c 'rmdir ./tmp/ ./ 2>/dev/null;' newlineX.out'; sh -c 'rmdir ./tmp/ ./ 2>/dev/null;'
-l parallel one-server -- rm -f './tmp/parallel.file. -l vagrant one-server -- rm -f './tmp/parallel.file.
newlineX.out2'; sh -c 'rmdir ./tmp/ ./ 2>/dev/null;' newlineX.out2'; sh -c 'rmdir ./tmp/ ./ 2>/dev/null;'
-l parallel one-server -- mkdir -p ./. -l vagrant one-server -- mkdir -p ./.
-l parallel one-server rsync --server -lDrRze.iLsfxC . ./. -l vagrant one-server rsync --server -lDrRze.iLsfxC . ./.
-l parallel one-server -- exec perl -e '@GNU_Parallel=split/_/,"use_IPC::Open3;_use_MIME::Base64";eval"@GNU_Parallel";$chld=$SIG{CHLD};$SIG{CHLD}="IGNORE";my$zip=(grep{-x$_}"/usr/local/bin/bzip2")[0]||"bzip2";open3($in,$out,">&STDERR",$zip,"-dc");if(my$perlpid=fork){close$in;$eval=join"",<$out>;close$out;}else{close$out;print$in(decode_base64(join"",@ARGV));close$in;exit;}wait;$SIG{CHLD}=$chld;eval$eval;' base64 -l vagrant one-server -- exec perl -e '@GNU_Parallel=split/_/,"use_IPC::Open3;_use_MIME::Base64";eval"@GNU_Parallel";$chld=$SIG{CHLD};$SIG{CHLD}="IGNORE";my$zip=(grep{-x$_}"/usr/local/bin/bzip2")[0]||"bzip2";open3($in,$out,">&STDERR",$zip,"-dc");if(my$perlpid=fork){close$in;$eval=join"",<$out>;close$out;}else{close$out;print$in(decode_base64(join"",@ARGV));close$in;exit;}wait;$SIG{CHLD}=$chld;eval$eval;' base64
-l parallel one-server cd ././tmp; rsync --server --sender -lDrRze.iLsfxC . './parallel.file. -l vagrant one-server cd ././tmp; rsync --server --sender -lDrRze.iLsfxC . './parallel.file.
newlineX.out' newlineX.out'
-l parallel one-server cd ././tmp; rsync --server --sender -lDrRze.iLsfxC . './parallel.file. -l vagrant one-server cd ././tmp; rsync --server --sender -lDrRze.iLsfxC . './parallel.file.
newlineX.out2' newlineX.out2'
-l parallel one-server -- rm -f './tmp/parallel.file. -l vagrant one-server -- rm -f './tmp/parallel.file.
newlineX'; sh -c 'rmdir ./tmp/ ./ 2>/dev/null;' newlineX'; sh -c 'rmdir ./tmp/ ./ 2>/dev/null;'
-l parallel one-server -- rm -f './tmp/parallel.file. -l vagrant one-server -- rm -f './tmp/parallel.file.
newlineX.out'; sh -c 'rmdir ./tmp/ ./ 2>/dev/null;' newlineX.out'; sh -c 'rmdir ./tmp/ ./ 2>/dev/null;'
-l parallel one-server -- rm -f './tmp/parallel.file. -l vagrant one-server -- rm -f './tmp/parallel.file.
newlineX.out2'; sh -c 'rmdir ./tmp/ ./ 2>/dev/null;' newlineX.out2'; sh -c 'rmdir ./tmp/ ./ 2>/dev/null;'

View file

@ -2,28 +2,28 @@
4 4
1 1
1 1
centos3.tange.dk centos8.localdomain
freebsd12.localdomain
hostname; echo 1 hostname; echo 1
hostname; echo 1 hostname; echo 1
redhat9.tange.dk
### Test $PARALLEL - multi line ### Test $PARALLEL - multi line
1 1
1 1
centos3.tange.dk centos8.localdomain
freebsd12.localdomain
hostname; echo 1 hostname; echo 1
hostname; echo 1 hostname; echo 1
redhat9.tange.dk
### Test ~/.parallel/config - single line ### Test ~/.parallel/config - single line
1 1
1 1
centos3.tange.dk centos8.localdomain
freebsd12.localdomain
hostname; echo 1 hostname; echo 1
hostname; echo 1 hostname; echo 1
redhat9.tange.dk
### Test ~/.parallel/config - multi line ### Test ~/.parallel/config - multi line
1 1
1 1
centos3.tange.dk centos8.localdomain
freebsd12.localdomain
hostname; echo 1 hostname; echo 1
hostname; echo 1 hostname; echo 1
redhat9.tange.dk

View file

@ -13,9 +13,9 @@ script2 run 4
script1 run 5 script1 run 5
script2 run 5 script2 run 5
good if no file good if no file
ls: script1: No such file or directory ls: cannot access 'script1': No such file or directory
OK OK
ls: script2: No such file or directory ls: cannot access 'script2': No such file or directory
OK OK
### Test --basefile + --sshlogin : ### Test --basefile + --sshlogin :
1 1

View file

@ -72,7 +72,7 @@ perl -pe '$a=1; print $a' <(echo foo)
perl -pe "\$a=1; print \$a" <(echo foo) perl -pe "\$a=1; print \$a" <(echo foo)
1foo 1foo
### Test merging of profiles - sort needed because -k only works on the single machine ### Test merging of profiles - sort needed because -k only works on the single machine
parallel@parallel-server1 a vagrant@parallel-server1 a
parallel@parallel-server2 a vagrant@parallel-server2 a
### Test merging of profiles - sort needed because -k only works on the single machine --plain ### Test merging of profiles - sort needed because -k only works on the single machine --plain
a a

View file

@ -4,25 +4,25 @@
file1 file1
file2 file2
good if no file good if no file
ls: /tmp/parallel.file*: No such file or directory ls: cannot access '/tmp/parallel.file*': No such file or directory
ls: /tmp/parallel.file*: No such file or directory ls: /tmp/parallel.file*: No such file or directory
### --transfer - relpath ### --transfer - relpath
file1 file1
file2 file2
good if no file good if no file
ls: tmp/parallel.file*: No such file or directory ls: cannot access 'tmp/parallel.file*': No such file or directory
ls: tmp/parallel.file*: No such file or directory ls: tmp/parallel.file*: No such file or directory
### --transfer --cleanup - abspath ### --transfer --cleanup - abspath
file1 file1
file2 file2
good if no file good if no file
ls: /tmp/parallel.file*: No such file or directory ls: cannot access '/tmp/parallel.file*': No such file or directory
ls: /tmp/parallel.file*: No such file or directory ls: /tmp/parallel.file*: No such file or directory
### --transfer --cleanup - relpath ### --transfer --cleanup - relpath
file1 file1
file2 file2
good if no file good if no file
ls: tmp/parallel.file*: No such file or directory ls: cannot access 'tmp/parallel.file*': No such file or directory
OK OK
ls: tmp/parallel.file*: No such file or directory ls: tmp/parallel.file*: No such file or directory
OK OK
@ -43,7 +43,7 @@ tmp/parallel.file2.out
/tmp/parallel.file2.file.done /tmp/parallel.file2.file.done
/tmp/parallel.file2.out /tmp/parallel.file2.out
good if no file good if no file
ls: /tmp/parallel.file*: No such file or directory ls: cannot access '/tmp/parallel.file*': No such file or directory
OK OK
ls: /tmp/parallel.file*: No such file or directory ls: /tmp/parallel.file*: No such file or directory
OK OK
@ -53,7 +53,7 @@ tmp/parallel.file1.out
tmp/parallel.file2.file.done tmp/parallel.file2.file.done
tmp/parallel.file2.out tmp/parallel.file2.out
good if no file good if no file
ls: tmp/parallel.file*: No such file or directory ls: cannot access 'tmp/parallel.file*': No such file or directory
OK OK
ls: tmp/parallel.file*: No such file or directory ls: tmp/parallel.file*: No such file or directory
OK OK
@ -63,7 +63,7 @@ OK
/tmp/parallel.file2.file.done /tmp/parallel.file2.file.done
/tmp/parallel.file2.out /tmp/parallel.file2.out
good if no file good if no file
ls: tmp/parallel.file*: No such file or directory ls: cannot access 'tmp/parallel.file*': No such file or directory
OK OK
ls: tmp/parallel.file*: No such file or directory ls: tmp/parallel.file*: No such file or directory
OK OK
@ -73,7 +73,7 @@ OK
/tmp/parallel.file2.file.done /tmp/parallel.file2.file.done
/tmp/parallel.file2.out /tmp/parallel.file2.out
good if no file good if no file
ls: /tmp/parallel.file*: No such file or directory ls: cannot access '/tmp/parallel.file*': No such file or directory
OK OK
ls: /tmp/parallel.file*: No such file or directory ls: /tmp/parallel.file*: No such file or directory
OK OK
@ -83,7 +83,7 @@ OK
/tmp/parallel.file2.file.done /tmp/parallel.file2.file.done
/tmp/parallel.file2.out /tmp/parallel.file2.out
good if no file good if no file
ls: tmp/parallel.file*: No such file or directory ls: cannot access 'tmp/parallel.file*': No such file or directory
OK OK
ls: tmp/parallel.file*: No such file or directory ls: tmp/parallel.file*: No such file or directory
OK OK
@ -92,7 +92,7 @@ OK
/tmp/parallel.file1.out /tmp/parallel.file1.out
/tmp/parallel.file2.file.done /tmp/parallel.file2.file.done
/tmp/parallel.file2.out /tmp/parallel.file2.out
ls: tmp/parallel.file*: No such file or directory ls: cannot access 'tmp/parallel.file*': No such file or directory
OK OK
ls: tmp/parallel.file*: No such file or directory ls: tmp/parallel.file*: No such file or directory
OK OK
@ -102,7 +102,7 @@ OK
/tmp/parallel.file2.file.done /tmp/parallel.file2.file.done
/tmp/parallel.file2.out /tmp/parallel.file2.out
good if no file good if no file
ls: /tmp/parallel.file*: No such file or directory ls: cannot access '/tmp/parallel.file*': No such file or directory
OK OK
ls: /tmp/parallel.file*: No such file or directory ls: /tmp/parallel.file*: No such file or directory
OK OK
@ -112,7 +112,7 @@ tmp/parallel.file1.out
tmp/parallel.file2.file.done tmp/parallel.file2.file.done
tmp/parallel.file2.out tmp/parallel.file2.out
good if no file good if no file
ls: tmp/parallel.file*: No such file or directory ls: cannot access 'tmp/parallel.file*': No such file or directory
OK OK
ls: tmp/parallel.file*: No such file or directory ls: tmp/parallel.file*: No such file or directory
OK OK
@ -122,7 +122,7 @@ OK
/tmp/parallel.file2.file.done /tmp/parallel.file2.file.done
/tmp/parallel.file2.out /tmp/parallel.file2.out
good if no file good if no file
ls: /tmp/parallel.file*: No such file or directory ls: cannot access '/tmp/parallel.file*': No such file or directory
OK OK
ls: /tmp/parallel.file*: No such file or directory ls: /tmp/parallel.file*: No such file or directory
OK OK

View file

@ -1,4 +1,4 @@
echo '### Test --onall'; parallel --onall -S parallel@parallel-server1,parallel@parallel-server2 '(echo {1} {2}) | awk \{print\ \$2}' ::: a b c ::: 1 2 echo '### Test --onall'; parallel --onall -S vagrant@parallel-server1,vagrant@parallel-server2 '(echo {1} {2}) | awk \{print\ \$2}' ::: a b c ::: 1 2
### Test --onall ### Test --onall
1 1
2 2
@ -12,7 +12,7 @@ echo '### Test --onall'; parallel --onall -S parallel@parallel-server1,paralle
2 2
1 1
2 2
echo '### Test | --onall'; seq 3 | parallel --onall -S parallel@parallel-server1,parallel@parallel-server2 '(echo {1} {2}) | awk \{print\ \$2}' ::: a b c :::: - echo '### Test | --onall'; seq 3 | parallel --onall -S vagrant@parallel-server1,vagrant@parallel-server2 '(echo {1} {2}) | awk \{print\ \$2}' ::: a b c :::: -
### Test | --onall ### Test | --onall
1 1
2 2
@ -32,7 +32,7 @@ echo '### Test | --onall'; seq 3 | parallel --onall -S parallel@parallel-serve
1 1
2 2
3 3
echo '### Test --onall -u'; parallel --onall -S parallel@parallel-server1,parallel@parallel-server2 -u '(echo {1} {2}) | awk \{print\ \$2}' ::: a b c ::: 1 2 3 | sort echo '### Test --onall -u'; parallel --onall -S vagrant@parallel-server1,vagrant@parallel-server2 -u '(echo {1} {2}) | awk \{print\ \$2}' ::: a b c ::: 1 2 3 | sort
### Test --onall -u ### Test --onall -u
1 1
1 1
@ -52,31 +52,31 @@ echo '### Test --onall -u'; parallel --onall -S parallel@parallel-server1,para
3 3
3 3
3 3
echo '### Test --nonall'; parallel --nonall -k -S parallel@parallel-server1,parallel@parallel-server2 'hostname' | sort echo '### Test --nonall'; parallel --nonall -k -S vagrant@parallel-server1,vagrant@parallel-server2 'hostname' | sort
### Test --nonall ### Test --nonall
centos3.tange.dk centos8.localdomain
redhat9.tange.dk freebsd11.localdomain
echo '### Test --nonall -u - should be interleaved x y x y'; parallel --nonall -S parallel@parallel-server1,parallel@parallel-server2 -u 'hostname|grep -q redhat9 && sleep 3; hostname;sleep 12;hostname;' echo '### Test --nonall -u - should be interleaved x y x y'; parallel --nonall -S vagrant@parallel-server1,vagrant@parallel-server2 -u 'hostname|grep -q redhat9 && sleep 3; hostname;sleep 12;hostname;'
### Test --nonall -u - should be interleaved x y x y ### Test --nonall -u - should be interleaved x y x y
centos3.tange.dk freebsd11.localdomain
redhat9.tange.dk centos8.localdomain
centos3.tange.dk freebsd11.localdomain
redhat9.tange.dk centos8.localdomain
echo '### Test read sshloginfile from STDIN'; echo parallel@parallel-server1 | parallel -S - --nonall hostname; echo parallel@parallel-server1 | parallel --sshloginfile - --nonall hostname echo '### Test read sshloginfile from STDIN'; echo vagrant@parallel-server1 | parallel -S - --nonall hostname; echo vagrant@parallel-server1 | parallel --sshloginfile - --nonall hostname
### Test read sshloginfile from STDIN ### Test read sshloginfile from STDIN
redhat9.tange.dk centos8.localdomain
redhat9.tange.dk centos8.localdomain
echo '### Test --nonall --basefile'; touch /tmp/nonall--basefile; parallel --nonall --basefile /tmp/nonall--basefile -S parallel@parallel-server1,parallel@parallel-server2 ls /tmp/nonall--basefile\; rm /tmp/nonall--basefile; rm /tmp/nonall--basefile echo '### Test --nonall --basefile'; touch /tmp/nonall--basefile; parallel --nonall --basefile /tmp/nonall--basefile -S vagrant@parallel-server1,vagrant@parallel-server2 ls /tmp/nonall--basefile\; rm /tmp/nonall--basefile; rm /tmp/nonall--basefile
### Test --nonall --basefile ### Test --nonall --basefile
/tmp/nonall--basefile /tmp/nonall--basefile
/tmp/nonall--basefile /tmp/nonall--basefile
echo '### Test --onall --basefile'; touch /tmp/onall--basefile; parallel --onall --basefile /tmp/onall--basefile -S parallel@parallel-server1,parallel@parallel-server2 ls {}\; rm {} ::: /tmp/onall--basefile; rm /tmp/onall--basefile echo '### Test --onall --basefile'; touch /tmp/onall--basefile; parallel --onall --basefile /tmp/onall--basefile -S vagrant@parallel-server1,vagrant@parallel-server2 ls {}\; rm {} ::: /tmp/onall--basefile; rm /tmp/onall--basefile
### Test --onall --basefile ### Test --onall --basefile
/tmp/onall--basefile /tmp/onall--basefile
/tmp/onall--basefile /tmp/onall--basefile
echo '### Test --workdir .'; ssh parallel@parallel-server1 mkdir -p mydir; mkdir -p $HOME/mydir; cd $HOME/mydir; parallel --workdir . -S parallel@parallel-server1 ::: pwd echo '### Test --workdir .'; ssh vagrant@parallel-server1 mkdir -p mydir; mkdir -p $HOME/mydir; cd $HOME/mydir; parallel --workdir . -S vagrant@parallel-server1 ::: pwd
### Test --workdir . ### Test --workdir .
/home/parallel/mydir /home/vagrant/mydir
echo '### Test --wd .'; ssh parallel@parallel-server2 mkdir -p mydir; mkdir -p $HOME/mydir; cd $HOME/mydir; parallel --workdir . -S parallel@parallel-server2 ::: pwd echo '### Test --wd .'; ssh vagrant@parallel-server2 mkdir -p mydir; mkdir -p $HOME/mydir; cd $HOME/mydir; parallel --workdir . -S vagrant@parallel-server2 ::: pwd
### Test --wd . ### Test --wd .
/home/parallel/mydir /usr/home/vagrant/mydir