Fixed bug #44553: --rpl should replace the longest expression first.

This commit is contained in:
Ole Tange 2015-03-16 19:51:08 +01:00
parent 32b6dc4ba5
commit 8990c7bb42
17 changed files with 258 additions and 106 deletions

View file

@ -208,28 +208,51 @@ cc:Tim Cuthbertson <tim3d.junk@gmail.com>,
Ryoichiro Suzuki <ryoichiro.suzuki@gmail.com>, Ryoichiro Suzuki <ryoichiro.suzuki@gmail.com>,
Jesse Alama <jesse.alama@gmail.com> Jesse Alama <jesse.alama@gmail.com>
Subject: GNU Parallel 20150322 ('') released Subject: GNU Parallel 20150322 ('Hellwig') released
GNU Parallel 20150322 ('') has been released. It is available for download at: http://ftp.gnu.org/gnu/parallel/ GNU Parallel 20150322 ('Hellwig') has been released. It is available for download at: http://ftp.gnu.org/gnu/parallel/
Haiku of the month: Haiku of the month:
<<>> Stand up for your rights.
VMware does not comply.
Hellwig goes to court.
(https://sfconservancy.org/linux-compliance/vmware-lawsuit-faq.html)
New in this release: New in this release:
* --number-of-cores respects 'taskset' on GNU/Linux.
* --joblog --pipe gives the data send and received in the log.
* GNU Parallel was tested to support 100 GB sized records in --pipe. A few bugs was fixed to support >2 GB records. It works, but is rather slow.
* GNU Parallel was cited in: RIG: Recalibration and Interrelation of genomic sequence data with the GATK http://www.g3journal.org/content/early/2015/02/13/g3.115.017012.full.pdf+html * GNU Parallel was cited in: RIG: Recalibration and Interrelation of genomic sequence data with the GATK http://www.g3journal.org/content/early/2015/02/13/g3.115.017012.full.pdf+html
* GNU Parallel was cited in: MPI-blastn and NCBI-TaxCollector: Improving metagenomic analysis with high performance classification and wide taxonomic attachment http://www.worldscientific.com/doi/abs/10.1142/S0219720014500139?af=R& * GNU Parallel was cited in: MPI-blastn and NCBI-TaxCollector: Improving metagenomic analysis with high performance classification and wide taxonomic attachment http://www.worldscientific.com/doi/abs/10.1142/S0219720014500139?af=R&
* GNU Parallel was cited in: Recent evolution in Rattus norvegicus is shaped by declining effective population size http://biorxiv.org/content/biorxiv/early/2015/03/01/015818.full.pdf
* GNU Parallel was cited in: Evidence for DCO+ as a probe of ionization in the warm disk surface http://arxiv.org/pdf/1503.02659.pdf
* GNU Parallel was used in: https://github.com/alexbyrnes/FCC-Political-Ads_The-Code * GNU Parallel was used in: https://github.com/alexbyrnes/FCC-Political-Ads_The-Code
* GNU Parallel was used in: https://github.com/martymac/fpart * GNU Parallel was used in: https://github.com/martymac/fpart
* GNU Parallel was used in: https://github.com/mehmattski/HybSeqPipeline * GNU Parallel was used in: https://github.com/mehmattski/HybSeqPipeline
taxator-tk http://algbio.cs.uni-duesseldorf.de/webapps/wa-download/ (check it)
* Using GNU Parallel on a Raspberry Pi cluster: http://www.dcglug.org.uk/cluster-progress/ * Using GNU Parallel on a Raspberry Pi cluster: http://www.dcglug.org.uk/cluster-progress/
* Running scripts in parallel with GNU Parallel: http://code.jasonbhill.com/2015/03/
* Mahout: Parallelising the creation of DecisionTrees: http://www.markhneedham.com/blog/2012/12/27/mahout-parallelising-the-creation-of-decisiontrees/
* Parallel - Jobs in Skripten parallelisieren: https://slzm.de/blog/linux-tool-des-tages-parallel-jobs-in-skripten-parallelisieren/#more-612
* Bug fixes and man page updates. * Bug fixes and man page updates.
GNU Parallel - For people who live life in the parallel lane. GNU Parallel - For people who live life in the parallel lane.

View file

@ -1052,7 +1052,7 @@ sub parse_options {
sub init_globals { sub init_globals {
# Defaults: # Defaults:
$Global::version = 20150307; $Global::version = 20150308;
$Global::progname = 'parallel'; $Global::progname = 'parallel';
$Global::infinity = 2**31; $Global::infinity = 2**31;
$Global::debug = 0; $Global::debug = 0;
@ -1585,7 +1585,7 @@ sub perl_quote_scalar {
} }
sub unquote_printf { sub unquote_printf {
# Convert \t \n \r \0 \000 # Convert \t \n \r \000 \0
$_ = shift; $_ = shift;
s/\\t/\t/g; s/\\t/\t/g;
s/\\n/\n/g; s/\\n/\n/g;
@ -3756,7 +3756,7 @@ sub memfree_recompute {
my $script = memfreescript(); my $script = memfreescript();
# TODO add sshlogin and backgrounding # TODO add sshlogin and backgrounding
$self->{'memfree'} = `$script`; $self->{'memfree'} = qx{ $script };
#::debug("mem","New free:",$self->{'memfree'}," "); #::debug("mem","New free:",$self->{'memfree'}," ");
} }
@ -3805,7 +3805,7 @@ sub memfree_recompute {
for my $os (keys %script_of) { for my $os (keys %script_of) {
$perlscript .= 'if($^O eq "'.$os.'") { '.$script_of{$os}.'}'; $perlscript .= 'if($^O eq "'.$os.'") { '.$script_of{$os}.'}';
} }
$perlscript =~ s/[\t\n]/ /g; $perlscript =~ s/[\t\n ]+/ /g;
$perlscript = "perl -e " . ::shell_quote_scalar($perlscript); $perlscript = "perl -e " . ::shell_quote_scalar($perlscript);
$script = $Global::envvar. " " .$perlscript; $script = $Global::envvar. " " .$perlscript;
} }
@ -5403,16 +5403,27 @@ sub slot {
# syswrite may be interrupted by SIGHUP # syswrite may be interrupted by SIGHUP
substr($buf,0,$bytes_written) = ""; substr($buf,0,$bytes_written) = "";
} }
# Something printed: Wait less next time
$sleep /= 2;
} else { } else {
if(eof(IN) and not $writer_running) { if(eof(IN) and not $writer_running) {
# Writer dead: There will never be more to read => exit # Writer dead: There will never be more to read => exit
-e $unlink_file and unlink $unlink_file; -e $unlink_file and unlink $unlink_file;
exit; exit;
} }
# Wait for something to happen on file handle IN # TODO This could probably be done more efficiently using select(2)
select(fileno(IN), undef, undef, undef); # Nothing read: Wait longer before next read
# Up to 30 milliseconds
$sleep = ($sleep < 30) ? ($sleep * 1.001 + 0.01) : ($sleep);
usleep($sleep);
} }
} }
sub usleep {
# Sleep this many milliseconds.
my $secs = shift;
select(undef, undef, undef, $secs/1000);
}
}; };
$cattail =~ s/#.*//mg; $cattail =~ s/#.*//mg;
$cattail =~ s/\s+/ /g; $cattail =~ s/\s+/ /g;
@ -6684,7 +6695,7 @@ sub print_dryrun_and_verbose {
(undef, $tmuxsocket) = ::tmpfile(SUFFIX => ".tms"); (undef, $tmuxsocket) = ::tmpfile(SUFFIX => ".tms");
$Global::unlink{$tmuxsocket} = 1; $Global::unlink{$tmuxsocket} = 1;
unlink $tmuxsocket; unlink $tmuxsocket;
::status("See output with: $ENV{'TMUX'} -S $tmuxsocket attach -t p$$\n"); ::status("See output with: $ENV{'TMUX'} -S $tmuxsocket attach\n");
} }
$tmux = $ENV{'TMUX'}." -S $tmuxsocket new-session -s p$$ -d 'sleep .2' >&/dev/null;" . $tmux = $ENV{'TMUX'}." -S $tmuxsocket new-session -s p$$ -d 'sleep .2' >&/dev/null;" .
$ENV{'TMUX'}." -S $tmuxsocket new-window -t p$$ -n $title"; $ENV{'TMUX'}." -S $tmuxsocket new-window -t p$$ -n $title";
@ -6801,7 +6812,6 @@ sub print {
# Skip --joblog, --dryrun, --verbose # Skip --joblog, --dryrun, --verbose
} else { } else {
if($opt::ungroup and $Global::joblog and defined $self->{'exitstatus'}) { if($opt::ungroup and $Global::joblog and defined $self->{'exitstatus'}) {
# if($Global::joblog and defined $self->{'exitstatus'}) {
# Add to joblog when finished # Add to joblog when finished
$self->print_joblog(); $self->print_joblog();
# Printing is only relevant for grouped/--line-buffer output. # Printing is only relevant for grouped/--line-buffer output.
@ -7659,7 +7669,6 @@ sub replaced {
# This is actually a CommandLine-object, # This is actually a CommandLine-object,
# but it looks nice to be able to say {= $job->slot() =} # but it looks nice to be able to say {= $job->slot() =}
my $job = $self; my $job = $self;
for my $word (@word) { for my $word (@word) {
# word = AB \257< perlexpr \257> CD \257< perlexpr \257> EF # word = AB \257< perlexpr \257> CD \257< perlexpr \257> EF
::debug("replace", "Replacing in $word\n"); ::debug("replace", "Replacing in $word\n");
@ -7758,7 +7767,10 @@ sub new {
# to deal with: {={==} # to deal with: {={==}
while(s{([^\257]*) \Q$Global::parensleft\E ([^\257]*?) \Q$Global::parensright\E } while(s{([^\257]*) \Q$Global::parensleft\E ([^\257]*?) \Q$Global::parensright\E }
{$1\257<$2\257>}gx) {} {$1\257<$2\257>}gx) {}
for my $rpl (keys %Global::rpl) { for my $rpl (sort { length $b <=> length $a } keys %Global::rpl) {
# Replace long --rpl's before short ones, as a short may be a
# substring of a long:
# --rpl '% s/a/b/' --rpl '%% s/b/a/'
# Replace the short hand string (--rpl) # Replace the short hand string (--rpl)
# with the {= perl expr =} # with the {= perl expr =}
# Avoid replacing inside existing {= perl expr =} # Avoid replacing inside existing {= perl expr =}
@ -7930,15 +7942,14 @@ sub get {
my $cmd_line = shift @{$self->{'unget'}}; my $cmd_line = shift @{$self->{'unget'}};
return ($cmd_line); return ($cmd_line);
} else { } else {
my $cmd_line; my $cmd_line = CommandLine->new($self->seq(),
$cmd_line = CommandLine->new($self->seq(), $self->{'command'},
$self->{'command'}, $self->{'arg_queue'},
$self->{'arg_queue'}, $self->{'context_replace'},
$self->{'context_replace'}, $self->{'max_number_of_args'},
$self->{'max_number_of_args'}, $self->{'return_files'},
$self->{'return_files'}, $self->{'replacecount'},
$self->{'replacecount'}, $self->{'len'},
$self->{'len'},
); );
$cmd_line->populate(); $cmd_line->populate();
::debug("init","cmd_line->number_of_args ", ::debug("init","cmd_line->number_of_args ",

View file

@ -270,6 +270,43 @@ B<--block-size> gives very poor performance; by exponentially
increasing the block size performance will not suffer. increasing the block size performance will not suffer.
=head2 Convenience options --nice --basefile --transfer --return
--cleanup --tmux --group --compress --cat --fifo --workdir
These are all convenience options that make it easier to do a
task. But more importantly: They are tested to work on corner cases,
too. Take B<--nice> as an example:
nice parallel command ...
will work just fine. But when run remotely, you need to move the nice
command so it is being run on the server:
parallel --S server nice command ...
And this will again work just fine, as long as you are running a
single command. When you are running a composed command you need nice
to apply to the whole command, and it gets harder still:
parallel --S server --q nice bash -c 'command1 ...; command2 | command3'
It is not impossible, but by using B<--nice> GNU B<parallel> will do
the right thing for you. Similarly when transferring files: It starts
to get hard when the file names contain space, :, , *, or other
special characters.
To run the commands in a B<tmux> session you basically just need to
quote the command. For simple commands that is easy, but when commands
contain special characters, it gets much harder to get right.
B<--cat> and B<--fifo> are easy to do by hand, until you want to clean
up the tmpfile and keep the exit code of the command.
The real killer comes when you try to combine several of these: Doing
that correctly for all corner cases is next to impossible to do by
hard.
=head2 Shell shock =head2 Shell shock
The shell shock bug in B<bash> did not affect GNU B<parallel>, but the The shell shock bug in B<bash> did not affect GNU B<parallel>, but the

View file

@ -56,6 +56,7 @@
<ul> <ul>
<li><a href="#Number-of-simultaneous-jobs">Number of simultaneous jobs</a></li> <li><a href="#Number-of-simultaneous-jobs">Number of simultaneous jobs</a></li>
<li><a href="#Interactivity">Interactivity</a></li> <li><a href="#Interactivity">Interactivity</a></li>
<li><a href="#A-terminal-for-every-job">A terminal for every job</a></li>
<li><a href="#Timing">Timing</a></li> <li><a href="#Timing">Timing</a></li>
<li><a href="#Progress">Progress</a></li> <li><a href="#Progress">Progress</a></li>
<li><a href="#Termination">Termination</a></li> <li><a href="#Termination">Termination</a></li>
@ -1072,6 +1073,18 @@
<pre><code> parallel -X --tty vi ::: 1 2 3</code></pre> <pre><code> parallel -X --tty vi ::: 1 2 3</code></pre>
<h2 id="A-terminal-for-every-job">A terminal for every job</h2>
<p>Using tmux GNU Parallel can start a terminal for every job run:</p>
<pre><code> seq 10 40 | parallel --tmux &#39;echo start {}; sleep {}; echo done {}&#39;</code></pre>
<p>This will tell you to run something similar to:</p>
<pre><code> tmux -S /tmp/paroRLCx.tms attach</code></pre>
<p>Using normal tmux keystrokes (CTRL-b n or CTRL-b p) you can cycle between windows of the running jobs. When a job is finished it will pause for 10 seconds before closing the window.</p>
<h2 id="Timing">Timing</h2> <h2 id="Timing">Timing</h2>
<p>Some jobs do heavy I/O when they start. To avoid a thundering herd GNU Parallel can delay starting new jobs. --delay X will make sure there is at least X seconds between each start:</p> <p>Some jobs do heavy I/O when they start. To avoid a thundering herd GNU Parallel can delay starting new jobs. --delay X will make sure there is at least X seconds between each start:</p>
@ -1133,6 +1146,14 @@
Computer:jobs running/jobs completed/%of started jobs/Average seconds to complete Computer:jobs running/jobs completed/%of started jobs/Average seconds to complete
local:0/9/100%/1.1s</code></pre> local:0/9/100%/1.1s</code></pre>
<p>A progress bar can be shown with --bar:</p>
<pre><code> parallel --bar sleep ::: 1 3 2 2 1 3 3 2 1</code></pre>
<p>And a graphic bar can be shown with --bar and zenity:</p>
<pre><code> seq 1000 | parallel -j10 --bar &#39;(echo -n {};sleep 0.1)&#39; 2&gt; &gt;(zenity --progress --auto-kill)</code></pre>
<p>A logfile of the jobs completed so far can be generated with --joblog:</p> <p>A logfile of the jobs completed so far can be generated with --joblog:</p>
<pre><code> parallel --joblog /tmp/log exit ::: 1 2 3 0 <pre><code> parallel --joblog /tmp/log exit ::: 1 2 3 0

View file

@ -1007,6 +1007,20 @@ Or give multiple argument in one go to open multiple files:
parallel -X --tty vi ::: 1 2 3 parallel -X --tty vi ::: 1 2 3
=head2 A terminal for every job
Using tmux GNU Parallel can start a terminal for every job run:
seq 10 40 | parallel --tmux 'echo start {}; sleep {}; echo done {}'
This will tell you to run something similar to:
tmux -S /tmp/paroRLCx.tms attach
Using normal tmux keystrokes (CTRL-b n or CTRL-b p) you can cycle
between windows of the running jobs. When a job is finished it will
pause for 10 seconds before closing the window.
=head2 Timing =head2 Timing
Some jobs do heavy I/O when they start. To avoid a thundering herd GNU Some jobs do heavy I/O when they start. To avoid a thundering herd GNU
@ -1074,6 +1088,14 @@ Output:
Computer:jobs running/jobs completed/%of started jobs/Average seconds to complete Computer:jobs running/jobs completed/%of started jobs/Average seconds to complete
local:0/9/100%/1.1s local:0/9/100%/1.1s
A progress bar can be shown with --bar:
parallel --bar sleep ::: 1 3 2 2 1 3 3 2 1
And a graphic bar can be shown with --bar and zenity:
seq 1000 | parallel -j10 --bar '(echo -n {};sleep 0.1)' 2> >(zenity --progress --auto-kill)
A logfile of the jobs completed so far can be generated with --joblog: A logfile of the jobs completed so far can be generated with --joblog:
parallel --joblog /tmp/log exit ::: 1 2 3 0 parallel --joblog /tmp/log exit ::: 1 2 3 0

View file

@ -60,5 +60,12 @@ echo '### bug #43817: Some JP char cause problems in positional replacement stri
parallel -Xj1 echo ::: '<27><<3C>>' '<27><1 $_=2<>>' 'ワ' parallel -Xj1 echo ::: '<27><<3C>>' '<27><1 $_=2<>>' 'ワ'
parallel -Xj1 echo {1} ::: '<27><<3C>>' '<27><1 $_=2<>>' 'ワ' parallel -Xj1 echo {1} ::: '<27><<3C>>' '<27><1 $_=2<>>' 'ワ'
echo '**'
parallel --plus --rpl '%'
--rpl '%D $_=::shell_quote(::dirname($_));' --rpl '%B s:.*/::;s:\.[^/.]+$::;' --rpl '%E s:.*\.::'
'echo {}=%;echo %D={//};echo %B={/.};echo %E={+.};echo %D/%B.%E={}' ::: a.b/c.d/e.f
echo '**'
EOF EOF

25
testsuite/tests-to-run/parallel-local-mem.sh Normal file → Executable file
View file

@ -1,32 +1,35 @@
#!/bin/bash #!/bin/bash
make stopvm
# Jobs that eat more than 2 GB RAM # Jobs that eat more than 2 GB RAM
cat <<'EOF' | sed -e 's/;$/; /;s/$SERVER1/'$SERVER1'/;s/$SERVER2/'$SERVER2'/' | stdout parallel -vj1 -k --joblog /tmp/jl-`basename $0` -L1 cat <<'EOF' | sed -e 's/;$/; /;s/$SERVER1/'$SERVER1'/;s/$SERVER2/'$SERVER2'/' | stdout parallel -vj1 -k --joblog /tmp/jl-`basename $0` -L1
echo '### Trouble reading a record > 2 GB for certain versions of Perl (substr($a,0,2G+1)="fails")' echo '### Trouble reading a record > 2 GB for certain versions of Perl (substr($a,0,2G+1)="fails")'
echo '### perl -e $buf=("x"x(2**31))."x"; substr($buf,0,2**31+1)=""; print length $buf' echo '### perl -e $buf=("x"x(2**31))."x"; substr($buf,0,2**31+1)=""; print length $buf'
' echo 'Eats 4 GB'
perl -e '$buf=("x"x(2**31))."x"; substr($buf,0,2**31+1)=""; print length $buf."\n"'
echo 'Eats 2.5 GB' echo 'Eats 2.5 GB'
(yes "`echo {1..100}`" | head -c 2300M; echo ged) | (yes "`seq 3000`" | head -c 2300M; echo ged) |
PERL5LIB=input-files/perl-v5.14.2/lib input-files/perl-v5.14.2/perl `which parallel` -k --block 2G --pipe --recend ged md5sum PERL5LIB=input-files/perl-v5.14.2/lib input-files/perl-v5.14.2/perl `which parallel` -k --block 2G --pipe --recend ged md5sum
echo 'Eats 2.5 GB' echo 'Eats 2.5 GB'
(yes "`echo {1..100}`" | head -c 2300M; echo ged) | (yes "`seq 3000`" | head -c 2300M; echo ged) |
PERL5LIB=input-files/perl-v5.14.2/lib input-files/perl-v5.14.2/perl `which parallel` -k --block 2G --pipe --recend ged cat | wc -c PERL5LIB=input-files/perl-v5.14.2/lib input-files/perl-v5.14.2/perl `which parallel` -k --block 2G --pipe --recend ged cat | wc -c
echo '**' echo '**'
echo '### bug #44358: 2 GB records cause problems for -N' echo '### bug #44358: 2 GB records cause problems for -N'
echo '5 GB version: Eats 12.5 GB' echo '5 GB version: Eats 12.5 GB'
(yes "`seq 3000`" | head -c 5000000000; echo FOO;
(yes "`echo {1..100}`" | head -c 5000000000; echo FOO; yes "`seq 3000`" | head -c 3000000000; echo FOO;
yes "`echo {1..100}`" | head -c 3000000000; echo FOO; yes "`seq 3000`" | head -c 1000000000;) |
yes "`echo {1..100}`" | head -c 1000000000;) |
PERL5LIB=input-files/perl-v5.14.2/lib input-files/perl-v5.14.2/perl PERL5LIB=input-files/perl-v5.14.2/lib input-files/perl-v5.14.2/perl
`which parallel` --pipe --recend FOO -N2 --block 1g -k LANG=c wc -c `which parallel` --pipe --recend FOO -N2 --block 1g -k LANG=c wc -c
echo '2 GB version: eats 10 GB' echo '2 GB version: eats 10 GB'
(yes "`echo {1..100}`" | head -c 2300M; echo FOO; (yes "`seq 3000`" | head -c 2300M; echo FOO;
yes "`echo {1..100}`" | head -c 2300M; echo FOO; yes "`seq 3000`" | head -c 2300M; echo FOO;
yes "`echo {1..100}`" | head -c 1000M;) | yes "`seq 3000`" | head -c 1000M;) |
PERL5LIB=input-files/perl-v5.14.2/lib input-files/perl-v5.14.2/perl PERL5LIB=input-files/perl-v5.14.2/lib input-files/perl-v5.14.2/perl
`which parallel` --pipe --recend FOO -N2 --block 1g -k LANG=c wc -c `which parallel` --pipe --recend FOO -N2 --block 1g -k LANG=c wc -c
@ -37,3 +40,5 @@ echo '### -L >4GB'
parallel --pipe -L2 --block 1g -k LANG=c wc -c parallel --pipe -L2 --block 1g -k LANG=c wc -c
EOF EOF
make startvm

View file

@ -29,12 +29,12 @@ echo '### Test tmux works on different shells'
parallel -Scsh@lo,tcsh@lo,parallel@lo,zsh@lo --tmux false ::: 1 2 3 4; echo $? parallel -Scsh@lo,tcsh@lo,parallel@lo,zsh@lo --tmux false ::: 1 2 3 4; echo $?
export PARTMUX='parallel -Scsh@lo,tcsh@lo,parallel@lo,zsh@lo --tmux '; export PARTMUX='parallel -Scsh@lo,tcsh@lo,parallel@lo,zsh@lo --tmux ';
ssh zsh@lo "$PARTMUX" 'true ::: 1 2 3 4; echo $status'; stdout ssh zsh@lo "$PARTMUX" 'true ::: 1 2 3 4; echo $status' | grep -v 'See output';
ssh zsh@lo "$PARTMUX" 'false ::: 1 2 3 4; echo $status'; stdout ssh zsh@lo "$PARTMUX" 'false ::: 1 2 3 4; echo $status' | grep -v 'See output';
ssh parallel@lo "$PARTMUX" 'true ::: 1 2 3 4; echo $?'; stdout ssh parallel@lo "$PARTMUX" 'true ::: 1 2 3 4; echo $?' | grep -v 'See output';
ssh parallel@lo "$PARTMUX" 'false ::: 1 2 3 4; echo $?'; stdout ssh parallel@lo "$PARTMUX" 'false ::: 1 2 3 4; echo $?' | grep -v 'See output';
ssh tcsh@lo "$PARTMUX" 'true ::: 1 2 3 4; echo $status'; stdout ssh tcsh@lo "$PARTMUX" 'true ::: 1 2 3 4; echo $status' | grep -v 'See output';
ssh tcsh@lo "$PARTMUX" 'false ::: 1 2 3 4; echo $status' stdout ssh tcsh@lo "$PARTMUX" 'false ::: 1 2 3 4; echo $status' | grep -v 'See output'
echo '### This fails - word too long' echo '### This fails - word too long'
export PARTMUX='parallel -Scsh@lo,tcsh@lo,parallel@lo,zsh@lo --tmux '; export PARTMUX='parallel -Scsh@lo,tcsh@lo,parallel@lo,zsh@lo --tmux ';
@ -42,15 +42,15 @@ echo '### This fails - word too long'
stdout ssh csh@lo "$PARTMUX" 'false ::: 1 2 3 4; echo $status' | grep -v 'See output' stdout ssh csh@lo "$PARTMUX" 'false ::: 1 2 3 4; echo $status' | grep -v 'See output'
echo '### works' echo '### works'
parallel -Sparallel@lo --tmux echo ::: \\\\\\\"\\\\\\\"\\\;\@ stdout parallel -Sparallel@lo --tmux echo ::: \\\\\\\"\\\\\\\"\\\;\@ | grep -v 'See output'
stdout parallel -Sparallel@lo --tmux echo ::: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx stdout parallel -Sparallel@lo --tmux echo ::: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx | grep -v 'See output'
echo '### These blocked due to length' echo '### These blocked due to length'
parallel -Slo --tmux echo ::: \\\\\\\"\\\\\\\"\\\;\@ stdout parallel -Slo --tmux echo ::: \\\\\\\"\\\\\\\"\\\;\@ | grep -v 'See output'
parallel -Scsh@lo --tmux echo ::: \\\\\\\"\\\\\\\"\\\;\@ stdout parallel -Scsh@lo --tmux echo ::: \\\\\\\"\\\\\\\"\\\;\@ | grep -v 'See output'
parallel -Stcsh@lo --tmux echo ::: \\\\\\\"\\\\\\\"\\\;\@ stdout parallel -Stcsh@lo --tmux echo ::: \\\\\\\"\\\\\\\"\\\;\@ | grep -v 'See output'
parallel -Szsh@lo --tmux echo ::: \\\\\\\"\\\\\\\"\\\;\@ stdout parallel -Szsh@lo --tmux echo ::: \\\\\\\"\\\\\\\"\\\;\@ | grep -v 'See output'
parallel -Scsh@lo --tmux echo ::: 111111111111111111111111111111111111111111111111111111111 stdout parallel -Scsh@lo --tmux echo ::: 111111111111111111111111111111111111111111111111111111111 | grep -v 'See output'
echo '### bug #43746: --transfer and --return of multiple inputs {1} and {2}' echo '### bug #43746: --transfer and --return of multiple inputs {1} and {2}'
echo '### and:' echo '### and:'

View file

@ -144,7 +144,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 |head -n 10M | parallel --pipe -k echo {#} of 20 ulimit -n 20; yes "`seq 3000`" |head -c 20M | parallel --pipe -k echo {#} of 20
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

@ -80,3 +80,13 @@ echo '### bug #43817: Some JP char cause problems in positional replacement stri
<EFBFBD><<3C>> <20><1 $_=2<>> ワ <EFBFBD><<3C>> <20><1 $_=2<>> ワ
parallel -Xj1 echo {1} ::: '<27><<3C>>' '<27><1 $_=2<>>' 'ワ' parallel -Xj1 echo {1} ::: '<27><<3C>>' '<27><1 $_=2<>>' 'ワ'
<EFBFBD><<3C>> <EFBFBD><<3C>>
echo '**'
**
parallel --plus --rpl '%' --rpl '%D $_=::shell_quote(::dirname($_));' --rpl '%B s:.*/::;s:\.[^/.]+$::;' --rpl '%E s:.*\.::' 'echo {}=%;echo %D={//};echo %B={/.};echo %E={+.};echo %D/%B.%E={}' ::: a.b/c.d/e.f
a.b/c.d/e.f=a.b/c.d/e.f
a.b/c.d=a.b/c.d
e=e
f=f
a.b/c.d/e.f=a.b/c.d/e.f
echo '**'
**

View file

@ -1,19 +1,24 @@
make[2]: Entering directory `/home/tange/privat/parallel/testsuite'
VBoxManage controlvm CentOS3-root:centos3 savestate
VBoxManage controlvm RedHat9-root:redhat9 savestate
VBoxManage controlvm OracleXE savestate
make[2]: Leaving directory `/home/tange/privat/parallel/testsuite'
echo '### Trouble reading a record > 2 GB for certain versions of Perl (substr($a,0,2G+1)="fails")' echo '### Trouble reading a record > 2 GB for certain versions of Perl (substr($a,0,2G+1)="fails")'
### Trouble reading a record > 2 GB for certain versions of Perl (substr($a,0,2G+1)="fails") ### Trouble reading a record > 2 GB for certain versions of Perl (substr($a,0,2G+1)="fails")
echo '### perl -e $buf=("x"x(2**31))."x"; substr($buf,0,2**31+1)=""; print length $buf' echo '### perl -e $buf=("x"x(2**31))."x"; substr($buf,0,2**31+1)=""; print length $buf'
### perl -e $buf=("x"x(2**31))."x"; substr($buf,0,2**31+1)=""; print length $buf ### perl -e $buf=("x"x(2**31))."x"; substr($buf,0,2**31+1)=""; print length $buf
' echo 'Eats 4 GB'
/bin/bash: -c: line 0: unexpected EOF while looking for matching `'' Eats 4 GB
/bin/bash: -c: line 1: syntax error: unexpected end of file perl -e '$buf=("x"x(2**31))."x"; substr($buf,0,2**31+1)=""; print length $buf."\n"'
echo 'Eats 2.5 GB' 1echo 'Eats 2.5 GB'
Eats 2.5 GB Eats 2.5 GB
(yes "`echo {1..100}`" | head -c 2300M; echo ged) | PERL5LIB=input-files/perl-v5.14.2/lib input-files/perl-v5.14.2/perl `which parallel` -k --block 2G --pipe --recend ged md5sum (yes "`seq 3000`" | head -c 2300M; echo ged) | PERL5LIB=input-files/perl-v5.14.2/lib input-files/perl-v5.14.2/perl `which parallel` -k --block 2G --pipe --recend ged md5sum
131cbd7a7f1d19de3dabb379c716396b - 7be046296f6b0cde6049a11c116908ea -
68b329da9893e34099c7d8ad5cb9c940 - 68b329da9893e34099c7d8ad5cb9c940 -
parallel: Warning: --blocksize >= 2G causes problems. Using 2G-1 parallel: Warning: --blocksize >= 2G causes problems. Using 2G-1
echo 'Eats 2.5 GB' echo 'Eats 2.5 GB'
Eats 2.5 GB Eats 2.5 GB
(yes "`echo {1..100}`" | head -c 2300M; echo ged) | PERL5LIB=input-files/perl-v5.14.2/lib input-files/perl-v5.14.2/perl `which parallel` -k --block 2G --pipe --recend ged cat | wc -c (yes "`seq 3000`" | head -c 2300M; echo ged) | PERL5LIB=input-files/perl-v5.14.2/lib input-files/perl-v5.14.2/perl `which parallel` -k --block 2G --pipe --recend ged cat | wc -c
2411724804 2411724804
parallel: Warning: --blocksize >= 2G causes problems. Using 2G-1 parallel: Warning: --blocksize >= 2G causes problems. Using 2G-1
echo '**' echo '**'
@ -22,7 +27,7 @@ echo '### bug #44358: 2 GB records cause problems for -N'
### bug #44358: 2 GB records cause problems for -N ### bug #44358: 2 GB records cause problems for -N
echo '5 GB version: Eats 12.5 GB' echo '5 GB version: Eats 12.5 GB'
5 GB version: Eats 12.5 GB 5 GB version: Eats 12.5 GB
(yes "`echo {1..100}`" | head -c 5000000000; echo FOO; yes "`echo {1..100}`" | head -c 3000000000; echo FOO; yes "`echo {1..100}`" | head -c 1000000000;) | PERL5LIB=input-files/perl-v5.14.2/lib input-files/perl-v5.14.2/perl `which parallel` --pipe --recend FOO -N2 --block 1g -k LANG=c wc -c (yes "`seq 3000`" | head -c 5000000000; echo FOO; yes "`seq 3000`" | head -c 3000000000; echo FOO; yes "`seq 3000`" | head -c 1000000000;) | PERL5LIB=input-files/perl-v5.14.2/lib input-files/perl-v5.14.2/perl `which parallel` --pipe --recend FOO -N2 --block 1g -k LANG=c wc -c
8000000007 8000000007
1000000001 1000000001
parallel: Warning: A record was longer than 1000000000. Increasing to --blocksize 1300000001 parallel: Warning: A record was longer than 1000000000. Increasing to --blocksize 1300000001
@ -30,7 +35,7 @@ parallel: Warning: A record was longer than 1300000001. Increasing to --blocksiz
parallel: Warning: A record was longer than 1690000003. Increasing to --blocksize 2147483647 parallel: Warning: A record was longer than 1690000003. Increasing to --blocksize 2147483647
echo '2 GB version: eats 10 GB' echo '2 GB version: eats 10 GB'
2 GB version: eats 10 GB 2 GB version: eats 10 GB
(yes "`echo {1..100}`" | head -c 2300M; echo FOO; yes "`echo {1..100}`" | head -c 2300M; echo FOO; yes "`echo {1..100}`" | head -c 1000M;) | PERL5LIB=input-files/perl-v5.14.2/lib input-files/perl-v5.14.2/perl `which parallel` --pipe --recend FOO -N2 --block 1g -k LANG=c wc -c (yes "`seq 3000`" | head -c 2300M; echo FOO; yes "`seq 3000`" | head -c 2300M; echo FOO; yes "`seq 3000`" | head -c 1000M;) | PERL5LIB=input-files/perl-v5.14.2/lib input-files/perl-v5.14.2/perl `which parallel` --pipe --recend FOO -N2 --block 1g -k LANG=c wc -c
4823449607 4823449607
1048576001 1048576001
parallel: Warning: A record was longer than 1000000000. Increasing to --blocksize 1300000001 parallel: Warning: A record was longer than 1000000000. Increasing to --blocksize 1300000001
@ -44,3 +49,14 @@ echo '### -L >4GB'
parallel: Warning: A record was longer than 1000000000. Increasing to --blocksize 1300000001 parallel: Warning: A record was longer than 1000000000. Increasing to --blocksize 1300000001
parallel: Warning: A record was longer than 1300000001. Increasing to --blocksize 1690000003 parallel: Warning: A record was longer than 1300000001. Increasing to --blocksize 1690000003
parallel: Warning: A record was longer than 1690000003. Increasing to --blocksize 2147483647 parallel: Warning: A record was longer than 1690000003. Increasing to --blocksize 2147483647
make[2]: Entering directory `/home/tange/privat/parallel/testsuite'
# Make sure we can reach the virtual machines
sudo ifconfig wlan0:0 192.168.1.72
# If they are already running: Don't fail
VBoxManage startvm CentOS3-root:centos3 || VBoxManage controlvm CentOS3-root:centos3 resume || true
Waiting for VM "CentOS3-root:centos3" to power on...
VM "CentOS3-root:centos3" has been successfully started.
VBoxManage startvm RedHat9-root:redhat9 || VBoxManage controlvm RedHat9-root:redhat9 resume || true
Waiting for VM "RedHat9-root:redhat9" to power on...
VM "RedHat9-root:redhat9" has been successfully started.
make[2]: Leaving directory `/home/tange/privat/parallel/testsuite'

View file

@ -24,7 +24,7 @@ echo '### Test tmux works on different shells'
0 0
parallel -Scsh@lo,tcsh@lo,parallel@lo,zsh@lo --tmux false ::: 1 2 3 4; echo $? parallel -Scsh@lo,tcsh@lo,parallel@lo,zsh@lo --tmux false ::: 1 2 3 4; echo $?
4 4
export PARTMUX='parallel -Scsh@lo,tcsh@lo,parallel@lo,zsh@lo --tmux '; ssh zsh@lo "$PARTMUX" 'true ::: 1 2 3 4; echo $status'; ssh zsh@lo "$PARTMUX" 'false ::: 1 2 3 4; echo $status'; ssh parallel@lo "$PARTMUX" 'true ::: 1 2 3 4; echo $?'; ssh parallel@lo "$PARTMUX" 'false ::: 1 2 3 4; echo $?'; ssh tcsh@lo "$PARTMUX" 'true ::: 1 2 3 4; echo $status'; ssh tcsh@lo "$PARTMUX" 'false ::: 1 2 3 4; echo $status' export PARTMUX='parallel -Scsh@lo,tcsh@lo,parallel@lo,zsh@lo --tmux '; stdout ssh zsh@lo "$PARTMUX" 'true ::: 1 2 3 4; echo $status' | grep -v 'See output'; stdout ssh zsh@lo "$PARTMUX" 'false ::: 1 2 3 4; echo $status' | grep -v 'See output'; stdout ssh parallel@lo "$PARTMUX" 'true ::: 1 2 3 4; echo $?' | grep -v 'See output'; stdout ssh parallel@lo "$PARTMUX" 'false ::: 1 2 3 4; echo $?' | grep -v 'See output'; stdout ssh tcsh@lo "$PARTMUX" 'true ::: 1 2 3 4; echo $status' | grep -v 'See output'; stdout ssh tcsh@lo "$PARTMUX" 'false ::: 1 2 3 4; echo $status' | grep -v 'See output'
0 0
4 4
0 0
@ -46,16 +46,16 @@ Word too long.
4 4
echo '### works' echo '### works'
### works ### works
parallel -Sparallel@lo --tmux echo ::: \\\\\\\"\\\\\\\"\\\;\@ stdout parallel -Sparallel@lo --tmux echo ::: \\\\\\\"\\\\\\\"\\\;\@ | grep -v 'See output'
stdout parallel -Sparallel@lo --tmux echo ::: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx stdout parallel -Sparallel@lo --tmux echo ::: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx | grep -v 'See output'
parallel: Error: Command line too long (402 >= 238) at input 0: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx... parallel: Error: Command line too long (402 >= 238) at input 0: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx...
echo '### These blocked due to length' echo '### These blocked due to length'
### These blocked due to length ### These blocked due to length
parallel -Slo --tmux echo ::: \\\\\\\"\\\\\\\"\\\;\@ stdout parallel -Slo --tmux echo ::: \\\\\\\"\\\\\\\"\\\;\@ | grep -v 'See output'
parallel -Scsh@lo --tmux echo ::: \\\\\\\"\\\\\\\"\\\;\@ stdout parallel -Scsh@lo --tmux echo ::: \\\\\\\"\\\\\\\"\\\;\@ | grep -v 'See output'
parallel -Stcsh@lo --tmux echo ::: \\\\\\\"\\\\\\\"\\\;\@ stdout parallel -Stcsh@lo --tmux echo ::: \\\\\\\"\\\\\\\"\\\;\@ | grep -v 'See output'
parallel -Szsh@lo --tmux echo ::: \\\\\\\"\\\\\\\"\\\;\@ stdout parallel -Szsh@lo --tmux echo ::: \\\\\\\"\\\\\\\"\\\;\@ | grep -v 'See output'
parallel -Scsh@lo --tmux echo ::: 111111111111111111111111111111111111111111111111111111111 stdout parallel -Scsh@lo --tmux echo ::: 111111111111111111111111111111111111111111111111111111111 | grep -v 'See output'
echo '### bug #43746: --transfer and --return of multiple inputs {1} and {2}' echo '### bug #43746: --transfer and --return of multiple inputs {1} and {2}'
### bug #43746: --transfer and --return of multiple inputs {1} and {2} ### bug #43746: --transfer and --return of multiple inputs {1} and {2}
echo '### and:' echo '### and:'

View file

@ -322,7 +322,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 |head -n 10M | parallel --pipe -k echo {#} of 20 ulimit -n 20; yes "`seq 3000`" |head -c 20M | parallel --pipe -k echo {#} of 20
1 of 20 1 of 20
2 of 20 2 of 20
3 of 20 3 of 20

View file

@ -354,4 +354,4 @@ Send Receive Exitval
echo '### --tmux test - check termination' echo '### --tmux test - check termination'
### --tmux test - check termination ### --tmux test - check termination
perl -e 'map {printf "$_%o%c\n",$_,$_}1..255' | stdout parallel --tmux echo {} :::: - ::: a b | perl -pe 's:tmp.par.*tms:tmp/parXXXXX.tms:; s/\d+/0/g' perl -e 'map {printf "$_%o%c\n",$_,$_}1..255' | stdout parallel --tmux echo {} :::: - ::: a b | perl -pe 's:tmp.par.*tms:tmp/parXXXXX.tms:; s/\d+/0/g'
See output with: tmux -S /tmp/parXXXXX.tms attach -t p0 See output with: tmux -S /tmp/parXXXXX.tms attach

View file

@ -1,67 +1,67 @@
echo '### tmux1.9' echo '### tmux1.9'
### tmux1.9 ### tmux1.9
seq 000 100 | TMUX=tmux1.9 par_tmux seq 000 100 | TMUX=tmux1.9 par_tmux
See output with: tmux1.9 -S /tmp/parXXXXX.tms attach -tpID See output with: tmux1.9 -S /tmp/parXXXXX.tms attach
0 0
seq 100 200 | TMUX=tmux1.9 par_tmux seq 100 200 | TMUX=tmux1.9 par_tmux
See output with: tmux1.9 -S /tmp/parXXXXX.tms attach -tpID See output with: tmux1.9 -S /tmp/parXXXXX.tms attach
0 0
seq 200 300 | TMUX=tmux1.9 par_tmux seq 200 300 | TMUX=tmux1.9 par_tmux
See output with: tmux1.9 -S /tmp/parXXXXX.tms attach -tpID See output with: tmux1.9 -S /tmp/parXXXXX.tms attach
0 0
seq 300 400 | TMUX=tmux1.9 par_tmux seq 300 400 | TMUX=tmux1.9 par_tmux
See output with: tmux1.9 -S /tmp/parXXXXX.tms attach -tpID See output with: tmux1.9 -S /tmp/parXXXXX.tms attach
0 0
seq 400 500 | TMUX=tmux1.9 par_tmux seq 400 500 | TMUX=tmux1.9 par_tmux
See output with: tmux1.9 -S /tmp/parXXXXX.tms attach -tpID See output with: tmux1.9 -S /tmp/parXXXXX.tms attach
0 0
seq 500 600 | TMUX=tmux1.9 par_tmux seq 500 600 | TMUX=tmux1.9 par_tmux
See output with: tmux1.9 -S /tmp/parXXXXX.tms attach -tpID See output with: tmux1.9 -S /tmp/parXXXXX.tms attach
0 0
seq 600 700 | TMUX=tmux1.9 par_tmux seq 600 700 | TMUX=tmux1.9 par_tmux
See output with: tmux1.9 -S /tmp/parXXXXX.tms attach -tpID See output with: tmux1.9 -S /tmp/parXXXXX.tms attach
0 0
seq 700 800 | TMUX=tmux1.9 par_tmux seq 700 800 | TMUX=tmux1.9 par_tmux
See output with: tmux1.9 -S /tmp/parXXXXX.tms attach -tpID See output with: tmux1.9 -S /tmp/parXXXXX.tms attach
0 0
seq 800 900 | TMUX=tmux1.9 par_tmux seq 800 900 | TMUX=tmux1.9 par_tmux
See output with: tmux1.9 -S /tmp/parXXXXX.tms attach -tpID See output with: tmux1.9 -S /tmp/parXXXXX.tms attach
0 0
seq 900 1000 | TMUX=tmux1.9 par_tmux seq 900 1000 | TMUX=tmux1.9 par_tmux
See output with: tmux1.9 -S /tmp/parXXXXX.tms attach -tpID See output with: tmux1.9 -S /tmp/parXXXXX.tms attach
0 0
seq 1000 1100 | TMUX=tmux1.9 par_tmux seq 1000 1100 | TMUX=tmux1.9 par_tmux
See output with: tmux1.9 -S /tmp/parXXXXX.tms attach -tpID See output with: tmux1.9 -S /tmp/parXXXXX.tms attach
0 0
seq 1100 1200 | TMUX=tmux1.9 par_tmux seq 1100 1200 | TMUX=tmux1.9 par_tmux
See output with: tmux1.9 -S /tmp/parXXXXX.tms attach -tpID See output with: tmux1.9 -S /tmp/parXXXXX.tms attach
0 0
seq 1200 1300 | TMUX=tmux1.9 par_tmux seq 1200 1300 | TMUX=tmux1.9 par_tmux
See output with: tmux1.9 -S /tmp/parXXXXX.tms attach -tpID See output with: tmux1.9 -S /tmp/parXXXXX.tms attach
0 0
seq 1300 1400 | TMUX=tmux1.9 par_tmux seq 1300 1400 | TMUX=tmux1.9 par_tmux
See output with: tmux1.9 -S /tmp/parXXXXX.tms attach -tpID See output with: tmux1.9 -S /tmp/parXXXXX.tms attach
0 0
seq 1400 1500 | TMUX=tmux1.9 par_tmux seq 1400 1500 | TMUX=tmux1.9 par_tmux
See output with: tmux1.9 -S /tmp/parXXXXX.tms attach -tpID See output with: tmux1.9 -S /tmp/parXXXXX.tms attach
0 0
seq 1500 1600 | TMUX=tmux1.9 par_tmux seq 1500 1600 | TMUX=tmux1.9 par_tmux
See output with: tmux1.9 -S /tmp/parXXXXX.tms attach -tpID See output with: tmux1.9 -S /tmp/parXXXXX.tms attach
0 0
seq 1600 1700 | TMUX=tmux1.9 par_tmux seq 1600 1700 | TMUX=tmux1.9 par_tmux
See output with: tmux1.9 -S /tmp/parXXXXX.tms attach -tpID See output with: tmux1.9 -S /tmp/parXXXXX.tms attach
0 0
seq 1700 1800 | TMUX=tmux1.9 par_tmux seq 1700 1800 | TMUX=tmux1.9 par_tmux
See output with: tmux1.9 -S /tmp/parXXXXX.tms attach -tpID See output with: tmux1.9 -S /tmp/parXXXXX.tms attach
0 0
seq 1800 1900 | TMUX=tmux1.9 par_tmux seq 1800 1900 | TMUX=tmux1.9 par_tmux
See output with: tmux1.9 -S /tmp/parXXXXX.tms attach -tpID See output with: tmux1.9 -S /tmp/parXXXXX.tms attach
0 0
seq 1900 2000 | TMUX=tmux1.9 par_tmux seq 1900 2000 | TMUX=tmux1.9 par_tmux
See output with: tmux1.9 -S /tmp/parXXXXX.tms attach -tpID See output with: tmux1.9 -S /tmp/parXXXXX.tms attach
0 0
seq 2000 2021 | TMUX=tmux1.9 par_tmux seq 2000 2021 | TMUX=tmux1.9 par_tmux
See output with: tmux1.9 -S /tmp/parXXXXX.tms attach -tpID See output with: tmux1.9 -S /tmp/parXXXXX.tms attach
0 0
echo '### tmux1.9 fails' echo '### tmux1.9 fails'
### tmux1.9 fails ### tmux1.9 fails
@ -71,24 +71,24 @@ parallel: Error: Command line too long (4053 >= 4052) at input 0: 2022
echo '### tmux1.8' echo '### tmux1.8'
### tmux1.8 ### tmux1.8
seq 1 50 | TMUX=tmux1.8 par_tmux seq 1 50 | TMUX=tmux1.8 par_tmux
See output with: tmux1.8 -S /tmp/parXXXXX.tms attach -tpID See output with: tmux1.8 -S /tmp/parXXXXX.tms attach
0 0
seq 51 100 | TMUX=tmux1.8 par_tmux seq 51 100 | TMUX=tmux1.8 par_tmux
See output with: tmux1.8 -S /tmp/parXXXXX.tms attach -tpID See output with: tmux1.8 -S /tmp/parXXXXX.tms attach
0 0
seq 101 150 | TMUX=tmux1.8 par_tmux seq 101 150 | TMUX=tmux1.8 par_tmux
See output with: tmux1.8 -S /tmp/parXXXXX.tms attach -tpID See output with: tmux1.8 -S /tmp/parXXXXX.tms attach
0 0
seq 151 200 | TMUX=tmux1.8 par_tmux seq 151 200 | TMUX=tmux1.8 par_tmux
See output with: tmux1.8 -S /tmp/parXXXXX.tms attach -tpID See output with: tmux1.8 -S /tmp/parXXXXX.tms attach
0 0
seq 201 233 | TMUX=tmux1.8 par_tmux seq 201 233 | TMUX=tmux1.8 par_tmux
See output with: tmux1.8 -S /tmp/parXXXXX.tms attach -tpID See output with: tmux1.8 -S /tmp/parXXXXX.tms attach
0 0
echo '### tmux1.8 fails' echo '### tmux1.8 fails'
### tmux1.8 fails ### tmux1.8 fails
echo 234 | TMUX=tmux1.8 par_tmux echo 234 | TMUX=tmux1.8 par_tmux
See output with: tmux1.8 -S /tmp/parXXXXX.tms attach -tpID See output with: tmux1.8 -S /tmp/parXXXXX.tms attach
command too long command too long
1 1
echo 235 | TMUX=tmux1.8 par_tmux echo 235 | TMUX=tmux1.8 par_tmux
@ -100,25 +100,25 @@ parallel: Error: Command line too long (480 >= 477) at input 0: 236
echo '### tmux1.8 0..255 ascii' echo '### tmux1.8 0..255 ascii'
### tmux1.8 0..255 ascii ### tmux1.8 0..255 ascii
perl -e 'print map { ($_, map { pack("c*",$_) } grep { $_>=1 && $_!=10 } 0..$_),"\n" } 0..255' | TMUX=tmux1.8 stdout parallel --tmux --timeout 3 echo | par_tmux_filter; echo $? perl -e 'print map { ($_, map { pack("c*",$_) } grep { $_>=1 && $_!=10 } 0..$_),"\n" } 0..255' | TMUX=tmux1.8 stdout parallel --tmux --timeout 3 echo | par_tmux_filter; echo $?
See output with: tmux1.8 -S /tmp/parXXXXX.tms attach -tpID See output with: tmux1.8 -S /tmp/parXXXXX.tms attach
0 0
echo '### tmux1.9 0..255 ascii' echo '### tmux1.9 0..255 ascii'
### tmux1.9 0..255 ascii ### tmux1.9 0..255 ascii
perl -e 'print map { ($_, map { pack("c*",$_) } grep { $_>=1 && $_!=10 } 0..$_),"\n" } 0..255' | TMUX=tmux1.9 stdout parallel --tmux --timeout 3 echo | par_tmux_filter; echo $? perl -e 'print map { ($_, map { pack("c*",$_) } grep { $_>=1 && $_!=10 } 0..$_),"\n" } 0..255' | TMUX=tmux1.9 stdout parallel --tmux --timeout 3 echo | par_tmux_filter; echo $?
See output with: tmux1.9 -S /tmp/parXXXXX.tms attach -tpID See output with: tmux1.9 -S /tmp/parXXXXX.tms attach
0 0
echo '### Test output ascii' echo '### Test output ascii'
### Test output ascii ### Test output ascii
rm -f /tmp/paralocal7*; perl -e 'print map { ($_, map { pack("c*",$_) } grep { $_!=10 } 1..$_),"\n" } 1..255' | stdout parallel --tmux echo {}'>>/tmp/paralocal7{%}' | par_tmux_filter; sort /tmp/paralocal7* | md5sum rm -f /tmp/paralocal7*; perl -e 'print map { ($_, map { pack("c*",$_) } grep { $_!=10 } 1..$_),"\n" } 1..255' | stdout parallel --tmux echo {}'>>/tmp/paralocal7{%}' | par_tmux_filter; sort /tmp/paralocal7* | md5sum
See output with: tmux -S /tmp/parXXXXX.tms attach -tpID See output with: tmux -S /tmp/parXXXXX.tms attach
a7ee232967c8aab2edf227169e8cdce0 - a7ee232967c8aab2edf227169e8cdce0 -
echo '### Test critical lengths. Must not block' echo '### Test critical lengths. Must not block'
### Test critical lengths. Must not block ### Test critical lengths. Must not block
seq 70 130 | TMUX=tmux1.8 stdout parallel --tmux echo '{}{=$_="&"x$_=}' | par_tmux_filter seq 70 130 | TMUX=tmux1.8 stdout parallel --tmux echo '{}{=$_="&"x$_=}' | par_tmux_filter
See output with: tmux1.8 -S /tmp/parXXXXX.tms attach -tpID See output with: tmux1.8 -S /tmp/parXXXXX.tms attach
seq 70 130 | TMUX=tmux1.9 stdout parallel --tmux echo '{}{=$_="&"x$_=}' | par_tmux_filter seq 70 130 | TMUX=tmux1.9 stdout parallel --tmux echo '{}{=$_="&"x$_=}' | par_tmux_filter
See output with: tmux1.9 -S /tmp/parXXXXX.tms attach -tpID See output with: tmux1.9 -S /tmp/parXXXXX.tms attach
seq 280 425 | TMUX=tmux1.8 stdout parallel --tmux echo '{}{=$_="a"x$_=}' | par_tmux_filter seq 280 425 | TMUX=tmux1.8 stdout parallel --tmux echo '{}{=$_="a"x$_=}' | par_tmux_filter
See output with: tmux1.8 -S /tmp/parXXXXX.tms attach -tpID See output with: tmux1.8 -S /tmp/parXXXXX.tms attach
seq 280 425 | TMUX=tmux1.9 stdout parallel --tmux echo '{}{=$_="a"x$_=}' | par_tmux_filter seq 280 425 | TMUX=tmux1.9 stdout parallel --tmux echo '{}{=$_="a"x$_=}' | par_tmux_filter
See output with: tmux1.9 -S /tmp/parXXXXX.tms attach -tpID See output with: tmux1.9 -S /tmp/parXXXXX.tms attach

View file

@ -844,7 +844,7 @@ a b
echo '### Test --nice remote' echo '### Test --nice remote'
### Test --nice remote ### Test --nice remote
stdout parallel --nice 1 -S .. -vv 'PAR=a bash -c "echo \$PAR {}"' ::: b | perl -pe 's/\S*parallel-server\S*/one-server/;s/[a-f0-9]{500,}/hex/;s/\d{5,8}/pId/g;' stdout parallel --nice 1 -S .. -vv 'PAR=a bash -c "echo \$PAR {}"' ::: b | perl -pe 's/\S*parallel-server\S*/one-server/;s/[a-f0-9]{500,}/hex/;s/\d{5,8}/pId/g;'
ssh one-server exec perl\ -e\ \\\$ENV\\\{\\\"PARALLEL_PID\\\"\\\}=\\\"pId\\\"\\\;\\\$ENV\\\{\\\"PARALLEL_SEQ\\\"\\\}=\\\"1\\\"\\\;\\\$bashfunc\\\ =\\\ \\\"\\\"\\\;@ARGV=\\\"\\\\\\\\nice\\\ -n1\\\ /bin/bash\\\ -c\\\ PAR=a\\\\\\\\\\\ bash\\\\\\\\\\\ -c\\\\\\\\\\\ \\\\\\\\\\\\\\\"echo\\\\\\\\\\\ \\\\\\\\\\\ \\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\$PAR\\\\\\\\\\\ b\\\\\\\\\\\\\\\"\\\"\\\;\\\$SIG\\\{CHLD\\\}=sub\\\{\\\$done=1\\\;\\\}\\\;\\\$pid=fork\\\;unless\\\(\\\$pid\\\)\\\{setpgrp\\\;exec\\\$ENV\\\{SHELL\\\},\\\"-c\\\",\\\(\\\$bashfunc.\\\"@ARGV\\\"\\\)\\\;die\\\"exec:\\\$\\\!\\\\n\\\"\\\;\\\}do\\\{\\\$s=\\\$s\\\<1\\\?0.001+\\\$s\\\*1.03:\\\$s\\\;select\\\(undef,undef,undef,\\\$s\\\)\\\;\\\}until\\\(\\\$done\\\|\\\|getppid==1\\\)\\\;kill\\\(SIGHUP,-\\\$\\\{pid\\\}\\\)unless\\\$done\\\;wait\\\;exit\\\(\\\$\\\?\\\&127\\\?128+\\\(\\\$\\\?\\\&127\\\):1+\\\$\\\?\\\>\\\>8\\\); ssh one-server exec perl\ -e\ \\\$ENV\\\{\\\"PARALLEL_PID\\\"\\\}=\\\"pId\\\"\\\;\\\$ENV\\\{\\\"PARALLEL_SEQ\\\"\\\}=\\\"1\\\"\\\;\\\$bashfunc\\\ =\\\ \\\"\\\"\\\;@ARGV=\\\"\\\\\\\\nice\\\ -n1\\\ \\\\\\\$SHELL\\\ -c\\\ PAR=a\\\\\\\\\\\ bash\\\\\\\\\\\ -c\\\\\\\\\\\ \\\\\\\\\\\\\\\"echo\\\\\\\\\\\ \\\\\\\\\\\ \\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\$PAR\\\\\\\\\\\ b\\\\\\\\\\\\\\\"\\\"\\\;\\\$SIG\\\{CHLD\\\}=sub\\\{\\\$done=1\\\;\\\}\\\;\\\$pid=fork\\\;unless\\\(\\\$pid\\\)\\\{setpgrp\\\;exec\\\$ENV\\\{SHELL\\\},\\\"-c\\\",\\\(\\\$bashfunc.\\\"@ARGV\\\"\\\)\\\;die\\\"exec:\\\$\\\!\\\\n\\\"\\\;\\\}do\\\{\\\$s=\\\$s\\\<1\\\?0.001+\\\$s\\\*1.03:\\\$s\\\;select\\\(undef,undef,undef,\\\$s\\\)\\\;\\\}until\\\(\\\$done\\\|\\\|getppid==1\\\)\\\;kill\\\(SIGHUP,-\\\$\\\{pid\\\}\\\)unless\\\$done\\\;wait\\\;exit\\\(\\\$\\\?\\\&127\\\?128+\\\(\\\$\\\?\\\&127\\\):1+\\\$\\\?\\\>\\\>8\\\);
a b a b
echo '### Test distribute arguments at EOF to 2 jobslots' echo '### Test distribute arguments at EOF to 2 jobslots'
### Test distribute arguments at EOF to 2 jobslots ### Test distribute arguments at EOF to 2 jobslots

View file

@ -83,11 +83,11 @@ one-server exec perl -e '@GNU_Parallel=("use","IPC::Open3;","use","MIME::Base64"
-l parallel one-server cd ././tmp; rsync --server --sender -lDrRze.iLsfx . ./parallel.file.' -l parallel one-server cd ././tmp; rsync --server --sender -lDrRze.iLsfx . ./parallel.file.'
'newlineX.out2 'newlineX.out2
one-server (rm -f ./tmp/parallel.file.' one-server (rm -f ./tmp/parallel.file.'
'newlineX; rmdir ./tmp/ ./ 2>/dev/null;) 'newlineX; rmdir ./tmp/ ./ >&/dev/null;)
one-server (rm -f ./tmp/parallel.file.' one-server (rm -f ./tmp/parallel.file.'
'newlineX.out; rmdir ./tmp/ ./ 2>/dev/null;) 'newlineX.out; rmdir ./tmp/ ./ >&/dev/null;)
one-server (rm -f ./tmp/parallel.file.' one-server (rm -f ./tmp/parallel.file.'
'newlineX.out2; rmdir ./tmp/ ./ 2>/dev/null;) 'newlineX.out2; rmdir ./tmp/ ./ >&/dev/null;)
one-server mkdir -p ./. one-server mkdir -p ./.
-l parallel one-server rsync --server -lDrRze.iLsfx . ./. -l parallel one-server rsync --server -lDrRze.iLsfx . ./.
one-server exec perl -e '@GNU_Parallel=("use","IPC::Open3;","use","MIME::Base64");eval"@GNU_Parallel";$SIG{CHLD}="IGNORE";my$zip=(grep{-x$_}"/usr/local/bin/bzip2")[0]||"bzip2";my($in,$out,$eval);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;eval$eval;' base64 one-server exec perl -e '@GNU_Parallel=("use","IPC::Open3;","use","MIME::Base64");eval"@GNU_Parallel";$SIG{CHLD}="IGNORE";my$zip=(grep{-x$_}"/usr/local/bin/bzip2")[0]||"bzip2";my($in,$out,$eval);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;eval$eval;' base64
@ -96,8 +96,8 @@ one-server exec perl -e '@GNU_Parallel=("use","IPC::Open3;","use","MIME::Base64"
-l parallel one-server cd ././tmp; rsync --server --sender -lDrRze.iLsfx . ./parallel.file.' -l parallel one-server cd ././tmp; rsync --server --sender -lDrRze.iLsfx . ./parallel.file.'
'newlineX.out2 'newlineX.out2
one-server (rm -f ./tmp/parallel.file.' one-server (rm -f ./tmp/parallel.file.'
'newlineX; rmdir ./tmp/ ./ 2>/dev/null;) 'newlineX; rmdir ./tmp/ ./ >&/dev/null;)
one-server (rm -f ./tmp/parallel.file.' one-server (rm -f ./tmp/parallel.file.'
'newlineX.out; rmdir ./tmp/ ./ 2>/dev/null;) 'newlineX.out; rmdir ./tmp/ ./ >&/dev/null;)
one-server (rm -f ./tmp/parallel.file.' one-server (rm -f ./tmp/parallel.file.'
'newlineX.out2; rmdir ./tmp/ ./ 2>/dev/null;) 'newlineX.out2; rmdir ./tmp/ ./ >&/dev/null;)