Allow $TMPDIR to contain spaces and newlines.

This commit is contained in:
Ole Tange 2023-01-30 22:51:56 +01:00
parent 4307949091
commit e6fe5fafcd
56 changed files with 916 additions and 13820 deletions

View file

@ -278,6 +278,8 @@ New in this release:
News about GNU Parallel: News about GNU Parallel:
https://www.redhat.com/sysadmin/perl-scripts
<<>> <<>>
GNU Parallel - For people who live life in the parallel lane. GNU Parallel - For people who live life in the parallel lane.

View file

@ -252,8 +252,8 @@ sub pipe_tee_setup() {
# (rm fifo2; grep 2) < fifo2 # (rm fifo2; grep 2) < fifo2
# (rm fifo3; grep 3) < fifo3 # (rm fifo3; grep 3) < fifo3
# Remove the tmpfifo as soon as it is open # Remove the tmpfifo as soon as it is open
@Global::cat_prepends = map { "(rm $_;" } @fifos; @Global::cat_prepends = map { "(rm $_;" } shell_quote(@fifos);
@Global::cat_appends = map { ") < $_" } @fifos; @Global::cat_appends = map { ") < $_" } shell_quote(@fifos);
} }
@ -578,7 +578,7 @@ sub pipe_shard_setup() {
# The PERL_HASH_SEED must be the same for all sharders # The PERL_HASH_SEED must be the same for all sharders
# so B::hash will return the same value for any given input # so B::hash will return the same value for any given input
$ENV{'PERL_HASH_SEED'} = $$; $ENV{'PERL_HASH_SEED'} = $$;
exec qw(parallel --block 100k -q --pipe -j), $njobs, exec qw(parallel -0 --block 100k -q --pipe -j), $njobs,
qw(--roundrobin -u perl -e), $script, ($opt::colsep || ","), qw(--roundrobin -u perl -e), $script, ($opt::colsep || ","),
$col, $perlexpr, '{}', (map { (':::+', @{$_}) } @parcatfifos); $col, $perlexpr, '{}', (map { (':::+', @{$_}) } @parcatfifos);
} }
@ -591,7 +591,9 @@ sub pipe_shard_setup() {
::error("'parcat' must be in path."); ::error("'parcat' must be in path.");
::wait_and_exit(255); ::wait_and_exit(255);
} }
@Global::cat_prepends = map { "perl -e $parcat @$_ | " } @parcatfifos; @Global::cat_prepends =
map { "perl -e $parcat ".
join(" ",shell_quote(@$_))." | "} @parcatfifos;
} }
sub pipe_part_files(@) { sub pipe_part_files(@) {
@ -3301,7 +3303,7 @@ sub read_options() {
} else { } else {
@options = shift @ARGV; @options = shift @ARGV;
} }
my $script = Q(Q(shift @ARGV)); my $script = Q(Q(shift @ARGV)); # TODO - test if script = " "
my @args = map{ Q($_) } @ARGV; my @args = map{ Q($_) } @ARGV;
# exec myself to split $ARGV[0] into separate fields # exec myself to split $ARGV[0] into separate fields
exec "$0 --_pipe-means-argfiles @options @parser $script ". exec "$0 --_pipe-means-argfiles @options @parser $script ".
@ -5250,23 +5252,24 @@ sub onall($@) {
my $joblog = tmp_joblog($opt::joblog); my $joblog = tmp_joblog($opt::joblog);
if($joblog) { if($joblog) {
push @joblogs, $joblog; push @joblogs, $joblog;
$joblog = "--joblog $joblog"; $joblog = "--joblog ".::Q($joblog);
} }
my $quad = $opt::arg_file_sep || "::::"; my $quad = $opt::arg_file_sep || "::::";
# If PARALLEL_ENV is set: Pass it on # If PARALLEL_ENV is set: Pass it on
my $penv=$Global::parallel_env ? my $penv=$Global::parallel_env ?
"PARALLEL_ENV=".Q($Global::parallel_env) : "PARALLEL_ENV=".Q($Global::parallel_env) :
''; '';
my $qsshlogin = Q($sshlogin->string());
::debug("init", "$penv $0 $suboptions -j1 $joblog ", ::debug("init", "$penv $0 $suboptions -j1 $joblog ",
((defined $opt::tag) ? ((defined $opt::tag) ?
"--tagstring ".Q($sshlogin->string()) : ""), "--tagstring ".$qsshlogin : ""),
" -S ", Q($sshlogin->string())," ", " -S $qsshlogin ",
join(" ",shell_quote(@command))," $quad @argfiles\n"); join(" ",shell_quote(@command,$quad,@argfiles)),"\n");
print $parallel_fh "$penv $0 $suboptions -j1 $joblog ", print $parallel_fh "$penv $0 $suboptions -j1 $joblog ",
((defined $opt::tag) ? ((defined $opt::tag) ?
"--tagstring ".Q($sshlogin->string()) : ""), "--tagstring ".$qsshlogin : ""),
" -S ", Q($sshlogin->string())," ", " -S $qsshlogin ",
join(" ",shell_quote(@command))," $quad @argfiles\0"; join(" ",shell_quote(@command,$quad,@argfiles)),"\0";
} }
close $parallel_fh; close $parallel_fh;
$Global::exitstatus = $? >> 8; $Global::exitstatus = $? >> 8;
@ -6015,10 +6018,11 @@ sub tmpname($) {
my $name = shift; my $name = shift;
my($tmpname); my($tmpname);
if(not -w $ENV{'TMPDIR'}) { if(not -w $ENV{'TMPDIR'}) {
my $qtmp = ::Q($ENV{'TMPDIR'});
if(not -e $ENV{'TMPDIR'}) { if(not -e $ENV{'TMPDIR'}) {
::error("Tmpdir '$ENV{'TMPDIR'}' does not exist.","Try 'mkdir $ENV{'TMPDIR'}'"); ::error("Tmpdir $qtmp does not exist.","Try: mkdir -p $qtmp");
} else { } else {
::error("Tmpdir '$ENV{'TMPDIR'}' is not writable.","Try 'chmod +w $ENV{'TMPDIR'}'"); ::error("Tmpdir $qtmp is not writable.","Try: chmod +w $qtmp");
} }
::wait_and_exit(255); ::wait_and_exit(255);
} }
@ -7078,6 +7082,7 @@ sub sshcmd($) {
# [sshpass -e] ssh -p port -l user # [sshpass -e] ssh -p port -l user
if($self->{'password'}) { push @local, "sshpass -e"; } if($self->{'password'}) { push @local, "sshpass -e"; }
# [ssh] -p port -l user # [ssh] -p port -l user
# TODO sshpass + space
push @local, $self->{'sshcommand'}; push @local, $self->{'sshcommand'};
# [-p port] -l user # [-p port] -l user
if($self->{'port'}) { push @local, '-p',$self->{'port'}; } if($self->{'port'}) { push @local, '-p',$self->{'port'}; }
@ -7086,7 +7091,7 @@ sub sshcmd($) {
if($opt::controlmaster) { if($opt::controlmaster) {
# Use control_path to make ssh faster # Use control_path to make ssh faster
my $control_path = $self->control_path_dir()."/ssh-%r@%h:%p"; my $control_path = $self->control_path_dir()."/ssh-%r@%h:%p";
push @local, "-S", $control_path;
if(not $self->{'control_path'}{$control_path}++) { if(not $self->{'control_path'}{$control_path}++) {
# Master is not running for this control_path # Master is not running for this control_path
# Start it # Start it
@ -7094,6 +7099,7 @@ sub sshcmd($) {
if($pid) { if($pid) {
$Global::sshmaster{$pid} ||= 1; $Global::sshmaster{$pid} ||= 1;
} else { } else {
push @local, "-S", $control_path;
$SIG{'TERM'} = undef; $SIG{'TERM'} = undef;
# Run a sleep that outputs data, so it will discover # Run a sleep that outputs data, so it will discover
# if the ssh connection closes. # if the ssh connection closes.
@ -7107,6 +7113,7 @@ sub sshcmd($) {
"perl", "-e", $sleep); "perl", "-e", $sleep);
} }
} }
push @local, "-S", ::Q($control_path);
} }
return "@local"; return "@local";
@ -7454,7 +7461,9 @@ sub swap_activity($) {
my $file = $self->{'swap_activity_file'}; my $file = $self->{'swap_activity_file'};
my ($dummy_fh, $tmpfile) = ::tmpfile(SUFFIX => ".swp"); my ($dummy_fh, $tmpfile) = ::tmpfile(SUFFIX => ".swp");
::debug("swap", "\n", $swap_activity, "\n"); ::debug("swap", "\n", $swap_activity, "\n");
::qqx("($swap_activity > $tmpfile && mv $tmpfile $file || rm $tmpfile &)"); my $qtmp = ::Q($tmpfile);
my $qfile = ::Q($file);
::qqx("($swap_activity > $qtmp && mv $qtmp $qfile || rm $qtmp &)");
} }
return $self->{'swap_activity'}; return $self->{'swap_activity'};
} }
@ -9376,7 +9385,8 @@ sub filter_through_compress($) {
# it is known that output file is opened, # it is known that output file is opened,
# thus output file can then be removed by the decompressor. # thus output file can then be removed by the decompressor.
# empty_input_wrapper is needed for plzip # empty_input_wrapper is needed for plzip
my $wpid = open(my $fdw,"|-", "(echo > $comfile; ". my $qcom = ::Q($comfile);
my $wpid = open(my $fdw,"|-", "(echo > $qcom; ".
empty_input_wrapper($opt::compress_program).") >". empty_input_wrapper($opt::compress_program).") >".
::Q($self->fh($fdno,'name'))) || die $?; ::Q($self->fh($fdno,'name'))) || die $?;
$self->set_fh($fdno,'w',$fdw); $self->set_fh($fdno,'w',$fdw);
@ -9855,9 +9865,9 @@ sub wrapped($) {
# Prepend 'cat > $PARALLEL_TMP;' # Prepend 'cat > $PARALLEL_TMP;'
# Append 'unlink $PARALLEL_TMP without affecting $?' # Append 'unlink $PARALLEL_TMP without affecting $?'
$command = $command =
'cat > $PARALLEL_TMP;'. 'cat > "$PARALLEL_TMP";'.
$command.";". postpone_exit_and_cleanup(). $command.";". postpone_exit_and_cleanup().
'$PARALLEL_TMP'; '"$PARALLEL_TMP"';
} elsif($opt::fifo) { } elsif($opt::fifo) {
# Prepend fifo-wrapper. In essence: # Prepend fifo-wrapper. In essence:
# mkfifo {} # mkfifo {}
@ -9867,7 +9877,7 @@ sub wrapped($) {
# wait; rm {} # wait; rm {}
# without affecting $? # without affecting $?
$command = fifo_wrap(). " ". $command = fifo_wrap(). " ".
$Global::shell. " ". ::Q($command). ' $PARALLEL_TMP'. ';'; $Global::shell. " ". ::Q($command). ' "$PARALLEL_TMP"'. ';';
} }
# Wrap with ssh + tranferring of files # Wrap with ssh + tranferring of files
$command = $self->sshlogin_wrap($command); $command = $self->sshlogin_wrap($command);
@ -10827,6 +10837,7 @@ sub interactive_start($) {
{ {
my $tmuxsocket; my $tmuxsocket;
my $qsocket;
sub tmux_wrap($) { sub tmux_wrap($) {
# Wrap command with tmux for session pPID # Wrap command with tmux for session pPID
@ -10837,7 +10848,6 @@ sub interactive_start($) {
# Temporary file name. Used for fifo to communicate exit val # Temporary file name. Used for fifo to communicate exit val
my $tmpfifo = ::tmpname("tmx"); my $tmpfifo = ::tmpname("tmx");
$self->add_rm($tmpfifo); $self->add_rm($tmpfifo);
if(length($tmpfifo) >=100) { if(length($tmpfifo) >=100) {
::error("tmux does not support sockets with path > 100."); ::error("tmux does not support sockets with path > 100.");
::wait_and_exit(255); ::wait_and_exit(255);
@ -10888,36 +10898,36 @@ sub interactive_start($) {
$ENV{'PARALLEL_TMUX'} ||= "tmux"; $ENV{'PARALLEL_TMUX'} ||= "tmux";
if(not $tmuxsocket) { if(not $tmuxsocket) {
$tmuxsocket = ::tmpname("tms"); $tmuxsocket = ::tmpname("tms");
::debug("tmux", "Start: $ENV{'PARALLEL_TMUX'} -S $tmuxsocket attach"); $qsocket = ::Q($tmuxsocket);
::debug("tmux", "Start: $ENV{'PARALLEL_TMUX'} -S $qsocket attach");
if($opt::fg) { if($opt::fg) {
if(not fork) { if(not fork) {
# Run tmux in the foreground # Run tmux in the foreground
# Wait for the socket to appear # Wait for the socket to appear
while (not -e $tmuxsocket) { } while (not -e $tmuxsocket) { }
`$ENV{'PARALLEL_TMUX'} -S $tmuxsocket attach`; `$ENV{'PARALLEL_TMUX'} -S $qsocket attach`;
exit; exit;
} }
} }
::status("See output with: $ENV{'PARALLEL_TMUX'} -S $tmuxsocket attach"); ::status("See output with: $ENV{'PARALLEL_TMUX'} -S $qsocket attach");
} }
$tmux = "sh -c '". $tmux = "sh -c ".::Q(
$ENV{'PARALLEL_TMUX'}. $ENV{'PARALLEL_TMUX'}.
" -S $tmuxsocket new-session -s p$$ -d \"sleep .2\" >/dev/null 2>&1';" . " -S $qsocket new-session -s p$$ -d \"sleep .2\" >/dev/null 2>&1").";" .
$ENV{'PARALLEL_TMUX'}. $ENV{'PARALLEL_TMUX'}.
" -S $tmuxsocket new-window -t p$$ -n $title"; " -S $qsocket new-window -t p$$ -n $title";
::debug("tmux", "title len:", $l_tit, " act ", $l_act, " max ", ::debug("tmux", "title len:", $l_tit, " act ", $l_act, " max ",
$Limits::Command::line_max_len, " tot ", $Limits::Command::line_max_len, " tot ",
$l_tot, "\n"); $l_tot, "\n");
return "mkfifo ".::Q($tmpfifo)." && $tmux ".
return "mkfifo $tmpfifo && $tmux ".
# Run in tmux # Run in tmux
::Q ::Q
( (
"(".$actual_command.');'. "(".$actual_command.');'.
# The triple print is needed - otherwise the testsuite fails # The triple print is needed - otherwise the testsuite fails
q[ perl -e 'while($t++<3){ print $ARGV[0],"\n" }' $?h/$status >> ]. q[ perl -e 'while($t++<3){ print $ARGV[0],"\n" }' $?h/$status >> ].
$tmpfifo."&". ::Q($tmpfifo)."&".
"echo $title; echo \007Job finished at: `date`;sleep 10" "echo $title; echo \007Job finished at: `date`;sleep 10"
). ).
# Run outside tmux # Run outside tmux
@ -10925,7 +10935,7 @@ sub interactive_start($) {
# If csh the first will be 0h, so use the second as exit value. # If csh the first will be 0h, so use the second as exit value.
# Otherwise just use the first value as exit value. # Otherwise just use the first value as exit value.
q{; exec perl -e '$/="/";$_=<>;$c=<>;unlink $ARGV; }. q{; exec perl -e '$/="/";$_=<>;$c=<>;unlink $ARGV; }.
q{/(\d+)h/ and exit($1);exit$c' }.$tmpfifo; q{/(\d+)h/ and exit($1);exit$c' }.::Q($tmpfifo);
} }
} }
@ -12159,7 +12169,7 @@ sub slot($) {
$Global::JobQueue->{'commandlinequeue'}->{'arg_queue'}->get(); $Global::JobQueue->{'commandlinequeue'}->{'arg_queue'}->get();
# $PARALLEL_TMP will point to a tempfile that will be used as {} # $PARALLEL_TMP will point to a tempfile that will be used as {}
$Global::JobQueue->{'commandlinequeue'}->{'arg_queue'}-> $Global::JobQueue->{'commandlinequeue'}->{'arg_queue'}->
unget([Arg->new('$PARALLEL_TMP')]); unget([Arg->new('"$PARALLEL_TMP"')]);
} }
while (not $self->{'arg_queue'}->empty()) { while (not $self->{'arg_queue'}->empty()) {
$next_arg = $self->{'arg_queue'}->get(); $next_arg = $self->{'arg_queue'}->get();
@ -13385,9 +13395,10 @@ sub tmux_length($) {
my @out; my @out;
for my $l (1, 2020, 16320, 30000, $len) { for my $l (1, 2020, 16320, 30000, $len) {
my $tmpfile = ::tmpname("tms"); my $tmpfile = ::tmpname("tms");
my $qtmp = ::Q($tmpfile);
my $tmuxcmd = $ENV{'PARALLEL_TMUX'}. my $tmuxcmd = $ENV{'PARALLEL_TMUX'}.
" -S $tmpfile new-session -d -n echo $l". " -S $qtmp new-session -d -n echo $l".
("t"x$l). " && echo $l; rm -f $tmpfile"; ("t"x$l). " && echo $l; rm -f $qtmp";
push @out, ::qqx($tmuxcmd); push @out, ::qqx($tmuxcmd);
::rm($tmpfile); ::rm($tmpfile);
} }

View file

@ -3790,6 +3790,72 @@ fails.
https://github.com/aaronriekenberg/rust-parallel https://github.com/aaronriekenberg/rust-parallel
(Last checked: 2023-01) (Last checked: 2023-01)
=head2 DIFFERENCES BETWEEN parallelium AND GNU Parallel
Summary (see legend above):
=over
=item - I2 - - - - -
=item M1 - - - - M6
=item O1 - O3 - - - - N/A - -
=item E1 - - E4 - - -
=item - - - - - - - - -
=item - -
=back
B<parallelium> merges standard output (stdout) and standard error
(stderr). The maximal output of a command is 8192 bytes. Bigger output
makes B<parallelium> go into an infinite loop.
In the input file for B<parallelium> you can define a tag, so that you
can select to run only these commands. A bit like a target in a
Makefile.
Progress is printed on standard output (stdout) prepended with '#'
with similar information as GNU B<parallel>'s B<--bar>.
=head3 EXAMPLES
$ cat testjobs.txt
#tag common sleeps classA
(sleep 4.495;echo "job 000")
:
(sleep 2.587;echo "job 016")
#tag common sleeps classB
(sleep 0.218;echo "job 017")
:
(sleep 2.269;echo "job 040")
#tag common sleeps classC
(sleep 2.586;echo "job 041")
:
(sleep 1.626;echo "job 099")
#tag lasthalf, sleeps, classB
(sleep 1.540;echo "job 100")
:
(sleep 2.001;echo "job 199")
1$ parallelium -f testjobs.txt -l logdir -t classB,classC
1$ cat testjobs.txt |
parallel --plus --results logdir/testjobs.txt_{0#}.output \
'{= if(/^#tag /) { @tag = split/,|\s+/ }
(grep /^(classB|classC)$/, @tag) or skip =}'
https://github.com/beomagi/parallelium
(Last checked: 2023-01)
=head2 Todo =head2 Todo
http://code.google.com/p/push/ (cannot compile) http://code.google.com/p/push/ (cannot compile)

View file

@ -159,12 +159,19 @@ sub sort_files {
# The commands split at \n (or \0) # The commands split at \n (or \0)
# and there will be at least one for each CPU thread # and there will be at least one for each CPU thread
my @subopt = $opt::zero_terminated ? qw(--recend "\0") : (); my @subopt = $opt::zero_terminated ? qw(--recend "\0") : ();
# $uniq is needed because @files could contain \n
my $uniq = join "", map { (0..9,"a".."z","A".."Z")[rand(62)] } (1..20);
open(my $par,"-|",qw(parallel), @subopt, open(my $par,"-|",qw(parallel), @subopt,
qw(--pipepart --block -1 --dryrun -vv sort), qw(--pipepart --block -1 --dryrun -vv sort),
@Global::sortoptions, '::::', @files) || die; @Global::sortoptions, $uniq, '::::', @files) || die;
my @cmd = merge(<$par>); # Generated commands:
# <file perl-catter | (sort ... $uniq )
# Use $uniq to split into commands
# (We cannot use \n because 'file' may contain newline)
my @cmd = map { "$_)\n" } split(/$uniq[)]\n/, join("",<$par>));
debug(1,@cmd);
close $par; close $par;
debug(@cmd); @cmd = merge(@cmd);
# The command uses <(...) so it is incompatible with /bin/sh # The command uses <(...) so it is incompatible with /bin/sh
open(my $bash,"|-","bash") || die; open(my $bash,"|-","bash") || die;
print $bash @cmd; print $bash @cmd;
@ -186,7 +193,7 @@ sub sort_stdin {
if(fork) { if(fork) {
} else { } else {
my @subopt = $opt::zero_terminated ? qw(--recend "\0") : (); my @subopt = $opt::zero_terminated ? qw(--recend "\0") : ();
exec(qw(parallel -j), $numthreads, @subopt, exec(qw(parallel -0 -j), $numthreads, @subopt,
# 286k is the best mean value after testing 250..350 # 286k is the best mean value after testing 250..350
qw(--block 286k --pipe --roundrobin cat > {} :::),@fifos); qw(--block 286k --pipe --roundrobin cat > {} :::),@fifos);
} }

57
src/sql
View file

@ -523,6 +523,27 @@ use Getopt::Long;
use strict; use strict;
use File::Temp qw/tempfile tempdir/; use File::Temp qw/tempfile tempdir/;
sub shell_quote($) {
# Quote for other shells (Bourne compatibles)
# Inputs:
# $string = string to be quoted
# Returns:
# $shell_quoted = string quoted as needed by the shell
my $s = $_[0];
if($s =~ /[^-_.+a-z0-9\/]/i) {
$s =~ s/'/'"'"'/g; # "-quote single quotes
$s = "'$s'"; # '-quote entire string
$s =~ s/^''//; # Remove unneeded '' at ends
$s =~ s/''$//; # (faster than s/^''|''$//g)
return $s;
} elsif ($s eq "") {
return "''";
} else {
# No quoting needed
return $s;
}
}
parse_options(); parse_options();
my $pass_through_options = (defined $::opt_p) ? join(" ",@{$::opt_p}) : ""; my $pass_through_options = (defined $::opt_p) ? join(" ",@{$::opt_p}) : "";
@ -587,29 +608,11 @@ if($dburl{'query'}) {
($fh,$queryfile) = tempfile(SUFFIX => ".sql"); ($fh,$queryfile) = tempfile(SUFFIX => ".sql");
print $fh $dburl{'query'},"\n"; print $fh $dburl{'query'},"\n";
close $fh; close $fh;
$batch_command = "(cat $queryfile;rm $queryfile; cat) | $batch_command"; my $qfile = shell_quote($queryfile);
$batch_command = "(cat $qfile;rm $qfile; cat) | $batch_command";
} }
sub shell_quote($) {
# Quote for other shells (Bourne compatibles)
# Inputs:
# $string = string to be quoted
# Returns:
# $shell_quoted = string quoted as needed by the shell
my $s = $_[0];
if($s =~ /[^-_.+a-z0-9\/]/i) {
$s =~ s/'/'"'"'/g; # "-quote single quotes
$s = "'$s'"; # '-quote entire string
$s =~ s/^''//; # Remove unneeded '' at ends
$s =~ s/''$//; # (faster than s/^''|''$//g)
return $s;
} elsif ($s eq "") {
return "''";
} else {
# No quoting needed
return $s;
}
}
do { do {
if(@ARGV) { if(@ARGV) {
@ -776,11 +779,11 @@ sub mysql_commands {
close $credential_fh; close $credential_fh;
# Prepend with a remover of the credential tempfile # Prepend with a remover of the credential tempfile
# -C: Compression if both ends support it my $qtmp = shell_quote($tmp);
$batch_command = $batch_command =
"((sleep 1; rm $tmp) & ". "((sleep 1; rm $qtmp) & ".
"mysql --defaults-extra-file=$tmp -C $pass_through_options ". "mysql --defaults-extra-file=$qtmp $pass_through_options ".
"$no_headers $html $ssl $host $user $port $database)"; "$no_headers $html $ssl $host $user $port $database)";
$interactive_command = $batch_command; $interactive_command = $batch_command;
return($batch_command,$interactive_command); return($batch_command,$interactive_command);
} }
@ -1109,7 +1112,9 @@ sub get_alias {
"$path/dburl.aliases", "$path/dburl.aliases.dist"); "$path/dburl.aliases", "$path/dburl.aliases.dist");
for my $alias_file (@search) { for my $alias_file (@search) {
if(-r $alias_file) { if(-r $alias_file) {
push @urlalias, `cat "$alias_file"`; open(my $fh, "<", $alias_file) || die;
push @urlalias, <$fh>;
close $fh;
} }
} }
my ($alias_part,$rest) = $alias=~/(:\w*)(.*)/; my ($alias_part,$rest) = $alias=~/(:\w*)(.*)/;

View file

@ -16,15 +16,27 @@ export TIMEOUT=$MAX_SEC_PER_TEST
run_once() { run_once() {
script=$1 script=$1
base=`basename "$script" .sh` base=`basename "$script" .sh`
diff -Naur wanted-results/"$base" actual-results/"$base" >/dev/null || if diff -Naur wanted-results/"$base" actual-results/"$base" >/dev/null; then
bash "$script" | perl -pe 's:'$HOME':~:g' > actual-results/"$base" true skip
else
(
testsuitedir=$(pwd)
export testsuitedir
cd "$TMPDIR"
bash "$testsuitedir/$script" |
perl -pe 's:'$HOME':~:g' > "$testsuitedir"/actual-results/"$base"
)
fi
} }
export -f run_once export -f run_once
run_test() { run_test() {
script="$1" script="$1"
base=`basename "$script" .sh` base=`basename "$script" .sh`
export TMPDIR=/tmp/"$base"-tmpdir # Force spaces and < into TMPDIR - this will expose bugs
export TMPDIR=/tmp/"$base-tmp"/'
<'/tmp
rm -rf "$TMPDIR"
mkdir -p "$TMPDIR" mkdir -p "$TMPDIR"
# Clean before. May be owned by other users # Clean before. May be owned by other users
sudo rm -f /tmp/*.{tmx,pac,arg,all,log,swp,loa,ssh,df,pip,tmb,chr,tms,par} || sudo rm -f /tmp/*.{tmx,pac,arg,all,log,swp,loa,ssh,df,pip,tmb,chr,tms,par} ||

View file

@ -49,6 +49,10 @@ start_centos3() {
start_centos3 start_centos3
( (
pwd=$(pwd)
# If not run in dir parallel/testsuite: set testsuitedir to path of testsuite
testsuitedir=${testsuitedir:-$pwd}
cd $testsuitedir
# Copy binaries to server # Copy binaries to server
cd testsuite/vagrant/tange/centos3/ 2>/dev/null cd testsuite/vagrant/tange/centos3/ 2>/dev/null
cd vagrant/tange/centos3/ 2>/dev/null cd vagrant/tange/centos3/ 2>/dev/null

View file

@ -11,8 +11,13 @@ SSHLOGIN1=$SSHUSER1@$SERVER1
echo $SSHUSER1@$SERVER1 echo $SSHUSER1@$SERVER1
ssh $SSHLOGIN1 touch .parallel/will-cite ssh $SSHLOGIN1 touch .parallel/will-cite
scp -q .*/src/{parallel,sem,sql,niceload,env_parallel*} $SSHLOGIN1:bin/ (
pwd=$(pwd)
# If not run in dir parallel/testsuite: set testsuitedir to path of testsuite
testsuitedir=${testsuitedir:-$pwd}
cd $testsuitedir
scp -q "$testsuitedir"/../src/{parallel,sem,sql,niceload,env_parallel*} $SSHLOGIN1:bin/
)
. `which env_parallel.bash` . `which env_parallel.bash`
env_parallel --session env_parallel --session

View file

@ -22,10 +22,10 @@ par_ll_long_followed_by_short() {
par_PARALLEL_HOME_not_exist() { par_PARALLEL_HOME_not_exist() {
echo '### bug #62311: --pipepart + ::: fail' echo '### bug #62311: --pipepart + ::: fail'
tmp1=$(mktemp) tmp1="$(mktemp)"
rm $tmp1 rm "$tmp1"
PARALLEL_HOME=$tmp1 parallel echo ::: OK PARALLEL_HOME="$tmp1" parallel echo ::: OK
rm -r $tmp1 rm -r "$tmp1"
echo Should warn: echo Should warn:
PARALLEL_HOME=/does-not-exist parallel -k echo ::: should warn PARALLEL_HOME=/does-not-exist parallel -k echo ::: should warn
} }
@ -38,10 +38,10 @@ par_colour_failed() {
par_pipepart_triple_colon() { par_pipepart_triple_colon() {
echo '### bug #62311: --pipepart + ::: fail' echo '### bug #62311: --pipepart + ::: fail'
tmp1=$(mktemp) tmp1="$(mktemp)"
seq 3 >$tmp1 seq 3 >"$tmp1"
parallel --pipepart -a $tmp1 wc ::: a parallel --pipepart -a "$tmp1" wc ::: a
rm $tmp1 rm "$tmp1"
} }
par_open-tty() { par_open-tty() {
@ -137,11 +137,11 @@ EOF
cat <<'EOF' > "$tmp2" cat <<'EOF' > "$tmp2"
2: Job:{#} Slot:{%} All:{} Arg[1]:{1} Arg[-1]:{-1} Perl({}+4):{=$_+=4=} 2: Job:{#} Slot:{%} All:{} Arg[1]:{1} Arg[-1]:{-1} Perl({}+4):{=$_+=4=}
EOF EOF
parallel --colsep , -j2 --cleanup --tmpl $tmp1=t1.{#} --tmpl $tmp2=t2.{%} \ parallel --colsep , -j2 --cleanup --tmpl "$tmp1"=t1.{#} --tmpl "$tmp2"=t2.{%} \
'sleep 0.{#}; cat t1.{#} t2.{%}' ::: 1,a 1,b 2,a 2,b 'sleep 0.{#}; cat t1.{#} t2.{%}' ::: 1,a 1,b 2,a 2,b
echo should give no files echo should give no files
ls t[12].* ls t[12].*
parallel -j2 --cleanup --tmpl $tmp1=t1.{#} --tmpl $tmp2=t2.{%} \ parallel -j2 --cleanup --tmpl "$tmp1"=t1.{#} --tmpl "$tmp2"=t2.{%} \
'sleep 0.{#}; cat t1.{#} t2.{%}' ::: 1 2 ::: a b 'sleep 0.{#}; cat t1.{#} t2.{%}' ::: 1 2 ::: a b
echo should give no files echo should give no files
ls t[12].* ls t[12].*
@ -150,12 +150,12 @@ EOF
par_resume_k() { par_resume_k() {
echo '### --resume -k' echo '### --resume -k'
tmp=$(mktemp) tmp=$(mktemp)
parallel -k --resume --joblog $tmp echo job{}id\;exit {} ::: 0 1 2 3 0 5 parallel -k --resume --joblog "$tmp" echo job{}id\;exit {} ::: 0 1 2 3 0 5
echo try 2 = nothing echo try 2 = nothing
parallel -k --resume --joblog $tmp echo job{}id\;exit {} ::: 0 1 2 3 0 5 parallel -k --resume --joblog "$tmp" echo job{}id\;exit {} ::: 0 1 2 3 0 5
echo two extra echo two extra
parallel -k --resume --joblog $tmp echo job{}id\;exit 0 ::: 0 1 2 3 0 5 6 7 parallel -k --resume --joblog "$tmp" echo job{}id\;exit 0 ::: 0 1 2 3 0 5 6 7
rm -f $tmp rm -f "$tmp"
} }
par_empty_string_quote() { par_empty_string_quote() {
@ -415,10 +415,10 @@ par_argfile() {
echo '### Test -a and --arg-file: Read input from file instead of stdin' echo '### Test -a and --arg-file: Read input from file instead of stdin'
tmp=$(mktemp) tmp=$(mktemp)
seq 1 10 >$tmp seq 1 10 >"$tmp"
parallel -k -a $tmp echo parallel -k -a "$tmp" echo
parallel -k --arg-file $tmp echo parallel -k --arg-file "$tmp" echo
rm $tmp rm "$tmp"
} }
par_pipe_unneeded_procs() { par_pipe_unneeded_procs() {
@ -453,19 +453,19 @@ par_pipepart_roundrobin() {
echo '### bug #45769: --round-robin --pipepart gives wrong results' echo '### bug #45769: --round-robin --pipepart gives wrong results'
tmp=$(mktemp) tmp=$(mktemp)
seq 10000 >$tmp seq 10000 >"$tmp"
parallel -j2 --pipepart -a $tmp --block 14 --round-robin wc | wc -l parallel -j2 --pipepart -a "$tmp" --block 14 --round-robin wc | wc -l
rm $tmp rm "$tmp"
} }
par_pipepart_header() { par_pipepart_header() {
echo '### bug #44614: --pipepart --header off by one' echo '### bug #44614: --pipepart --header off by one'
tmp=$(mktemp) tmp=$(mktemp)
seq 10 >$tmp seq 10 >"$tmp"
parallel --pipepart -a $tmp -k --block 5 'echo foo; cat' parallel --pipepart -a "$tmp" -k --block 5 'echo foo; cat'
parallel --pipepart -a $tmp -k --block 2 --regexp --recend 3'\n' 'echo foo; cat' parallel --pipepart -a "$tmp" -k --block 2 --regexp --recend 3'\n' 'echo foo; cat'
rm $tmp rm "$tmp"
} }
par_quote() { par_quote() {
@ -492,9 +492,9 @@ par_read_from_stdin() {
par_total_from_joblog() { par_total_from_joblog() {
echo 'bug #47086: [PATCH] Initialize total_completed from joblog' echo 'bug #47086: [PATCH] Initialize total_completed from joblog'
tmp=$(mktemp) tmp=$(mktemp)
parallel -j1 --joblog $tmp --halt now,fail=1 echo '{= $_=$Global::total_completed =};exit {}' ::: 0 0 0 1 0 0 parallel -j1 --joblog "$tmp" --halt now,fail=1 echo '{= $_=$Global::total_completed =};exit {}' ::: 0 0 0 1 0 0
parallel -j1 --joblog $tmp --halt now,fail=1 --resume echo '{= $_=$Global::total_completed =};exit {}' ::: 0 0 0 1 0 0 parallel -j1 --joblog "$tmp" --halt now,fail=1 --resume echo '{= $_=$Global::total_completed =};exit {}' ::: 0 0 0 1 0 0
rm $tmp rm "$tmp"
} }
par_xapply() { par_xapply() {
@ -626,10 +626,10 @@ par_empty_line() {
par_append_joblog() { par_append_joblog() {
echo '### can you append to a joblog using +' echo '### can you append to a joblog using +'
tmp=$(mktemp) tmp=$(mktemp)
parallel --joblog $tmp echo ::: 1 parallel --joblog "$tmp" echo ::: 1
parallel --joblog +$tmp echo ::: 1 parallel --joblog +"$tmp" echo ::: 1
wc -l < $tmp wc -l < "$tmp"
rm $tmp rm "$tmp"
} }
par_file_ending_in_newline() { par_file_ending_in_newline() {
@ -653,16 +653,16 @@ par_python_children() {
par_pipepart_block_bigger_2G() { par_pipepart_block_bigger_2G() {
echo '### Test that --pipepart can have blocks > 2GB' echo '### Test that --pipepart can have blocks > 2GB'
tmp=$(mktemp) tmp=$(mktemp)
echo foo >$tmp echo foo >"$tmp"
parallel --pipepart -a $tmp --block 3G wc parallel --pipepart -a "$tmp" --block 3G wc
rm $tmp rm "$tmp"
} }
par_retries_replacement_string() { par_retries_replacement_string() {
tmp=$(mktemp) tmp=$(mktemp)
parallel --retries {//} "echo {/} >>$tmp;exit {/}" ::: 1/11 2/22 3/33 parallel --retries {//} "echo {/} >>'$tmp';exit {/}" ::: 1/11 2/22 3/33
sort $tmp sort "$tmp"
rm $tmp rm "$tmp"
} }
par_tee() { par_tee() {
@ -693,17 +693,17 @@ par_basic_halt() {
cpuburn=$(mktemp) cpuburn=$(mktemp)
cpuburn2=$(mktemp) cpuburn2=$(mktemp)
(echo '#!/usr/bin/perl' (echo '#!/usr/bin/perl'
echo "eval{setpriority(0,0,9)}; while(1){}") > $cpuburn echo "eval{setpriority(0,0,9)}; while(1){}") > "$cpuburn"
chmod 700 $cpuburn chmod 700 "$cpuburn"
cp -a $cpuburn $cpuburn2 cp -a "$cpuburn" "$cpuburn2"
parallel -j4 --halt 2 ::: 'sleep 1' $cpuburn false; parallel -0 -j4 --halt 2 ::: 'sleep 1' "'$cpuburn'" false;
killall $(basename $cpuburn) 2>/dev/null && killall $(basename "$cpuburn") 2>/dev/null &&
echo ERROR: cpuburn should already have been killed echo ERROR: cpuburn should already have been killed
parallel -j4 --halt -2 ::: 'sleep 1' $cpuburn2 true; parallel -0 -j4 --halt -2 ::: 'sleep 1' "'$cpuburn2'" true;
killall $(basename $cpuburn2) 2>/dev/null && killall $(basename "$cpuburn2") 2>/dev/null &&
echo ERROR: cpuburn2 should already have been killed echo ERROR: cpuburn2 should already have been killed
rm $cpuburn $cpuburn2 rm "$cpuburn" "$cpuburn2"
parallel --halt error echo ::: should not print parallel --halt error echo ::: should not print
parallel --halt soon echo ::: should not print parallel --halt soon echo ::: should not print
@ -722,12 +722,12 @@ par_wd_3dot_local() {
echo 'bug #45993: --wd ... should also work when run locally' echo 'bug #45993: --wd ... should also work when run locally'
( (
parallel --wd /bi 'pwd; echo $OLDPWD; echo' ::: fail parallel --wd /bi 'pwd; echo "$OLDPWD"; echo' ::: fail
parallel --wd /bin 'pwd; echo $OLDPWD; echo' ::: OK parallel --wd /bin 'pwd; echo "$OLDPWD"; echo' ::: OK
parallel --wd / 'pwd; echo $OLDPWD; echo' ::: OK parallel --wd / 'pwd; echo "$OLDPWD"; echo' ::: OK
parallel --wd /tmp 'pwd; echo $OLDPWD; echo' ::: OK parallel --wd /tmp 'pwd; echo "$OLDPWD"; echo' ::: OK
parallel --wd ... 'pwd; echo $OLDPWD; echo' ::: OK parallel --wd ... 'pwd; echo "$OLDPWD"; echo' ::: OK
parallel --wd . 'pwd; echo $OLDPWD; echo' ::: OK parallel --wd . 'pwd; echo "$OLDPWD"; echo' ::: OK
) | ) |
perl -pe 's:/mnt/4tb::; s:/home/tange:~:;' | perl -pe 's:/mnt/4tb::; s:/home/tange:~:;' |
perl -pe 's:parallel./:parallel/:;' | perl -pe 's:parallel./:parallel/:;' |
@ -747,21 +747,24 @@ par_X_eta_div_zero() {
par_parcat_args_stdin() { par_parcat_args_stdin() {
echo 'bug #51690: parcat: read args from stdin' echo 'bug #51690: parcat: read args from stdin'
# parcat reads files line by line
# so this does not work if TMPDIR contains \n
TMPDIR='/tmp/Y/ </i'
mkdir -p "$TMPDIR"
tmp1=$(mktemp) tmp1=$(mktemp)
tmp2=$(mktemp) tmp2=$(mktemp)
echo OK1 > $tmp1 echo OK1 > "$tmp1"
echo OK2 > $tmp2 echo OK2 > "$tmp2"
(echo $tmp1 (echo "$tmp1"; echo "$tmp2") | parcat | sort
echo $tmp2) | parcat | sort rm "$tmp1" "$tmp2"
rm $tmp1 $tmp2
} }
par_parcat_rm() { par_parcat_rm() {
echo 'bug #51691: parcat --rm remove fifo when opened' echo 'bug #51691: parcat --rm remove fifo when opened'
tmp1=$(mktemp) tmp1=$(mktemp)
echo OK1 > $tmp1 echo OK1 > "$tmp1"
parcat --rm $tmp1 parcat --rm "$tmp1"
rm $tmp1 2>/dev/null || echo OK file removed rm "$tmp1" 2>/dev/null || echo OK file removed
} }
par_linebuffer_files() { par_linebuffer_files() {
@ -795,10 +798,10 @@ par_blocking_redir() {
par_pipepart_recend_recstart() { par_pipepart_recend_recstart() {
echo 'bug #52343: --recend/--recstart does wrong thing with --pipepart' echo 'bug #52343: --recend/--recstart does wrong thing with --pipepart'
tmp1=$(mktemp) tmp1=$(mktemp)
seq 10 > $tmp1 seq 10 > "$tmp1"
parallel -k --pipepart -a $tmp1 --recend '\n' --recstart '6' --block 1 'echo a; cat' parallel -k --pipepart -a "$tmp1" --recend '\n' --recstart '6' --block 1 'echo a; cat'
parallel -k --pipe < $tmp1 --recend '\n' --recstart '6' --block 1 'echo a; cat' parallel -k --pipe < "$tmp1" --recend '\n' --recstart '6' --block 1 'echo a; cat'
rm $tmp1 2>/dev/null rm "$tmp1" 2>/dev/null
} }
par_pipe_tag_v() { par_pipe_tag_v() {
@ -812,11 +815,11 @@ par_pipe_tag_v() {
par_dryrun_append_joblog() { par_dryrun_append_joblog() {
echo '--dry-run should not append to joblog' echo '--dry-run should not append to joblog'
tmp=$(mktemp) tmp=$(mktemp)
parallel -k --jl $tmp echo ::: 1 2 3 parallel -k --jl "$tmp" echo ::: 1 2 3
parallel --dryrun -k --jl +$tmp echo ::: 1 2 3 4 parallel --dryrun -k --jl +"$tmp" echo ::: 1 2 3 4
# Job 4 should not show up: 3 lines + header = 4 # Job 4 should not show up: 3 lines + header = 4
wc -l < $tmp wc -l < "$tmp"
rm $tmp rm "$tmp"
} }
par_0_no_newline() { par_0_no_newline() {
@ -869,7 +872,7 @@ par_results() {
tmp=$(mktemp) tmp=$(mktemp)
parallel -k --results "$tmp"-dir echo ::: a b c parallel -k --results "$tmp"-dir echo ::: a b c
cat "$tmp"-dir/*/*/stdout cat "$tmp"-dir/*/*/stdout
rm -r $tmp "$tmp"-dir rm -r "$tmp" "$tmp"-dir
} }
par_results_json() { par_results_json() {
@ -877,7 +880,7 @@ par_results_json() {
tmp=$(mktemp -d) tmp=$(mktemp -d)
parallel -k --results "$tmp"/foo.json seq ::: 2 3 ::: 4 5 parallel -k --results "$tmp"/foo.json seq ::: 2 3 ::: 4 5
cat "$tmp"/foo.json | perl -pe 's/\d+\.\d{3}/9.999/g' cat "$tmp"/foo.json | perl -pe 's/\d+\.\d{3}/9.999/g'
rm -r $tmp rm -r "$tmp"
parallel -k --results -.json seq ::: 2 3 ::: 4 5 | parallel -k --results -.json seq ::: 2 3 ::: 4 5 |
perl -pe 's/\d+\.\d{3}/9.999/g' perl -pe 's/\d+\.\d{3}/9.999/g'
} }
@ -908,15 +911,15 @@ par_PARALLEL_ENV() {
PARALLEL_ENV="v='OK as variable'" parallel {} '$v' ::: echo PARALLEL_ENV="v='OK as variable'" parallel {} '$v' ::: echo
PARALLEL_ENV=$(mktemp) PARALLEL_ENV=$(mktemp)
echo '### PARALLEL_ENV as file' echo '### PARALLEL_ENV as file'
echo "v='OK as file'" > $PARALLEL_ENV echo "v='OK as file'" > "$PARALLEL_ENV"
PARALLEL_ENV="$PARALLEL_ENV" parallel {} '$v' ::: echo PARALLEL_ENV="$PARALLEL_ENV" parallel {} '$v' ::: echo
echo '### PARALLEL_ENV as fifo' echo '### PARALLEL_ENV as fifo'
rm $PARALLEL_ENV rm "$PARALLEL_ENV"
mkfifo $PARALLEL_ENV mkfifo "$PARALLEL_ENV"
# () needed to avoid [1]+ Done # () needed to avoid [1]+ Done
(echo "v='OK as fifo'" > $PARALLEL_ENV &) 2>/dev/null (echo "v='OK as fifo'" > "$PARALLEL_ENV" &) 2>/dev/null
PARALLEL_ENV="$PARALLEL_ENV" parallel {} '$v' ::: echo PARALLEL_ENV="$PARALLEL_ENV" parallel {} '$v' ::: echo
rm $PARALLEL_ENV rm "$PARALLEL_ENV"
} }
par_pipe_recend() { par_pipe_recend() {
@ -1050,7 +1053,7 @@ par_profile() {
parallel -J ./testprofile_local echo ::: local parallel -J ./testprofile_local echo ::: local
rm testprofile_local rm testprofile_local
echo --tag > testprofile_abs echo --tag > testprofile_abs
parallel -J `pwd`/testprofile_abs echo ::: abs parallel -J "`pwd`"/testprofile_abs echo ::: abs
rm testprofile_abs rm testprofile_abs
echo --tag > ~/.parallel/testprofile_config echo --tag > ~/.parallel/testprofile_config
parallel -J testprofile_config echo ::: config parallel -J testprofile_config echo ::: config

View file

@ -51,31 +51,32 @@ par_load_from_PARALLEL() {
} }
par_quote_special_results() { par_quote_special_results() {
echo "### Test --results on file systems with limited UTF8 support"
doit() { doit() {
mkfs=$1 mkfs=$1
img=$(mktemp /dev/shm/par-test-loop-XXXX.img) img=$(mktemp /dev/shm/par-test-loop-XXXX.img)
dir=$(mktemp -d /tmp/par-test-loop-XXXX) dir=$(mktemp -d /tmp/par-test-loop-XXXX)
dd if=/dev/zero bs=1000k count=150 > $img dd if=/dev/zero bs=1000k count=150 > "$img"
# Use the mkfs.$filesystem # Use the mkfs.$filesystem
$mkfs $img $mkfs "$img"
sudo mount $img $dir -oloop,uid=`id -u` 2>/dev/null || sudo mount "$img" "$dir" -oloop,uid=`id -u` 2>/dev/null ||
sudo mount $img $dir -oloop sudo mount "$img" "$dir" -oloop
cd $dir cd "$dir"
sudo chown `id -u` . sudo chown `id -u` .
df $dir df "$dir"
printf "%s\0" '' +m . +_ .. +__ ,. ,.. + ++ / +z | printf "%s\0" '' +m . +_ .. +__ ,. ,.. + ++ / +z |
parallel -0 --results a echo parallel -0 --results a echo
find a | sort (cd a/1 && find . -type d | sort | fmt -2000)
seq 128 | perl -ne 'printf "%c\0",$_' | seq 128 | perl -ne 'printf "%c\0",$_' |
parallel -0 --results b128 echo parallel -0 --results b128 echo
find b128 | sort (cd b128/1 && find . -type d | sort | fmt -2000)
seq 128 255 | perl -ne 'printf "%c\0",$_' | seq 128 255 | perl -ne 'printf "%c\0",$_' |
parallel -0 --results b255 echo parallel -0 --results b255 echo
find b255 | sort (cd b255/1 && find . -type d | sort | fmt -2000)
cd cd
sudo umount $dir sudo umount "$dir"
rm -r $dir/ rmdir "$dir"/
rm $img rm "$img"
} }
export -f doit export -f doit
stdout parallel -k --tag --plus doit ::: \ stdout parallel -k --tag --plus doit ::: \
@ -83,7 +84,7 @@ par_quote_special_results() {
"mkfs.reiserfs -fq" "mkfs.ntfs -F" "mkfs.xfs -f" mkfs.minix \ "mkfs.reiserfs -fq" "mkfs.ntfs -F" "mkfs.xfs -f" mkfs.minix \
mkfs.fat mkfs.vfat mkfs.msdos mkfs.f2fs | mkfs.fat mkfs.vfat mkfs.msdos mkfs.f2fs |
perl -pe 's:(/dev/loop|par-test-loop)\S+:$1:g;s/ +/ /g' | perl -pe 's:(/dev/loop|par-test-loop)\S+:$1:g;s/ +/ /g' |
G -v MB/s -v UUID -v Binutils G --v MB/s GB/s UUID Binutils
# Skip: # Skip:
# mkfs.bfs - ro # mkfs.bfs - ro
# mkfs.cramfs - ro # mkfs.cramfs - ro
@ -297,12 +298,13 @@ par_failing_compressor() {
,,, files --files -k \ ,,, files --files -k \
,,, comp 'cat;true' 'cat;false' \ ,,, comp 'cat;true' 'cat;false' \
,,, decomp 'cat;true' 'cat;false' | ,,, decomp 'cat;true' 'cat;false' |
perl -pe 's:/par......par:/tmpfile:' perl -pe 's:/.*par......par:/tmpfile:'
} }
par_fifo_under_csh() { par_fifo_under_csh() {
echo '### Test --fifo under csh' echo '### Test --fifo under csh'
# csh does not seem to work with TMPDIR containing \n
TMPDIR=/tmp
csh -c "seq 3000000 | parallel -k --pipe --fifo 'sleep .{#};cat {}|wc -c ; false; echo \$status; false'" csh -c "seq 3000000 | parallel -k --pipe --fifo 'sleep .{#};cat {}|wc -c ; false; echo \$status; false'"
echo exit $? echo exit $?
} }
@ -531,28 +533,17 @@ par_sem_2jobs() {
echo done echo done
} }
par_semaphore() {
echo '### Test if parallel invoked as sem will run parallel --semaphore'
sem --id as_sem -u -j2 'echo job1a 1; sleep 3; echo job1b 3'
sleep 0.5
sem --id as_sem -u -j2 'echo job2a 2; sleep 3; echo job2b 5'
sleep 0.5
sem --id as_sem -u -j2 'echo job3a 4; sleep 3; echo job3b 6'
sem --id as_sem --wait
echo done
}
par_line_buffer() { par_line_buffer() {
echo "### --line-buffer" echo "### --line-buffer"
tmp1=$(mktemp) tmp1=$(mktemp)
tmp2=$(mktemp) tmp2=$(mktemp)
seq 10 | parallel -j20 --line-buffer 'seq {} 10 | pv -qL 10' > $tmp1 seq 10 | parallel -j20 --line-buffer 'seq {} 10 | pv -qL 10' > "$tmp1"
seq 10 | parallel -j20 'seq {} 10 | pv -qL 10' > $tmp2 seq 10 | parallel -j20 'seq {} 10 | pv -qL 10' > "$tmp2"
cat $tmp1 | wc cat "$tmp1" | wc
diff $tmp1 $tmp2 >/dev/null diff "$tmp1" "$tmp2" >/dev/null
echo These must diff: $? echo These must diff: $?
rm $tmp1 $tmp2 rm "$tmp1" "$tmp2"
} }
par_pipe_line_buffer() { par_pipe_line_buffer() {
@ -568,17 +559,19 @@ par_pipe_line_buffer() {
} }
export PARALLEL="-N10 -L1 --pipe -j20 --tagstring {#}" export PARALLEL="-N10 -L1 --pipe -j20 --tagstring {#}"
seq 200| parallel --line-buffer pv -qL 10 > $tmp1 2> >(nowarn) seq 200| parallel --line-buffer pv -qL 10 > "$tmp1" 2> >(nowarn)
seq 200| parallel pv -qL 10 > $tmp2 2> >(nowarn) seq 200| parallel pv -qL 10 > "$tmp2" 2> >(nowarn)
cat $tmp1 | wc cat "$tmp1" | wc
diff $tmp1 $tmp2 >/dev/null diff "$tmp1" "$tmp2" >/dev/null
echo These must diff: $? echo These must diff: $?
rm $tmp1 $tmp2 rm "$tmp1" "$tmp2"
} }
par_pipe_line_buffer_compress() { par_pipe_line_buffer_compress() {
echo "### --pipe --line-buffer --compress" echo "### --pipe --line-buffer --compress"
seq 200| parallel -N10 -L1 --pipe -j20 --line-buffer --compress --tagstring {#} pv -qL 10 | wc seq 200 |
parallel -N10 -L1 --pipe -j20 --line-buffer --compress --tagstring {#} pv -qL 10 |
wc
} }
par__pipepart_spawn() { par__pipepart_spawn() {
@ -610,9 +603,9 @@ par__pipepart_tee() {
head -c 100M; head -c 100M;
} }
tmp=$(mktemp) tmp=$(mktemp)
random100M >$tmp random100M >"$tmp"
parallel --pipepart --tee -a $tmp cat ::: {1..3} | LC_ALL=C wc -c parallel --pipepart --tee -a $tmp cat ::: {1..3} | LC_ALL=C wc -c
rm $tmp rm "$tmp"
} }
par_k() { par_k() {
@ -671,7 +664,7 @@ par_results_csv() {
export -f doit export -f doit
parallel -k --tag doit ::: '--header :' '' \ parallel -k --tag doit ::: '--header :' '' \
::: --tag '' ::: --files '' ::: --compress '' | ::: --tag '' ::: --files '' ::: --compress '' |
perl -pe 's:/par......par:/tmpfile:g;s/\d+\.\d+/999.999/g' perl -pe 's:/.*par......par:/tmpfile:g;s/\d+\.\d+/999.999/g'
} }
par_kill_children_timeout() { par_kill_children_timeout() {
@ -694,7 +687,7 @@ par_kill_children_timeout() {
par_tmux_fg() { par_tmux_fg() {
echo 'bug #50107: --tmux --fg should also write how to access it' echo 'bug #50107: --tmux --fg should also write how to access it'
stdout parallel --tmux --fg sleep ::: 3 | perl -pe 's/.tmp\S+/tmp/' stdout parallel --tmux --fg sleep ::: 3 | perl -pe 's:/tmp.*tms.....:tmpfile:'
} }
@ -769,6 +762,6 @@ 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/' |
# Replace $PWD with . even if given as ~/... # Replace $PWD with . even if given as ~/...
perl -pe 's:~:'$HOME':g' | perl -pe 's:~:'"$HOME"':g' |
perl -pe 's:'$PWD':.:g' | perl -pe 's:'"$PWD"':.:g' |
perl -pe 's:'$HOME':~:g' perl -pe 's:'"$HOME"':~:g'

View file

@ -102,7 +102,7 @@ par_compute_command_len() {
} }
par_skip_first_line() { par_skip_first_line() {
tmp=$(mktemp) tmp="$(mktemp)"
(echo `seq 10000`;echo MyHeader; seq 10) | (echo `seq 10000`;echo MyHeader; seq 10) |
parallel -k --skip-first-line --pipe --block 10 --header '1' cat parallel -k --skip-first-line --pipe --block 10 --header '1' cat
(echo `seq 10000`;echo MyHeader; seq 10) > "$tmp" (echo `seq 10000`;echo MyHeader; seq 10) > "$tmp"
@ -152,21 +152,21 @@ par_uninstalled_sshpass() {
} }
par_results_compress() { par_results_compress() {
tmpdir=$(mktemp) tmpdir="$(mktemp)"
rm -r "$tmpdir" rm -r "$tmpdir"
parallel --results $tmpdir --compress echo ::: 1 parallel --results "$tmpdir" --compress echo ::: 1
cat "$tmpdir"/*/*/stdout | pzstd -qdc cat "$tmpdir"/*/*/stdout | pzstd -qdc
rm -r "$tmpdir" rm -r "$tmpdir"
parallel --results $tmpdir echo ::: 1 parallel --results "$tmpdir" echo ::: 1
cat "$tmpdir"/*/*/stdout cat "$tmpdir"/*/*/stdout
rm -r "$tmpdir" rm -r "$tmpdir"
parallel --results $tmpdir --compress echo ::: ' ' / parallel --results "$tmpdir" --compress echo ::: ' ' /
cat "$tmpdir"/*/*/stdout | pzstd -qdc cat "$tmpdir"/*/*/stdout | pzstd -qdc
rm -r "$tmpdir" rm -r "$tmpdir"
parallel --results $tmpdir echo ::: ' ' / parallel --results "$tmpdir" echo ::: ' ' /
cat "$tmpdir"/*/*/stdout cat "$tmpdir"/*/*/stdout
rm -r "$tmpdir" rm -r "$tmpdir"
@ -197,11 +197,15 @@ par_open_files_blocks() {
par_pipe_unneeded_procs() { par_pipe_unneeded_procs() {
echo 'bug #34241: --pipe should not spawn unneeded processes - part 2' echo 'bug #34241: --pipe should not spawn unneeded processes - part 2'
tmp="$(mktemp -d)"
cd "$tmp"
seq 500 | parallel --tmpdir . -j10 --pipe --block 1k --files wc >/dev/null seq 500 | parallel --tmpdir . -j10 --pipe --block 1k --files wc >/dev/null
ls *.par | wc -l; rm *.par ls *.par | wc -l; rm *.par
seq 500 | parallel --tmpdir . -j10 --pipe --block 1k --files --dry-run wc >/dev/null seq 500 | parallel --tmpdir . -j10 --pipe --block 1k --files --dry-run wc >/dev/null
echo No .par should exist echo No .par should exist
stdout ls *.par stdout ls *.par
cd ..
rm -r "$tmp"
} }
par_interactive() { par_interactive() {
@ -1065,11 +1069,11 @@ par_pipepart_block() {
} }
par_block_negative_prefix() { par_block_negative_prefix() {
tmp=`mktemp` tmp="$(mktemp)"
seq 100000 > $tmp seq 100000 > "$tmp"
echo '### This should generate 10*2 jobs' echo '### This should generate 10*2 jobs'
parallel -j2 -a $tmp --pipepart --block -0.01k -k md5sum | wc parallel -j2 -a "$tmp" --pipepart --block -0.01k -k md5sum | wc
rm $tmp rm "$tmp"
} }
par_sql_colsep() { par_sql_colsep() {

View file

@ -307,12 +307,12 @@ par_groupby_pipepart() {
generator="$1" generator="$1"
colsep="$2" colsep="$2"
groupby="$3" groupby="$3"
tmp=`mktemp` tmp=$(mktemp)
echo "### test $generator | --colsep $colsep --groupby $groupby" echo "### test $generator | --colsep $colsep --groupby $groupby"
$generator > $tmp $generator > "$tmp"
parallel --header 1 --pipepart -k \ parallel --header 1 --pipepart -k \
-a $tmp --colsep "$colsep" --groupby "$groupby" 'echo NewRec; wc' -a "$tmp" --colsep "$colsep" --groupby "$groupby" 'echo NewRec; wc'
} }
export -f tester export -f tester
parallel --tag -k tester \ parallel --tag -k tester \
@ -348,7 +348,7 @@ par_memory_leak() {
export -f a_run export -f a_run
echo "### Test for memory leaks" echo "### Test for memory leaks"
echo "Of 300 runs of 1 job at least one should be bigger than a 3000 job run" echo "Of 300 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 300 | parallel a_run 1 | jq -s max' 'a_run 3000' parset small_max,big ::: 'seq 300 | parallel a_run 1 | jq -s max' 'a_run 3000'
if [ $small_max -lt $big ] ; then if [ $small_max -lt $big ] ; then
echo "Bad: Memleak likely." echo "Bad: Memleak likely."
@ -571,4 +571,4 @@ par_test_ipv6_format() {
export -f $(compgen -A function | grep par_) export -f $(compgen -A function | grep par_)
compgen -A function | grep par_ | sort | compgen -A function | grep par_ | sort |
# parallel --delay 0.3 --timeout 1000% -j6 --tag -k --joblog /tmp/jl-`basename $0` '{} 2>&1' # parallel --delay 0.3 --timeout 1000% -j6 --tag -k --joblog /tmp/jl-`basename $0` '{} 2>&1'
parallel --delay 0.3 --timeout 1000% -j6 --lb --tag -k --joblog /tmp/jl-`basename $0` '{} 2>&1' parallel --delay 0.3 --timeout 3000% -j6 --lb --tag -k --joblog /tmp/jl-`basename $0` '{} 2>&1'

View file

@ -22,9 +22,9 @@ par_retries_0() {
echo '--retries 0 = inf' echo '--retries 0 = inf'
echo this wraps at 256 and should retry until it wraps echo this wraps at 256 and should retry until it wraps
tmp=$(mktemp) tmp=$(mktemp)
parallel --retries 0 -u 'printf {} >> '$tmp';a=`stat -c %s '$tmp'`; echo -n " $a"; exit $a' ::: a parallel --retries 0 -u 'printf {} >> '"'$tmp'"';a=`stat -c %s '"'$tmp'"'`; echo -n " $a"; exit $a' ::: a
echo echo
rm -f $tmp rm -f "$tmp"
} }
par_prefix_for_L_n_N_s() { par_prefix_for_L_n_N_s() {
@ -135,7 +135,10 @@ EOF
} }
export -f run gp oct pl py r rb sh export -f run gp oct pl py r rb sh
parallel --tag -k run ::: gp oct pl py r rb sh parallel --tag -k run ::: gp oct pl py rb sh
# R fails if TMPDIR contains space
TMPDIR=/tmp
parallel --tag -k run ::: r
} }
par_pipe_regexp() { par_pipe_regexp() {
@ -300,8 +303,8 @@ par_tee_with_premature_close() {
correct="$(seq 1000000 | parallel -k --tee --pipe ::: wc head tail 'sleep 1')" correct="$(seq 1000000 | parallel -k --tee --pipe ::: wc head tail 'sleep 1')"
echo "$correct" echo "$correct"
echo 'tee without --output-error=warn-nopipe support' echo 'tee without --output-error=warn-nopipe support'
tmpdir=$(mktemp) tmpdir=$(mktemp -d)
cat > tmp/tee <<-EOF cat > "$tmpdir"/tee <<-EOF
#!/usr/bin/perl #!/usr/bin/perl
if(grep /output-error=warn-nopipe/, @ARGV) { if(grep /output-error=warn-nopipe/, @ARGV) {
@ -309,8 +312,8 @@ par_tee_with_premature_close() {
} }
exec "/usr/bin/tee", @ARGV; exec "/usr/bin/tee", @ARGV;
EOF EOF
chmod +x tmp/tee chmod +x "$tmpdir"/tee
PATH=tmp:$PATH PATH="$tmpdir":$PATH
# This gives incomplete output due to: # This gives incomplete output due to:
# * tee not supporting --output-error=warn-nopipe # * tee not supporting --output-error=warn-nopipe
# * sleep closes stdin before EOF # * sleep closes stdin before EOF
@ -321,6 +324,8 @@ par_tee_with_premature_close() {
else else
echo OK echo OK
fi fi
rm "$tmpdir"/tee
rmdir "$tmpdir"
} }
par_tee_too_many_args() { par_tee_too_many_args() {

View file

@ -6,7 +6,7 @@
setup() { setup() {
tmp=$(mktemp) tmp=$(mktemp)
perl -pe 's/\n/\n\0/' >$tmp <<EOF perl -pe 's/\n/\n\0/' >"$tmp" <<EOF
chr1 1 Sample 1 chr1 1 Sample 1
chr1 11 Sample 1 chr1 11 Sample 1
chr1 111 Sample 1 chr1 111 Sample 1
@ -67,10 +67,10 @@ EOF
parsort_test() { parsort_test() {
echo "### parsort $@" echo "### parsort $@"
parsort "$@" $tmp | md5sum parsort "$@" "$tmp" | md5sum
sort "$@" $tmp | md5sum sort "$@" "$tmp" | md5sum
parsort "$@" < $tmp | md5sum parsort "$@" < "$tmp" | md5sum
sort "$@" < $tmp | md5sum sort "$@" < "$tmp" | md5sum
} }
export -f parsort_test export -f parsort_test

View file

@ -22,9 +22,9 @@ par_parcat_mixing() {
echo 'parcat output should mix: a b a b' echo 'parcat output should mix: a b a b'
mktempfifo() { mktempfifo() {
tmp=$(mktemp) tmp=$(mktemp)
rm $tmp rm "$tmp"
mkfifo $tmp mkfifo "$tmp"
echo $tmp echo "$tmp"
} }
slow_output() { slow_output() {
string=$1 string=$1
@ -34,10 +34,10 @@ par_parcat_mixing() {
} }
tmp1=$(mktempfifo) tmp1=$(mktempfifo)
tmp2=$(mktempfifo) tmp2=$(mktempfifo)
slow_output a > $tmp1 & slow_output a > "$tmp1" &
sleep 1 sleep 1
slow_output b > $tmp2 & slow_output b > "$tmp2" &
parcat $tmp1 $tmp2 | tr -s ab parcat "$tmp1" "$tmp2" | tr -s ab
} }
par_tmux_termination() { par_tmux_termination() {

View file

@ -6,6 +6,17 @@
# These fail regularly # These fail regularly
par_semaphore() {
echo '### Test if parallel invoked as sem will run parallel --semaphore'
sem --id as_sem -u -j2 'echo job1a 1; sleep 3; echo job1b 3'
sleep 0.5
sem --id as_sem -u -j2 'echo job2a 2; sleep 3; echo job2b 5'
sleep 0.5
sem --id as_sem -u -j2 'echo job3a 4; sleep 3; echo job3b 6'
sem --id as_sem --wait
echo done
}
ctrlz_should_suspend_children() { ctrlz_should_suspend_children() {
echo 'bug #46120: Suspend should suspend (at least local) children' echo 'bug #46120: Suspend should suspend (at least local) children'
echo 'it should burn 1.9 CPU seconds, but no more than that' echo 'it should burn 1.9 CPU seconds, but no more than that'
@ -52,7 +63,7 @@ par_sql_CSV() {
par_hostgroup() { par_hostgroup() {
echo '### --hostgroup force ncpu' echo '### --hostgroup force ncpu'
parallel --delay 0.1 --hgrp -S @g1/1/parallel@lo -S @g2/3/lo whoami\;sleep 0.4{} ::: {1..8} | sort parallel --delay 0.1 --hgrp -S @g1/1/parallel@lo -S @g2/3/lo whoami\;sleep 0.4{} ::: {1..8} | sort -u
echo '### --hostgroup two group arg' echo '### --hostgroup two group arg'
parallel -k --sshdelay 0.1 --hgrp -S @g1/1/parallel@lo -S @g2/3/lo whoami\;sleep 0.3{} ::: {1..8}@g1+g2 | sort parallel -k --sshdelay 0.1 --hgrp -S @g1/1/parallel@lo -S @g2/3/lo whoami\;sleep 0.3{} ::: {1..8}@g1+g2 | sort
@ -61,7 +72,7 @@ par_hostgroup() {
parallel --delay 0.2 --hgrp -S @g1/1/parallel@lo -S @g2/3/lo whoami\;sleep 0.4{} ::: {1..8}@g2 parallel --delay 0.2 --hgrp -S @g1/1/parallel@lo -S @g2/3/lo whoami\;sleep 0.4{} ::: {1..8}@g2
echo '### --hostgroup multiple group arg + unused group' echo '### --hostgroup multiple group arg + unused group'
parallel --delay 0.2 --hgrp -S @g1/1/parallel@lo -S @g1/3/lo -S @g3/100/tcsh@lo whoami\;sleep 0.8{} ::: {1..8}@g1+g2 | sort parallel --delay 0.2 --hgrp -S @g1/1/parallel@lo -S @g1/3/lo -S @g3/100/tcsh@lo whoami\;sleep 0.8{} ::: {1..8}@g1+g2 | sort -u
echo '### --hostgroup two groups @' echo '### --hostgroup two groups @'
parallel -k --hgrp -S @g1/parallel@lo -S @g2/lo --tag whoami\;echo ::: parallel@g1 tange@g2 parallel -k --hgrp -S @g1/parallel@lo -S @g2/lo --tag whoami\;echo ::: parallel@g1 tange@g2
@ -73,7 +84,7 @@ par_hostgroup() {
parallel -k --hostgroups -S parallel@lo echo ::: no_group implicit_group@parallel@lo parallel -k --hostgroups -S parallel@lo echo ::: no_group implicit_group@parallel@lo
echo '### --hostgroup -S @group' echo '### --hostgroup -S @group'
parallel -S @g1/ -S @g1/1/tcsh@lo -S @g1/1/localhost -S @g2/1/parallel@lo whoami\;true ::: {1..6} | sort parallel -S @g1/ -S @g1/1/tcsh@lo -S @g1/1/localhost -S @g2/1/parallel@lo whoami\;true ::: {1..6} | sort -u
echo '### --hostgroup -S @group1 -Sgrp2' echo '### --hostgroup -S @group1 -Sgrp2'
parallel -S @g1/ -S @g2 -S @g1/1/tcsh@lo -S @g1/1/localhost -S @g2/1/parallel@lo whoami\;true ::: {1..6} | sort parallel -S @g1/ -S @g2 -S @g1/1/tcsh@lo -S @g1/1/localhost -S @g2/1/parallel@lo whoami\;true ::: {1..6} | sort
@ -155,15 +166,15 @@ par_kill_hup() {
par_resume_failed_k() { par_resume_failed_k() {
echo '### bug #38299: --resume-failed -k' echo '### bug #38299: --resume-failed -k'
tmp=$(mktemp) tmp=$(mktemp)
parallel -k --resume-failed --joblog $tmp echo job{#} val {}\;exit {} ::: 0 1 2 3 0 1 parallel -k --resume-failed --joblog "$tmp" echo job{#} val {}\;exit {} ::: 0 1 2 3 0 1
echo try 2. Gives failing - not 0 echo try 2. Gives failing - not 0
parallel -k --resume-failed --joblog $tmp echo job{#} val {}\;exit {} ::: 0 1 2 3 0 1 parallel -k --resume-failed --joblog "$tmp" echo job{#} val {}\;exit {} ::: 0 1 2 3 0 1
echo with exit 0 echo with exit 0
parallel -k --resume-failed --joblog $tmp echo job{#} val {}\;exit 0 ::: 0 1 2 3 0 1 parallel -k --resume-failed --joblog "$tmp" echo job{#} val {}\;exit 0 ::: 0 1 2 3 0 1
sleep 0.5 sleep 0.5
echo try 2 again. Gives empty echo try 2 again. Gives empty
parallel -k --resume-failed --joblog $tmp echo job{#} val {}\;exit {} ::: 0 1 2 3 0 1 parallel -k --resume-failed --joblog "$tmp" echo job{#} val {}\;exit {} ::: 0 1 2 3 0 1
rm $tmp rm "$tmp"
} }
par_testhalt() { par_testhalt() {

View file

@ -28,8 +28,8 @@ p_wrapper() {
echo Exit=$? echo Exit=$?
wait wait
echo Exit=$? echo Exit=$?
$DEBUG && sort -u $T1 $T2; $DEBUG && sort -u "$T1" "$T2";
rm $T1 $T2 rm "$T1" "$T2"
p_showsqlresult $SERVERURL $TABLE p_showsqlresult $SERVERURL $TABLE
$DEBUG || sql $SERVERURL "drop table $TABLE;" >/dev/null 2>/dev/null $DEBUG || sql $SERVERURL "drop table $TABLE;" >/dev/null 2>/dev/null
} }
@ -38,9 +38,9 @@ p_template() {
( (
# Make sure all jobs are inserted before starting a worker # Make sure all jobs are inserted before starting a worker
sleep 10; sleep 10;
parallel --sqlworker $DBURL "$@" sleep .3\;echo >$T1 parallel --sqlworker $DBURL "$@" sleep .3\;echo >"$T1"
) & ) &
parallel --sqlandworker $DBURL "$@" sleep .3\;echo ::: {1..5} ::: {a..e} >$T2; parallel --sqlandworker $DBURL "$@" sleep .3\;echo ::: {1..5} ::: {a..e} >"$T2";
} }
par_sqlandworker() { par_sqlandworker() {
@ -68,35 +68,35 @@ par_sqlandworker_total_jobs() {
} }
par_append_different_cmd() { par_append_different_cmd() {
parallel --sqlmaster $DBURL sleep .3\;echo ::: {1..5} ::: {a..e} >$T2; parallel --sqlmaster "$DBURL" sleep .3\;echo ::: {1..5} ::: {a..e} >"$T2";
parallel --sqlmaster +$DBURL sleep .3\;echo {2}-{1} ::: {11..15} ::: {A..E} >>$T2; parallel --sqlmaster +"$DBURL" sleep .3\;echo {2}-{1} ::: {11..15} ::: {A..E} >>"$T2";
parallel --sqlworker $DBURL >$T1 parallel --sqlworker "$DBURL" >"$T1"
} }
par_shuf() { par_shuf() {
MD5=$(echo $SERVERURL | md5sum | perl -pe 's/(...).*/$1/') MD5=$(echo "$SERVERURL" | md5sum | perl -pe 's/(...).*/$1/')
T=/tmp/parallel-bug49791-$MD5 T=/tmp/parallel-bug49791-" <$MD5"
[ -e $T ] && rm -rf $T [ -e "$T" ] && rm -rf "$T"
export PARALLEL="--shuf --result $T" export PARALLEL="--shuf --result '$T'"
parallel --sqlandworker $DBURL sleep .3\;echo \ parallel --sqlandworker $DBURL sleep .3\;echo \
::: {1..5} ::: {a..e} >$T2; ::: {1..5} ::: {a..e} >"$T2";
parallel --sqlworker $DBURL >$T2 & parallel --sqlworker $DBURL >"$T2" &
parallel --sqlworker $DBURL >$T2 & parallel --sqlworker $DBURL >"$T2" &
parallel --sqlworker $DBURL >$T2 & parallel --sqlworker $DBURL >"$T2" &
parallel --sqlworker $DBURL >$T2 & parallel --sqlworker $DBURL >"$T2" &
unset PARALLEL unset PARALLEL
wait; wait;
# Did it compute correctly? # Did it compute correctly?
cat $T/1/*/*/*/stdout cat "$T"/1/*/*/*/stdout
# Did it shuffle # Did it shuffle
SHUF=$(sql $SERVERURL "select Host,Command,V1,V2,Stdout,Stderr from $TABLE order by seq;") SHUF=$(sql "$SERVERURL" "select Host,Command,V1,V2,Stdout,Stderr from $TABLE order by seq;")
export PARALLEL="--result $T" export PARALLEL="--result '$T'"
parallel --sqlandworker $DBURL sleep .3\;echo \ parallel --sqlandworker "$DBURL" sleep .3\;echo \
::: {1..5} ::: {a..e} >$T2; ::: {1..5} ::: {a..e} >"$T2";
parallel --sqlworker $DBURL >$T2 & parallel --sqlworker "$DBURL" >"$T2" &
parallel --sqlworker $DBURL >$T2 & parallel --sqlworker "$DBURL" >"$T2" &
parallel --sqlworker $DBURL >$T2 & parallel --sqlworker "$DBURL" >"$T2" &
parallel --sqlworker $DBURL >$T2 & parallel --sqlworker "$DBURL" >"$T2" &
unset PARALLEL unset PARALLEL
wait; wait;
NOSHUF=$(sql $SERVERURL "select Host,Command,V1,V2,Stdout,Stderr from $TABLE order by seq;") NOSHUF=$(sql $SERVERURL "select Host,Command,V1,V2,Stdout,Stderr from $TABLE order by seq;")
@ -104,8 +104,8 @@ par_shuf() {
if [ $DIFFSIZE -gt 2500 ]; then if [ $DIFFSIZE -gt 2500 ]; then
echo OK: Diff bigger than 2500 char echo OK: Diff bigger than 2500 char
fi fi
[ -e $T ] && rm -rf $T [ -e "$T" ] && rm -rf "$T"
touch $T1 touch "$T1"
} }
par_sql_joblog() { par_sql_joblog() {
@ -115,10 +115,10 @@ par_sql_joblog() {
perl -pe 's/\d+\.\d+/999.999/g' | sort -n & perl -pe 's/\d+\.\d+/999.999/g' | sort -n &
sleep 0.5 sleep 0.5
T=$(mktemp) T=$(mktemp)
parallel -k --joblog - --sqlworker $DBURL > $T parallel -k --joblog - --sqlworker $DBURL > "$T"
wait wait
# Needed because of race condition # Needed because of race condition
cat $T; rm $T cat "$T"; rm "$T"
echo '### --sqlandworker' echo '### --sqlandworker'
parallel -k --joblog - --sqlandworker $DBURL sleep .3\;echo ::: {1..5} ::: {a..e} | parallel -k --joblog - --sqlandworker $DBURL sleep .3\;echo ::: {1..5} ::: {a..e} |
perl -pe 's/\d+\.\d+/999.999/g' | sort -n perl -pe 's/\d+\.\d+/999.999/g' | sort -n

View file

@ -38,8 +38,8 @@ p_wrapper() {
wait wait
echo Exit=$? echo Exit=$?
# For debugging show the tempfiles # For debugging show the tempfiles
$DEBUG && sort -u $T1 $T2; $DEBUG && sort -u "$T1" "$T2";
rm $T1 $T2 rm "$T1" "$T2"
p_showsqlresult $SERVERURL $TABLE p_showsqlresult $SERVERURL $TABLE
# Drop the table if not debugging # Drop the table if not debugging
$DEBUG || sql $SERVERURL "drop table $TABLE;" >/dev/null 2>/dev/null $DEBUG || sql $SERVERURL "drop table $TABLE;" >/dev/null 2>/dev/null
@ -50,9 +50,9 @@ p_template() {
( (
# Make sure there is work to be done # Make sure there is work to be done
sleep 6; sleep 6;
parallel --sqlworker $DBURL "$@" sleep .3\;echo >$T1 parallel --sqlworker $DBURL "$@" sleep .3\;echo >"$T1"
) & ) &
parallel --sqlandworker $DBURL "$@" sleep .3\;echo ::: {1..5} ::: {a..e} >$T2; parallel --sqlandworker $DBURL "$@" sleep .3\;echo ::: {1..5} ::: {a..e} >"$T2";
} }
par_sqlandworker() { par_sqlandworker() {
@ -92,9 +92,9 @@ par_sqlandworker_total_jobs() {
} }
par_append() { par_append() {
parallel --sqlmaster $DBURL sleep .3\;echo ::: {1..5} ::: {a..e} >$T2; parallel --sqlmaster $DBURL sleep .3\;echo ::: {1..5} ::: {a..e} >"$T2";
parallel --sqlmaster +$DBURL sleep .3\;echo ::: {11..15} ::: {A..E} >>$T2; parallel --sqlmaster +$DBURL sleep .3\;echo ::: {11..15} ::: {A..E} >>"$T2";
parallel --sqlworker $DBURL sleep .3\;echo >$T1 parallel --sqlworker $DBURL sleep .3\;echo >"$T1"
} }
par_shuf() { par_shuf() {
@ -103,11 +103,11 @@ par_shuf() {
[ -e $T ] && rm -rf $T [ -e $T ] && rm -rf $T
export PARALLEL="--shuf --result $T" export PARALLEL="--shuf --result $T"
parallel --sqlandworker $DBURL sleep .3\;echo \ parallel --sqlandworker $DBURL sleep .3\;echo \
::: {1..5} ::: {a..e} >$T2; ::: {1..5} ::: {a..e} >"$T2";
parallel --sqlworker $DBURL sleep .3\;echo >$T2 & parallel --sqlworker $DBURL sleep .3\;echo >"$T2" &
parallel --sqlworker $DBURL sleep .3\;echo >$T2 & parallel --sqlworker $DBURL sleep .3\;echo >"$T2" &
parallel --sqlworker $DBURL sleep .3\;echo >$T2 & parallel --sqlworker $DBURL sleep .3\;echo >"$T2" &
parallel --sqlworker $DBURL sleep .3\;echo >$T2 & parallel --sqlworker $DBURL sleep .3\;echo >"$T2" &
unset PARALLEL unset PARALLEL
wait; wait;
# Did it compute correctly? # Did it compute correctly?
@ -116,11 +116,11 @@ par_shuf() {
SHUF=$(sql $SERVERURL "select Host,Command,V1,V2,Stdout,Stderr from $TABLE order by seq;") SHUF=$(sql $SERVERURL "select Host,Command,V1,V2,Stdout,Stderr from $TABLE order by seq;")
export PARALLEL="--result $T" export PARALLEL="--result $T"
parallel --sqlandworker $DBURL sleep .3\;echo \ parallel --sqlandworker $DBURL sleep .3\;echo \
::: {1..5} ::: {a..e} >$T2; ::: {1..5} ::: {a..e} >"$T2";
parallel --sqlworker $DBURL sleep .3\;echo >$T2 & parallel --sqlworker $DBURL sleep .3\;echo >"$T2" &
parallel --sqlworker $DBURL sleep .3\;echo >$T2 & parallel --sqlworker $DBURL sleep .3\;echo >"$T2" &
parallel --sqlworker $DBURL sleep .3\;echo >$T2 & parallel --sqlworker $DBURL sleep .3\;echo >"$T2" &
parallel --sqlworker $DBURL sleep .3\;echo >$T2 & parallel --sqlworker $DBURL sleep .3\;echo >"$T2" &
unset PARALLEL unset PARALLEL
wait; wait;
NOSHUF=$(sql $SERVERURL "select Host,Command,V1,V2,Stdout,Stderr from $TABLE order by seq;") NOSHUF=$(sql $SERVERURL "select Host,Command,V1,V2,Stdout,Stderr from $TABLE order by seq;")
@ -129,7 +129,7 @@ par_shuf() {
echo OK: Diff bigger than 2500 char echo OK: Diff bigger than 2500 char
fi fi
[ -e $T ] && rm -rf $T [ -e $T ] && rm -rf $T
touch $T1 touch "$T1"
} }
par_empty() { par_empty() {

View file

@ -28,8 +28,8 @@ par_few_duplicate_run() {
wait wait
) | wc -l) ) | wc -l)
sql "$1" "drop table $TABLE;" sql "$1" "drop table $TABLE;"
if [ $lines -gt 105 ] ; then if [ $lines -gt 110 ] ; then
echo Error: $lines are more than 5% duplicates echo Error: $lines are more than 10% duplicates
else else
echo OK echo OK
fi fi

View file

@ -60,6 +60,8 @@ par_pipe_unneeded_spawn() {
par_files_nonall() { par_files_nonall() {
echo '### bug #40002: --files and --nonall seem not to work together:' echo '### bug #40002: --files and --nonall seem not to work together:'
# --files does not work with TMPDIR containing \n
TMPDIR=/tmp
parallel --files --nonall -S localhost true | tee >(parallel rm) | wc -l parallel --files --nonall -S localhost true | tee >(parallel rm) | wc -l
} }

View file

@ -109,9 +109,9 @@ par_bigvar_rc() {
par_tmux_different_shells() { par_tmux_different_shells() {
echo '### Test tmux works on different shells' echo '### Test tmux works on different shells'
(stdout parallel -Scsh@lo,tcsh@lo,parallel@lo,zsh@lo --tmux echo ::: 1 2 3 4; echo $?) | (stdout parallel -Scsh@lo,tcsh@lo,parallel@lo,zsh@lo --tmux echo ::: 1 2 3 4; echo $?) |
grep -v 'See output'; grep -v 'attach';
(stdout parallel -Scsh@lo,tcsh@lo,parallel@lo,zsh@lo --tmux false ::: 1 2 3 4; echo $?) | (stdout parallel -Scsh@lo,tcsh@lo,parallel@lo,zsh@lo --tmux false ::: 1 2 3 4; echo $?) |
grep -v 'See output'; grep -v 'attach';
export PARTMUX='parallel -Scsh@lo,tcsh@lo,parallel@lo,zsh@lo --tmux '; 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" 'true ::: 1 2 3 4; echo $status' | grep -v 'See output';
@ -128,16 +128,16 @@ par_tmux_different_shells() {
par_tmux_length() { par_tmux_length() {
echo '### works' echo '### works'
stdout parallel -Sparallel@lo --tmux echo ::: \\\\\\\"\\\\\\\"\\\;\@ | stdout parallel -Sparallel@lo --tmux echo ::: \\\\\\\"\\\\\\\"\\\;\@ |
perl -pe 's:/tmp/\S+::' perl -pe 's:/tmp/.*tms.....::'
stdout parallel -Sparallel@lo --tmux echo ::: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx | stdout parallel -Sparallel@lo --tmux echo ::: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx |
perl -pe 's:/tmp/\S+::' perl -pe 's:/tmp/.*tms.....::'
echo '### These blocked due to length' echo '### These blocked due to length'
stdout parallel -Slo --tmux echo ::: \\\\\\\"\\\\\\\"\\\;\@ | grep -v 'See output' stdout parallel -Slo --tmux echo ::: \\\\\\\"\\\\\\\"\\\;\@ | grep -v 'attach'
stdout parallel -Scsh@lo --tmux echo ::: \\\\\\\"\\\\\\\"\\\;\@ | grep -v 'See output' stdout parallel -Scsh@lo --tmux echo ::: \\\\\\\"\\\\\\\"\\\;\@ | grep -v 'attach'
stdout parallel -Stcsh@lo --tmux echo ::: \\\\\\\"\\\\\\\"\\\;\@ | grep -v 'See output' stdout parallel -Stcsh@lo --tmux echo ::: \\\\\\\"\\\\\\\"\\\;\@ | grep -v 'attach'
stdout parallel -Szsh@lo --tmux echo ::: \\\\\\\"\\\\\\\"\\\;\@ | grep -v 'See output' stdout parallel -Szsh@lo --tmux echo ::: \\\\\\\"\\\\\\\"\\\;\@ | grep -v 'attach'
stdout parallel -Scsh@lo --tmux echo ::: 111111111111111111111111111111111111111111111111111111111 | grep -v 'See output' stdout parallel -Scsh@lo --tmux echo ::: 111111111111111111111111111111111111111111111111111111111 | grep -v 'attach'
} }
par_transfer_return_multiple_inputs() { par_transfer_return_multiple_inputs() {

View file

@ -1,11 +1,29 @@
#!/bin/bash #!/bin/bash
# SPDX-FileCopyrightText: 2021-2022 Ole Tange, http://ole.tange.dk and Free Software and Foundation, Inc. # SPDX-FileCopyrightText: 2021-2023 Ole Tange, http://ole.tange.dk and Free Software and Foundation, Inc.
# #
# SPDX-License-Identifier: GPL-3.0-or-later # SPDX-License-Identifier: GPL-3.0-or-later
# SSH only allowed to localhost/lo # SSH only allowed to localhost/lo
par_ssh_cmd_with_newline() {
echo '### Check --ssh with \n works'
ssh=$(mktemp)
cp -a /usr/bin/ssh "$ssh"
parallel --ssh "'$ssh'" -S sh@lo ::: id
}
par_controlmaster() {
echo '### Check -M works if TMPDIR contains space'
(
seq 1 3 | parallel -j10 --retries 3 -k -M -S sh@lo echo
seq 1 3 | parallel -j10 --retries 3 -k -M -S sh@lo echo
)
echo Part2
parallel -j1 -k -M -S sh@lo echo ::: OK
}
par_autossh() { par_autossh() {
echo '### --ssh autossh' echo '### --ssh autossh'
( (

View file

@ -5,6 +5,12 @@
# SPDX-License-Identifier: GPL-3.0-or-later # SPDX-License-Identifier: GPL-3.0-or-later
echo '### Test with old perl libs' echo '### Test with old perl libs'
pwd=$(pwd)
# If not run in dir parallel/testsuite: set testsuitedir to path of testsuite
testsuitedir=${testsuitedir:-$pwd}
cd "$testsuitedir"
# Old libraries are put into input-files/perllib # Old libraries are put into input-files/perllib
PERL5LIB=input-files/perllib:../input-files/perllib; export PERL5LIB PERL5LIB=input-files/perllib:../input-files/perllib; export PERL5LIB

View file

@ -4,30 +4,34 @@
# #
# SPDX-License-Identifier: GPL-3.0-or-later # SPDX-License-Identifier: GPL-3.0-or-later
pwd=$(pwd)
# If not run in dir parallel/testsuite: set testsuitedir to path of testsuite
testsuitedir=${testsuitedir:-$pwd}
rm -rf tmp 2>/dev/null rm -rf tmp 2>/dev/null
cd input-files (
tar xjf random_dirs_no_newline.tar.bz2 cd "$testsuitedir"/input-files
cd .. tar xjf random_dirs_no_newline.tar.bz2
cp -a input-files/random_dirs_no_newline tmp )
cp -a "$testsuitedir"/input-files/random_dirs_no_newline tmp
cd tmp cd tmp
echo '### Tests if special dir names causes problems' echo '### Tests if special dir names causes problems'
ls | parallel -v touch -- {}/abc-{}-{} 2>&1 | perl -e 'print sort (<>)' | md5sum ls | parallel -v touch -- {}/abc-{}-{} 2>&1 | perl -e 'print sort (<>)' | md5sum
echo -n 'There are ' echo -n 'There are '
find . -type d -print0 | perl -0 -ne '$a++;END{print $a}' find . -type d -print0 | perl -0 -ne '$a++;END{print $a}'
echo -n ' dirs with ' echo -n ' dirs with '
find . -type f -print0 | perl -0 -ne '$a++;END{print $a}' find . -type f -print0 | perl -0 -ne '$a++;END{print $a}'
echo ' files' echo ' files'
echo 'Removing files' echo 'Removing files'
ls | parallel -v rm -- {}/abc-{}-{} 2>&1 | perl -e 'print sort (<>)' | md5sum ls | parallel -v rm -- {}/abc-{}-{} 2>&1 | perl -e 'print sort (<>)' | md5sum
echo -n 'There are ' echo -n 'There are '
find . -type d -print0 | perl -0 -ne '$a++;END{print $a}' find . -type d -print0 | perl -0 -ne '$a++;END{print $a}'
echo -n ' dirs with ' echo -n ' dirs with '
find . -type f -print0 | perl -0 -ne '$a++;END{print $a}' find . -type f -print0 | perl -0 -ne '$a++;END{print $a}'
echo ' files' echo ' files'
echo 'Removing dirs' echo 'Removing dirs'
ls | parallel -v rmdir -- {} 2>&1 | perl -e 'print sort (<>)' | md5sum ls | parallel -v rmdir -- {} 2>&1 | perl -e 'print sort (<>)' | md5sum
echo -n 'There are ' echo -n 'There are '
find . -type d -print0 | perl -0 -ne '$a++;END{print $a}' find . -type d -print0 | perl -0 -ne '$a++;END{print $a}'
echo -n ' dirs with ' echo -n ' dirs with '
find . -type f -print0 | perl -0 -ne '$a++;END{print $a}' find . -type f -print0 | perl -0 -ne '$a++;END{print $a}'

View file

@ -7,8 +7,10 @@
TMP=/run/shm/parallel_local105 TMP=/run/shm/parallel_local105
rm -rf $TMP 2>/dev/null rm -rf $TMP 2>/dev/null
mkdir -p $TMP mkdir -p $TMP
tar -C $TMP -xf input-files/random_dirs_with_newline.tar.bz2 pwd=$(pwd)
# If not run in dir parallel/testsuite: set testsuitedir to path of testsuite
testsuitedir=${testsuitedir:-$pwd}
tar -C $TMP -xf "$testsuitedir"/input-files/random_dirs_with_newline.tar.bz2
cd $TMP/random_dirs_with_newline cd $TMP/random_dirs_with_newline
# tests if special dir names causes problems # tests if special dir names causes problems

View file

@ -6,7 +6,11 @@
echo '### Tests from xargs' echo '### Tests from xargs'
rsync -Ha --delete input-files/xargs-inputs/ tmp/ pwd=$(pwd)
# If not run in dir parallel/testsuite: set testsuitedir to path of testsuite
testsuitedir=${testsuitedir:-$pwd}
rsync -Ha --delete "$testsuitedir"/input-files/xargs-inputs/ tmp/
cd tmp cd tmp
PARALLEL=-j8 PARALLEL=-j8

View file

@ -6,10 +6,12 @@
TMP=/run/shm/parallel_$$ TMP=/run/shm/parallel_$$
pwd=`pwd` pwd=$(pwd)
# If not run in dir parallel/testsuite: set testsuitedir to path of testsuite
testsuitedir=${testsuitedir:-$pwd}
mkdir -p $TMP mkdir -p $TMP
cd $TMP/ cd $TMP/
tar xjf "$pwd"/input-files/testdir.tar.bz2 tar xjf "$testsuitedir"/input-files/testdir.tar.bz2
echo echo test of cat pipe sh | parallel -j 50 2>&1 echo echo test of cat pipe sh | parallel -j 50 2>&1
find . -name '*.jpg' | parallel -j +0 convert -geometry 120 {} {//}/thumb_{/} find . -name '*.jpg' | parallel -j +0 convert -geometry 120 {} {//}/thumb_{/}

View file

@ -4,6 +4,7 @@
# #
# SPDX-License-Identifier: GPL-3.0-or-later # SPDX-License-Identifier: GPL-3.0-or-later
mkdir -p tmp
cd tmp cd tmp
median() { perl -e '@a=sort {$a<=>$b} <>;print $a[$#a/2]';} median() { perl -e '@a=sort {$a<=>$b} <>;print $a[$#a/2]';}

View file

@ -6,14 +6,15 @@
cpuburn=$(mktemp) cpuburn=$(mktemp)
(echo '#!/usr/bin/perl' (echo '#!/usr/bin/perl'
echo "eval{setpriority(0,0,9)}; while(1){}") > $cpuburn echo "eval{setpriority(0,0,9)}; while(1){}") > "$cpuburn"
chmod 700 $cpuburn chmod 700 "$cpuburn"
basename=$(basename "$cpuburn")
forceload () { forceload () {
# Force load # Force load
LOAD=$1 LOAD=$1
# Start 10 times as many cpuburn # Start 10 times as many cpuburn
seq 0 0.1 $1 | parallel -j0 timeout 20 $cpuburn 2>/dev/null & seq 0 0.1 $1 | parallel -j0 timeout 20 "'$cpuburn'" 2>/dev/null &
PID=$! PID=$!
# Give GNU Parallel 1 second to startup # Give GNU Parallel 1 second to startup
sleep 1 sleep 1
@ -37,15 +38,15 @@ echo '### Test slow arguments generation - https://savannah.gnu.org/bugs/?32834'
EOF EOF
# Make sure we got all the cpuburn killed # Make sure we got all the cpuburn killed
killall $(basename $cpuburn) 2>/dev/null killall "$basename" 2>/dev/null
echo '### Test too slow spawning' echo '### Test too slow spawning'
# Let the commands below run during high load # Let the commands below run during high load
seq 1000 | timeout 20 parallel -j400% -N0 $cpuburn 2>/dev/null & seq 1000 | timeout 20 parallel -j400% -N0 "'$cpuburn'" 2>/dev/null &
PID=$! PID=$!
seq 1 1000 | stdout nice nice parallel --halt 1 -uj0 -N0 kill $PID | seq 1 1000 | stdout nice nice parallel --halt 1 -uj0 -N0 kill $PID |
perl -pe '/parallel: Warning: Starting \d+ processes took/ and do {close STDIN; `kill '$PID';killall '$(basename $cpuburn)'`; print "OK\n"; exit }'; perl -pe '/parallel: Warning: Starting \d+ processes took/ and do {close STDIN; `kill '$PID';killall "$basename"`; print "OK\n"; exit }';
# Make sure we got all the cpuburn killed # Make sure we got all the cpuburn killed
killall $(basename $cpuburn) 2>/dev/null killall "$basename" 2>/dev/null
rm $cpuburn rm "$cpuburn"

View file

@ -52,8 +52,8 @@ echo '### bug #42041: Implement $PARALLEL_JOBSLOT'
echo '### bug #42363: --pipepart and --fifo/--cat does not work' echo '### bug #42363: --pipepart and --fifo/--cat does not work'
seq 100 > /tmp/bug42363; seq 100 > /tmp/bug42363;
parallel --pipepart --block 31 -a /tmp/bug42363 -k --fifo wc | perl -pe 's:(/tmp\S+par).....:${1}XXXXX:'; parallel --pipepart --block 31 -a /tmp/bug42363 -k --fifo wc | perl -pe 's:(/tmp.*par).....:${1}XXXXX:';
parallel --pipepart --block 31 -a /tmp/bug42363 -k --cat wc | perl -pe 's:(/tmp\S+par).....:${1}XXXXX:'; parallel --pipepart --block 31 -a /tmp/bug42363 -k --cat wc | perl -pe 's:(/tmp.*par).....:${1}XXXXX:';
rm /tmp/bug42363 rm /tmp/bug42363
echo '### bug #42055: --pipepart -a bigfile should not require sequential reading of bigfile' echo '### bug #42055: --pipepart -a bigfile should not require sequential reading of bigfile'

View file

@ -103,17 +103,17 @@ echo '### Race condition bug - 2 - would block';
seq 1 100 | nice parallel -j100 --block 1 --recend "" --pipe cat >/dev/null seq 1 100 | nice parallel -j100 --block 1 --recend "" --pipe cat >/dev/null
echo '### Test --block size=1'; echo '### Test --block size=1';
seq 1 10| parallel --block 1 --files --recend "" --pipe sort -n | parallel -Xj1 sort -nm {} ";"rm {} seq 1 10| TMPDIR=/tmp parallel --block 1 --files --recend "" --pipe sort -n | parallel -Xj1 sort -nm {} ";"rm {}
echo '### Test --block size=1M -j10 --files - more jobs than data'; echo '### Test --block size=1M -j10 --files - more jobs than data';
sort -n < /tmp/blocktest | md5sum; sort -n < /tmp/blocktest | md5sum;
cat /tmp/blocktest | parallel --files --recend "\n" -j10 --pipe sort -n | parallel -Xj1 sort -nm {} ";"rm {} | md5sum cat /tmp/blocktest | TMPDIR=/tmp parallel --files --recend "\n" -j10 --pipe sort -n | parallel -Xj1 sort -nm {} ";"rm {} | md5sum
echo '### Test --block size=1M -j1 - more data than cpu'; echo '### Test --block size=1M -j1 - more data than cpu';
cat /tmp/blocktest | parallel --files --recend "\n" -j1 --pipe sort -n | parallel -Xj1 sort -nm {} ";"rm {} | md5sum cat /tmp/blocktest | TMPDIR=/tmp parallel --files --recend "\n" -j1 --pipe sort -n | parallel -Xj1 sort -nm {} ";"rm {} | md5sum
echo '### Test --block size=1M -j1 - more data than cpu'; echo '### Test --block size=1M -j1 - more data than cpu';
cat /tmp/blocktest | parallel --files --recend "\n" -j2 --pipe sort -n | parallel -Xj1 sort -nm {} ";"rm {} | md5sum cat /tmp/blocktest | TMPDIR=/tmp parallel --files --recend "\n" -j2 --pipe sort -n | parallel -Xj1 sort -nm {} ";"rm {} | md5sum
echo '### Test --pipe default settings'; echo '### Test --pipe default settings';
cat /tmp/blocktest | parallel --pipe sort | sort -n | md5sum cat /tmp/blocktest | parallel --pipe sort | sort -n | md5sum

View file

@ -6,7 +6,7 @@
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.*/tms).....:$1XXXXX:;s/ p\d+/pID/;'
} }
export -f par_tmux_filter export -f par_tmux_filter

View file

@ -50,8 +50,9 @@ echo '### Test --spreadstdin - this failed during devel';
echo '### Test --spreadstdin -k'; echo '### Test --spreadstdin -k';
nice seq 1 1000000 | $NICEPAR -k --recend "\n" -j10 --spreadstdin gzip -9 | zcat | md5sum nice seq 1 1000000 | $NICEPAR -k --recend "\n" -j10 --spreadstdin gzip -9 | zcat | md5sum
# --files requires TMPDIR does not contain \n
echo '### Test --spreadstdin --files'; echo '### Test --spreadstdin --files';
nice seq 1 1000000 | shuf | $NICEPAR --files --recend "\n" -j10 --spreadstdin sort -n | parallel -Xj1 sort -nm {} ";"rm {} | md5sum nice seq 1 1000000 | shuf | TMPDIR=/tmp $NICEPAR --files --recend "\n" -j10 --spreadstdin sort -n | parallel -Xj1 sort -nm {} ";"rm {} | md5sum
echo '### Test --tag ::: a ::: b'; echo '### Test --tag ::: a ::: b';
stdout $NICEPAR -k --tag -j1 echo stderr-{.} ">&2;" echo stdout-{} ::: a ::: b stdout $NICEPAR -k --tag -j1 echo stderr-{.} ">&2;" echo stdout-{} ::: a ::: b

View file

@ -51,6 +51,7 @@ par_filter_hosts_no_ssh_nxserver() {
par_controlmaster_is_faster() { par_controlmaster_is_faster() {
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'
echo '-M should finish first - eventhough there are 2x jobs' echo '-M should finish first - eventhough there are 2x jobs'
export SSHLOGIN1=sh@lo
(parallel -S $SSHLOGIN1 true ::: {1..20}; (parallel -S $SSHLOGIN1 true ::: {1..20};
echo No --controlmaster - finish last) & echo No --controlmaster - finish last) &
(parallel -M -S $SSHLOGIN1 true ::: {1..40}; (parallel -M -S $SSHLOGIN1 true ::: {1..40};

View file

@ -3,21 +3,24 @@
# #
# SPDX-License-Identifier: GPL-3.0-or-later # SPDX-License-Identifier: GPL-3.0-or-later
find {$TMPDIR,/var/tmp,/tmp}/{fif,tms,par[^a]}* -mmin -10 2>/dev/null | parallel rm cleanup() {
cd testsuite 2>/dev/null find {"$TMPDIR",/var/tmp,/tmp}/{fif,tms,par[^a]}* -mmin -10 -print0 2>/dev/null |
rm -rf tmp parallel -0 rm 2>/dev/null
mkdir tmp }
cd tmp
cleanup
touch ~/.parallel/will-cite touch ~/.parallel/will-cite
echo '### test parallel_tutorial' echo '### test parallel_tutorial'
rm -f /tmp/runs
srcdir=$(pwd | perl -pe 's=$ENV{HOME}==') pwd=$(pwd)
# If not run in dir parallel/testsuite: set testsuitedir to path of testsuite
testsuitedir=${testsuitedir:-$pwd}
srcdir=$(echo "$testsuitedir" | perl -pe 's=$ENV{HOME}==')
export SERVER1=parallel@lo export SERVER1=parallel@lo
export SERVER2=csh@lo export SERVER2=csh@lo
export PARALLEL=-k export PARALLEL=-k
perl -ne '$/="\n\n"; /^Output/../^[^O]\S/ and next; /^ / and print;' ../../src/parallel_tutorial.pod | perl -ne '$/="\n\n"; /^Output/../^[^O]\S/ and next; /^ / and print;' "$testsuitedir"/../src/parallel_tutorial.pod |
egrep -v 'curl|tty|parallel_tutorial|interactive|example.(com|net)|shellquote|works' | egrep -v 'curl|tty|parallel_tutorial|interactive|example.(com|net)|shellquote|works' |
perl -pe 's/username@//;s/user@//; perl -pe 's/username@//;s/user@//;
s/zenity/zenity --timeout=15/; s/zenity/zenity --timeout=15/;
@ -101,9 +104,14 @@ perl -ne '$/="\n\n"; /^Output/../^[^O]\S/ and next; /^ / and print;' ../../src/
s/doi.*=.*//; s/doi.*=.*//;
s/url.*= .*doi.org.*//; s/url.*= .*doi.org.*//;
s/.Feel free to use .nocite.*//; s/.Feel free to use .nocite.*//;
# tmpdir and files
s:/tmp/parallel-tutorial-tmpdir/par-job-\S+:script:g; s:/tmp/parallel-tutorial-tmpdir/par-job-\S+:script:g;
s:/tmp/par-job-\S+:script:g; s:/tmp/par-job-\S+:script:g;
s:par......par:tempfile:g;
s:^tempfile\n::g;
' | uniq ' | uniq
# 3+3 .par files (from --files), 1 .tms-file from tmux attach
find {$TMPDIR,/var/tmp,/tmp}/{fif,tms,par[^a]}* -mmin -10 2>/dev/null | wc -l echo "### 3+3 .par files (from --files), 1 .tms-file from tmux attach"
find {$TMPDIR,/var/tmp,/tmp}/{fif,tms,par[^a]}* -mmin -10 2>/dev/null | parallel rm find {"$TMPDIR",/var/tmp}/{fif,tms,par[^a]}* -mmin -10 -type f -print0 2>/dev/null |
parallel -0 grep . | sort
cleanup

View file

@ -7,6 +7,10 @@
start_centos3() { start_centos3() {
stdout ping -w 1 -c 1 centos3 >/dev/null || ( stdout ping -w 1 -c 1 centos3 >/dev/null || (
# Vagrant does not set the IP addr # Vagrant does not set the IP addr
pwd=$(pwd)
# If not run in dir parallel/testsuite: set testsuitedir to path of testsuite
testsuitedir=${testsuitedir:-$pwd}
cd "$testsuitedir"
cd testsuite/vagrant/tange/centos3/ 2>/dev/null cd testsuite/vagrant/tange/centos3/ 2>/dev/null
cd vagrant/tange/centos3/ 2>/dev/null cd vagrant/tange/centos3/ 2>/dev/null
cd ../vagrant/tange/centos3/ 2>/dev/null cd ../vagrant/tange/centos3/ 2>/dev/null
@ -55,6 +59,10 @@ compgen -A function | grep par_ | LC_ALL=C sort |
perl -pe 's:/usr/bin:/bin:g;' perl -pe 's:/usr/bin:/bin:g;'
( (
pwd=$(pwd)
# If not run in dir parallel/testsuite: set testsuitedir to path of testsuite
testsuitedir=${testsuitedir:-$pwd}
cd "$testsuitedir"
cd vagrant/tange/centos3/ cd vagrant/tange/centos3/
stdout vagrant suspend | stdout vagrant suspend |
grep -v '==> default: Saving VM state' | grep -v '==> default: Saving VM state' |

View file

@ -9,12 +9,12 @@ par_stdin() {
seq 10 | parallel --semaphore --id stdin wc seq 10 | parallel --semaphore --id stdin wc
seq 10 | parallel --semaphore --id stdin --fg wc seq 10 | parallel --semaphore --id stdin --fg wc
tmp=$(mktemp) tmp=$(mktemp)
seq 10 > $tmp seq 10 > "$tmp"
parallel -a $tmp --semaphore --id stdin wc parallel -a "$tmp" --semaphore --id stdin wc
parallel -a $tmp --semaphore --id stdin --fg wc parallel -a "$tmp" --semaphore --id stdin --fg wc
parallel --semaphore --id stdin --wait parallel --semaphore --id stdin --wait
# Should fail: More files are not supported # Should fail: More files are not supported
parallel -a $tmp -a $tmp --semaphore --id stdin --fg wc parallel -a "$tmp" -a "$tmp" --semaphore --id stdin --fg wc
} }
par_mutex() { par_mutex() {

View file

@ -64,16 +64,18 @@ echo "### Test sql:sql::alias"
sql sql:sql::sqlunittest "SELECT 'Yes it works' as 'Test sql:sql::alias';" sql sql:sql::sqlunittest "SELECT 'Yes it works' as 'Test sql:sql::alias';"
echo "### Test --noheaders --no-headers -n" echo "### Test --noheaders --no-headers -n"
sql -n :sqlunittest 'select * from unittest order by id' \ sql -n :sqlunittest 'select * from unittest order by id' |
| parallel -k --colsep '\t' echo {2} {1} parallel -k --colsep '\t' echo {2} {1}
sql --noheaders :sqlunittest 'select * from unittest order by id' \ sql --noheaders :sqlunittest 'select * from unittest order by id' |
| parallel -k --colsep '\t' echo {2} {1} parallel -k --colsep '\t' echo {2} {1}
sql --no-headers :sqlunittest 'select * from unittest order by id' \ sql --no-headers :sqlunittest 'select * from unittest order by id' |
| parallel -k --colsep '\t' echo {2} {1} parallel -k --colsep '\t' echo {2} {1}
echo "### Test --sep -s"; echo "### Test --sep -s";
sql --no-headers -s : pg:/// 'select 1,2' | parallel --colsep ':' echo {2} {1} sql --no-headers -s : pg:/// 'select 1,2' |
sql --no-headers --sep : pg:/// 'select 1,2' | parallel --colsep ':' echo {2} {1} parallel --colsep ':' echo {2} {1}
sql --no-headers --sep : pg:/// 'select 1,2' |
parallel --colsep ':' echo {2} {1}
echo "### Test --passthrough -p"; echo "### Test --passthrough -p";
sql -p -H :sqlunittest 'select * from unittest' sql -p -H :sqlunittest 'select * from unittest'
@ -101,7 +103,7 @@ sql --table-size :sqlunittest | wc -l
echo "### Test --debug" echo "### Test --debug"
sql --debug :sqlunittest "SELECT 'Yes it does' as 'Test if --debug works';" | sql --debug :sqlunittest "SELECT 'Yes it does' as 'Test if --debug works';" |
perl -pe 's:/tmp/sql01-tmpdir/...........sql:tmpfile:g' perl -pe 's:/tmp/...........sql:tmpfile:g'
echo "### Test --version -V" echo "### Test --version -V"
sql --version | wc sql --version | wc

View file

@ -6,7 +6,7 @@
par_sqlite() { par_sqlite() {
tmp=$(mktemp -d) tmp=$(mktemp -d)
cd $tmp cd "$tmp"
echo '### Test of sqlite' echo '### Test of sqlite'
for CMDSQL in sqlite sqlite3 ; do for CMDSQL in sqlite sqlite3 ; do
echo "Current command: $CMDSQL" echo "Current command: $CMDSQL"

View file

@ -10,7 +10,11 @@ SSHLOGIN1=$SSHUSER1@$SERVER1
mkdir -p tmp mkdir -p tmp
cd tmp cd tmp
tar xjf ../input-files/testdir.tar.bz2 pwd=$(pwd)
# If not run in dir parallel/testsuite: set testsuitedir to path of testsuite
testsuitedir=${testsuitedir:-$pwd}
tar xjf "$testsuitedir"/input-files/testdir.tar.bz2
#rsync -Ha --delete input-files/testdir/ tmp/ #rsync -Ha --delete input-files/testdir/ tmp/
#cd tmp #cd tmp

View file

@ -319,7 +319,7 @@ par_l0_is_l1 ### Because of --tollef -l, then -l0 == -l1, sorry
par_l0_is_l1 l0 1 par_l0_is_l1 l0 1
par_l0_is_l1 l0 2 par_l0_is_l1 l0 2
par_linebuffer_files ### bug #48658: --linebuffer --files par_linebuffer_files ### bug #48658: --linebuffer --files
par_linebuffer_files 10 par_linebuffer_files 20
par_link_files_as_only_arg bug #50685: single ::::+ does not work par_link_files_as_only_arg bug #50685: single ::::+ does not work
par_link_files_as_only_arg 1 1 1 par_link_files_as_only_arg 1 1 1
par_link_files_as_only_arg 2 2 2 par_link_files_as_only_arg 2 2 2
@ -692,7 +692,8 @@ par_pipe_tag_v foo cat
par_pipe_tag_v foo 1 par_pipe_tag_v foo 1
par_pipe_tag_v foo 2 par_pipe_tag_v foo 2
par_pipe_tag_v foo 3 par_pipe_tag_v foo 3
par_pipe_tag_v foo /tmp/tmpfile.par par_pipe_tag_v foo /tmp/parallel-local-0.3s-tmp/
par_pipe_tag_v </tmp/tmpfile.par
par_pipe_to_func ### bug #45998: --pipe to function broken par_pipe_to_func ### bug #45998: --pipe to function broken
par_pipe_to_func 1 par_pipe_to_func 1
par_pipe_to_func pipefunc OK par_pipe_to_func pipefunc OK
@ -1355,19 +1356,25 @@ par_version 11
par_wd_3dot_local bug #45993: --wd ... should also work when run locally par_wd_3dot_local bug #45993: --wd ... should also work when run locally
par_wd_3dot_local parallel: Error: Cannot change into non-executable dir /bi: No such file or directory par_wd_3dot_local parallel: Error: Cannot change into non-executable dir /bi: No such file or directory
par_wd_3dot_local /bin par_wd_3dot_local /bin
par_wd_3dot_local ~/privat/parallel/testsuite par_wd_3dot_local /tmp/parallel-local-0.0s-tmp/
par_wd_3dot_local </tmp
par_wd_3dot_local OK par_wd_3dot_local OK
par_wd_3dot_local / par_wd_3dot_local /
par_wd_3dot_local ~/privat/parallel/testsuite par_wd_3dot_local /tmp/parallel-local-0.0s-tmp/
par_wd_3dot_local </tmp
par_wd_3dot_local OK par_wd_3dot_local OK
par_wd_3dot_local /tmp par_wd_3dot_local /tmp
par_wd_3dot_local ~/privat/parallel/testsuite par_wd_3dot_local /tmp/parallel-local-0.0s-tmp/
par_wd_3dot_local </tmp
par_wd_3dot_local OK par_wd_3dot_local OK
par_wd_3dot_local ~/.parallel/tmp/hostname-0-0 par_wd_3dot_local ~/.parallel/tmp/hostname-0-0
par_wd_3dot_local ~/privat/parallel/testsuite par_wd_3dot_local /tmp/parallel-local-0.0s-tmp/
par_wd_3dot_local </tmp
par_wd_3dot_local OK par_wd_3dot_local OK
par_wd_3dot_local ~/privat/parallel/testsuite par_wd_3dot_local /tmp/parallel-local-0.0s-tmp/
par_wd_3dot_local ~/privat/parallel/testsuite par_wd_3dot_local </tmp
par_wd_3dot_local /tmp/parallel-local-0.0s-tmp/
par_wd_3dot_local </tmp
par_wd_3dot_local OK par_wd_3dot_local OK
par_wd_dotdotdot ### parallel --wd ... should clean up par_wd_dotdotdot ### parallel --wd ... should clean up
par_wd_dotdotdot 1 == 1 par_wd_dotdotdot 1 == 1

File diff suppressed because it is too large Load diff

View file

@ -126,13 +126,18 @@ par_eof_on_command_line_input_source foo
par_file_rpl ### file as replacement string par_file_rpl ### file as replacement string
par_file_rpl contest1 par_file_rpl contest1
par_file_rpl contest2 par_file_rpl contest2
par_file_rpl File name /tmp/parallel-local-1s-tmpdir/tmp.XXXXXX par_file_rpl File name /tmp/parallel-local-1s-tmp/
par_file_rpl </tmp/tmp.XXXXXX
par_file_rpl contest1 par_file_rpl contest1
par_file_rpl contest2 par_file_rpl contest2
par_file_rpl File name /parallel-local-1s-tmpdir/tmp.XXXXXX/parallel-local-1s-tmpdir/tmp.XXXXXX par_file_rpl File name /parallel-local-1s-tmp/
par_file_rpl </tmp/tmp.XXXXXX/parallel-local-1s-tmp/
par_file_rpl </parallel-local-1s-tmp/
par_file_rpl </tmp/tmp.XXXXXX/tmp.XXXXXX
par_file_rpl contest1 par_file_rpl contest1
par_file_rpl contest2 par_file_rpl contest2
par_file_rpl File name /tmp/parallel-local-1s-tmpdir/tmp.XXXXXX par_file_rpl File name /tmp/parallel-local-1s-tmp/
par_file_rpl </tmp/tmp.XXXXXX
par_file_rpl 1 par_file_rpl 1
par_file_rpl 1 par_file_rpl 1
par_file_rpl 2 par_file_rpl 2
@ -487,7 +492,8 @@ par_profiles_with_space ### bug #42902: profiles containing arguments with space
par_profiles_with_space /bin/bash=/bin/bash par_profiles_with_space /bin/bash=/bin/bash
par_profiles_with_space echo '/bin/bash=/bin/bash' par_profiles_with_space echo '/bin/bash=/bin/bash'
par_profiles_with_space /bin/bash=/bin/bash par_profiles_with_space /bin/bash=/bin/bash
par_profiles_with_space With script in $PARALLEL /bin/bash=~/privat/parallel/testsuite par_profiles_with_space With script in $PARALLEL /bin/bash=/tmp/parallel-local-1s-tmp/
par_profiles_with_space </tmp
par_pxz_complains bug #44250: pxz complains File format not recognized but decompresses anyway par_pxz_complains bug #44250: pxz complains File format not recognized but decompresses anyway
par_pxz_complains ls: cannot access '/OK-if-missing-file': No such file or directory par_pxz_complains ls: cannot access '/OK-if-missing-file': No such file or directory
par_pxz_complains can not seek in input: Illegal seek par_pxz_complains can not seek in input: Illegal seek

View file

@ -646,15 +646,15 @@ par_shebang pl C
par_shebang py A par_shebang py A
par_shebang py B par_shebang py B
par_shebang py C par_shebang py C
par_shebang r [1] "A"
par_shebang r [1] "B"
par_shebang r [1] "C"
par_shebang rb ["A"] par_shebang rb ["A"]
par_shebang rb ["B"] par_shebang rb ["B"]
par_shebang rb ["C"] par_shebang rb ["C"]
par_shebang sh A par_shebang sh A
par_shebang sh B par_shebang sh B
par_shebang sh C par_shebang sh C
par_shebang r [1] "A"
par_shebang r [1] "B"
par_shebang r [1] "C"
par_show_limits ### Test --show-limits par_show_limits ### Test --show-limits
par_show_limits Maximal size of command: 130xxx par_show_limits Maximal size of command: 130xxx
par_show_limits Maximal usable size of command: 63xxx par_show_limits Maximal usable size of command: 63xxx

View file

@ -96,4 +96,5 @@ par_print_before_halt_on_error 2 perl -e 'sleep 1; sleep $ARGV[0]; print STDERR
par_sem_dir ### bug #58985: sem stall if .parallel/semaphores is chmod 0 par_sem_dir ### bug #58985: sem stall if .parallel/semaphores is chmod 0
par_sem_dir parallel: Error: Semaphoredir must be writable: '~/.parallel/semaphores' par_sem_dir parallel: Error: Semaphoredir must be writable: '~/.parallel/semaphores'
par_tmux_termination ### --tmux test - check termination par_tmux_termination ### --tmux test - check termination
par_tmux_termination See output with: tmux -S /tmp/parallel-local-race01-tmpdir/tmsXXXXX attach par_tmux_termination See output with: tmux -S '/tmp/parallel-local-race01-tmp/
par_tmux_termination </tmp/tmsXXXXX' attach

View file

@ -43,12 +43,6 @@ par_continuous_output 1
par_continuous_output 1 par_continuous_output 1
par_hostgroup ### --hostgroup force ncpu par_hostgroup ### --hostgroup force ncpu
par_hostgroup parallel par_hostgroup parallel
par_hostgroup parallel
par_hostgroup tange
par_hostgroup tange
par_hostgroup tange
par_hostgroup tange
par_hostgroup tange
par_hostgroup tange par_hostgroup tange
par_hostgroup ### --hostgroup two group arg par_hostgroup ### --hostgroup two group arg
par_hostgroup parallel par_hostgroup parallel
@ -70,12 +64,6 @@ par_hostgroup tange
par_hostgroup tange par_hostgroup tange
par_hostgroup ### --hostgroup multiple group arg + unused group par_hostgroup ### --hostgroup multiple group arg + unused group
par_hostgroup parallel par_hostgroup parallel
par_hostgroup parallel
par_hostgroup tange
par_hostgroup tange
par_hostgroup tange
par_hostgroup tange
par_hostgroup tange
par_hostgroup tange par_hostgroup tange
par_hostgroup ### --hostgroup two groups @ par_hostgroup ### --hostgroup two groups @
par_hostgroup parallel parallel par_hostgroup parallel parallel
@ -91,10 +79,6 @@ par_hostgroup no_group
par_hostgroup implicit_group par_hostgroup implicit_group
par_hostgroup ### --hostgroup -S @group par_hostgroup ### --hostgroup -S @group
par_hostgroup tange par_hostgroup tange
par_hostgroup tange
par_hostgroup tange
par_hostgroup tcsh
par_hostgroup tcsh
par_hostgroup tcsh par_hostgroup tcsh
par_hostgroup ### --hostgroup -S @group1 -Sgrp2 par_hostgroup ### --hostgroup -S @group1 -Sgrp2
par_hostgroup parallel par_hostgroup parallel
@ -163,6 +147,14 @@ par_retries_bug_from_2010 4
par_retries_bug_from_2010 4 par_retries_bug_from_2010 4
par_retries_bug_from_2010 4 par_retries_bug_from_2010 4
par_retries_bug_from_2010 2 par_retries_bug_from_2010 2
par_semaphore ### Test if parallel invoked as sem will run parallel --semaphore
par_semaphore job1a 1
par_semaphore job2a 2
par_semaphore job1b 3
par_semaphore job3a 4
par_semaphore job2b 5
par_semaphore job3b 6
par_semaphore done
par_sql_CSV ### CSV write to the right place par_sql_CSV ### CSV write to the right place
par_sql_CSV ran OK par_sql_CSV ran OK
par_sql_CSV ok par_sql_CSV ok

View file

@ -332,31 +332,31 @@ par_shuf $MYSQL OK: Diff bigger than 2500 char
par_shuf $MYSQL Exit=0 par_shuf $MYSQL Exit=0
par_shuf $MYSQL Exit=0 par_shuf $MYSQL Exit=0
par_shuf $MYSQL Command V1 V2 Stdout Stderr par_shuf $MYSQL Command V1 V2 Stdout Stderr
par_shuf $MYSQL sleep .3;echo 1 a 1 a /tmp/parallel-bug49791-c20/1/1/2/a/stdout /tmp/parallel-bug49791-c20/1/1/2/a/stderr par_shuf $MYSQL sleep .3;echo 1 a 1 a /tmp/parallel-bug49791- <c20/1/1/2/a/stdout /tmp/parallel-bug49791- <c20/1/1/2/a/stderr
par_shuf $MYSQL sleep .3;echo 1 b 1 b /tmp/parallel-bug49791-c20/1/1/2/b/stdout /tmp/parallel-bug49791-c20/1/1/2/b/stderr par_shuf $MYSQL sleep .3;echo 1 b 1 b /tmp/parallel-bug49791- <c20/1/1/2/b/stdout /tmp/parallel-bug49791- <c20/1/1/2/b/stderr
par_shuf $MYSQL sleep .3;echo 1 c 1 c /tmp/parallel-bug49791-c20/1/1/2/c/stdout /tmp/parallel-bug49791-c20/1/1/2/c/stderr par_shuf $MYSQL sleep .3;echo 1 c 1 c /tmp/parallel-bug49791- <c20/1/1/2/c/stdout /tmp/parallel-bug49791- <c20/1/1/2/c/stderr
par_shuf $MYSQL sleep .3;echo 1 d 1 d /tmp/parallel-bug49791-c20/1/1/2/d/stdout /tmp/parallel-bug49791-c20/1/1/2/d/stderr par_shuf $MYSQL sleep .3;echo 1 d 1 d /tmp/parallel-bug49791- <c20/1/1/2/d/stdout /tmp/parallel-bug49791- <c20/1/1/2/d/stderr
par_shuf $MYSQL sleep .3;echo 1 e 1 e /tmp/parallel-bug49791-c20/1/1/2/e/stdout /tmp/parallel-bug49791-c20/1/1/2/e/stderr par_shuf $MYSQL sleep .3;echo 1 e 1 e /tmp/parallel-bug49791- <c20/1/1/2/e/stdout /tmp/parallel-bug49791- <c20/1/1/2/e/stderr
par_shuf $MYSQL sleep .3;echo 2 a 2 a /tmp/parallel-bug49791-c20/1/2/2/a/stdout /tmp/parallel-bug49791-c20/1/2/2/a/stderr par_shuf $MYSQL sleep .3;echo 2 a 2 a /tmp/parallel-bug49791- <c20/1/2/2/a/stdout /tmp/parallel-bug49791- <c20/1/2/2/a/stderr
par_shuf $MYSQL sleep .3;echo 2 b 2 b /tmp/parallel-bug49791-c20/1/2/2/b/stdout /tmp/parallel-bug49791-c20/1/2/2/b/stderr par_shuf $MYSQL sleep .3;echo 2 b 2 b /tmp/parallel-bug49791- <c20/1/2/2/b/stdout /tmp/parallel-bug49791- <c20/1/2/2/b/stderr
par_shuf $MYSQL sleep .3;echo 2 c 2 c /tmp/parallel-bug49791-c20/1/2/2/c/stdout /tmp/parallel-bug49791-c20/1/2/2/c/stderr par_shuf $MYSQL sleep .3;echo 2 c 2 c /tmp/parallel-bug49791- <c20/1/2/2/c/stdout /tmp/parallel-bug49791- <c20/1/2/2/c/stderr
par_shuf $MYSQL sleep .3;echo 2 d 2 d /tmp/parallel-bug49791-c20/1/2/2/d/stdout /tmp/parallel-bug49791-c20/1/2/2/d/stderr par_shuf $MYSQL sleep .3;echo 2 d 2 d /tmp/parallel-bug49791- <c20/1/2/2/d/stdout /tmp/parallel-bug49791- <c20/1/2/2/d/stderr
par_shuf $MYSQL sleep .3;echo 2 e 2 e /tmp/parallel-bug49791-c20/1/2/2/e/stdout /tmp/parallel-bug49791-c20/1/2/2/e/stderr par_shuf $MYSQL sleep .3;echo 2 e 2 e /tmp/parallel-bug49791- <c20/1/2/2/e/stdout /tmp/parallel-bug49791- <c20/1/2/2/e/stderr
par_shuf $MYSQL sleep .3;echo 3 a 3 a /tmp/parallel-bug49791-c20/1/3/2/a/stdout /tmp/parallel-bug49791-c20/1/3/2/a/stderr par_shuf $MYSQL sleep .3;echo 3 a 3 a /tmp/parallel-bug49791- <c20/1/3/2/a/stdout /tmp/parallel-bug49791- <c20/1/3/2/a/stderr
par_shuf $MYSQL sleep .3;echo 3 b 3 b /tmp/parallel-bug49791-c20/1/3/2/b/stdout /tmp/parallel-bug49791-c20/1/3/2/b/stderr par_shuf $MYSQL sleep .3;echo 3 b 3 b /tmp/parallel-bug49791- <c20/1/3/2/b/stdout /tmp/parallel-bug49791- <c20/1/3/2/b/stderr
par_shuf $MYSQL sleep .3;echo 3 c 3 c /tmp/parallel-bug49791-c20/1/3/2/c/stdout /tmp/parallel-bug49791-c20/1/3/2/c/stderr par_shuf $MYSQL sleep .3;echo 3 c 3 c /tmp/parallel-bug49791- <c20/1/3/2/c/stdout /tmp/parallel-bug49791- <c20/1/3/2/c/stderr
par_shuf $MYSQL sleep .3;echo 3 d 3 d /tmp/parallel-bug49791-c20/1/3/2/d/stdout /tmp/parallel-bug49791-c20/1/3/2/d/stderr par_shuf $MYSQL sleep .3;echo 3 d 3 d /tmp/parallel-bug49791- <c20/1/3/2/d/stdout /tmp/parallel-bug49791- <c20/1/3/2/d/stderr
par_shuf $MYSQL sleep .3;echo 3 e 3 e /tmp/parallel-bug49791-c20/1/3/2/e/stdout /tmp/parallel-bug49791-c20/1/3/2/e/stderr par_shuf $MYSQL sleep .3;echo 3 e 3 e /tmp/parallel-bug49791- <c20/1/3/2/e/stdout /tmp/parallel-bug49791- <c20/1/3/2/e/stderr
par_shuf $MYSQL sleep .3;echo 4 a 4 a /tmp/parallel-bug49791-c20/1/4/2/a/stdout /tmp/parallel-bug49791-c20/1/4/2/a/stderr par_shuf $MYSQL sleep .3;echo 4 a 4 a /tmp/parallel-bug49791- <c20/1/4/2/a/stdout /tmp/parallel-bug49791- <c20/1/4/2/a/stderr
par_shuf $MYSQL sleep .3;echo 4 b 4 b /tmp/parallel-bug49791-c20/1/4/2/b/stdout /tmp/parallel-bug49791-c20/1/4/2/b/stderr par_shuf $MYSQL sleep .3;echo 4 b 4 b /tmp/parallel-bug49791- <c20/1/4/2/b/stdout /tmp/parallel-bug49791- <c20/1/4/2/b/stderr
par_shuf $MYSQL sleep .3;echo 4 c 4 c /tmp/parallel-bug49791-c20/1/4/2/c/stdout /tmp/parallel-bug49791-c20/1/4/2/c/stderr par_shuf $MYSQL sleep .3;echo 4 c 4 c /tmp/parallel-bug49791- <c20/1/4/2/c/stdout /tmp/parallel-bug49791- <c20/1/4/2/c/stderr
par_shuf $MYSQL sleep .3;echo 4 d 4 d /tmp/parallel-bug49791-c20/1/4/2/d/stdout /tmp/parallel-bug49791-c20/1/4/2/d/stderr par_shuf $MYSQL sleep .3;echo 4 d 4 d /tmp/parallel-bug49791- <c20/1/4/2/d/stdout /tmp/parallel-bug49791- <c20/1/4/2/d/stderr
par_shuf $MYSQL sleep .3;echo 4 e 4 e /tmp/parallel-bug49791-c20/1/4/2/e/stdout /tmp/parallel-bug49791-c20/1/4/2/e/stderr par_shuf $MYSQL sleep .3;echo 4 e 4 e /tmp/parallel-bug49791- <c20/1/4/2/e/stdout /tmp/parallel-bug49791- <c20/1/4/2/e/stderr
par_shuf $MYSQL sleep .3;echo 5 a 5 a /tmp/parallel-bug49791-c20/1/5/2/a/stdout /tmp/parallel-bug49791-c20/1/5/2/a/stderr par_shuf $MYSQL sleep .3;echo 5 a 5 a /tmp/parallel-bug49791- <c20/1/5/2/a/stdout /tmp/parallel-bug49791- <c20/1/5/2/a/stderr
par_shuf $MYSQL sleep .3;echo 5 b 5 b /tmp/parallel-bug49791-c20/1/5/2/b/stdout /tmp/parallel-bug49791-c20/1/5/2/b/stderr par_shuf $MYSQL sleep .3;echo 5 b 5 b /tmp/parallel-bug49791- <c20/1/5/2/b/stdout /tmp/parallel-bug49791- <c20/1/5/2/b/stderr
par_shuf $MYSQL sleep .3;echo 5 c 5 c /tmp/parallel-bug49791-c20/1/5/2/c/stdout /tmp/parallel-bug49791-c20/1/5/2/c/stderr par_shuf $MYSQL sleep .3;echo 5 c 5 c /tmp/parallel-bug49791- <c20/1/5/2/c/stdout /tmp/parallel-bug49791- <c20/1/5/2/c/stderr
par_shuf $MYSQL sleep .3;echo 5 d 5 d /tmp/parallel-bug49791-c20/1/5/2/d/stdout /tmp/parallel-bug49791-c20/1/5/2/d/stderr par_shuf $MYSQL sleep .3;echo 5 d 5 d /tmp/parallel-bug49791- <c20/1/5/2/d/stdout /tmp/parallel-bug49791- <c20/1/5/2/d/stderr
par_shuf $MYSQL sleep .3;echo 5 e 5 e /tmp/parallel-bug49791-c20/1/5/2/e/stdout /tmp/parallel-bug49791-c20/1/5/2/e/stderr par_shuf $MYSQL sleep .3;echo 5 e 5 e /tmp/parallel-bug49791- <c20/1/5/2/e/stdout /tmp/parallel-bug49791- <c20/1/5/2/e/stderr
par_shuf $PG p_wrapper par_shuf '$PG' par_shuf $PG p_wrapper par_shuf '$PG'
par_shuf $PG 1 a par_shuf $PG 1 a
par_shuf $PG 1 b par_shuf $PG 1 b
@ -386,33 +386,33 @@ par_shuf $PG 5 e
par_shuf $PG OK: Diff bigger than 2500 char par_shuf $PG OK: Diff bigger than 2500 char
par_shuf $PG Exit=0 par_shuf $PG Exit=0
par_shuf $PG Exit=0 par_shuf $PG Exit=0
par_shuf $PG command | v1 | v2 | stdout | stderr par_shuf $PG command | v1 | v2 | stdout | stderr
par_shuf $PG -------------------+----+----+-------------------------------------------+------------------------------------------- par_shuf $PG -------------------+----+----+----------------------------------------------+----------------------------------------------
par_shuf $PG sleep .3;echo 1 a | 1 | a | /tmp/parallel-bug49791-792/1/1/2/a/stdout | /tmp/parallel-bug49791-792/1/1/2/a/stderr par_shuf $PG sleep .3;echo 1 a | 1 | a | /tmp/parallel-bug49791- <792/1/1/2/a/stdout | /tmp/parallel-bug49791- <792/1/1/2/a/stderr
par_shuf $PG sleep .3;echo 1 b | 1 | b | /tmp/parallel-bug49791-792/1/1/2/b/stdout | /tmp/parallel-bug49791-792/1/1/2/b/stderr par_shuf $PG sleep .3;echo 1 b | 1 | b | /tmp/parallel-bug49791- <792/1/1/2/b/stdout | /tmp/parallel-bug49791- <792/1/1/2/b/stderr
par_shuf $PG sleep .3;echo 1 c | 1 | c | /tmp/parallel-bug49791-792/1/1/2/c/stdout | /tmp/parallel-bug49791-792/1/1/2/c/stderr par_shuf $PG sleep .3;echo 1 c | 1 | c | /tmp/parallel-bug49791- <792/1/1/2/c/stdout | /tmp/parallel-bug49791- <792/1/1/2/c/stderr
par_shuf $PG sleep .3;echo 1 d | 1 | d | /tmp/parallel-bug49791-792/1/1/2/d/stdout | /tmp/parallel-bug49791-792/1/1/2/d/stderr par_shuf $PG sleep .3;echo 1 d | 1 | d | /tmp/parallel-bug49791- <792/1/1/2/d/stdout | /tmp/parallel-bug49791- <792/1/1/2/d/stderr
par_shuf $PG sleep .3;echo 1 e | 1 | e | /tmp/parallel-bug49791-792/1/1/2/e/stdout | /tmp/parallel-bug49791-792/1/1/2/e/stderr par_shuf $PG sleep .3;echo 1 e | 1 | e | /tmp/parallel-bug49791- <792/1/1/2/e/stdout | /tmp/parallel-bug49791- <792/1/1/2/e/stderr
par_shuf $PG sleep .3;echo 2 a | 2 | a | /tmp/parallel-bug49791-792/1/2/2/a/stdout | /tmp/parallel-bug49791-792/1/2/2/a/stderr par_shuf $PG sleep .3;echo 2 a | 2 | a | /tmp/parallel-bug49791- <792/1/2/2/a/stdout | /tmp/parallel-bug49791- <792/1/2/2/a/stderr
par_shuf $PG sleep .3;echo 2 b | 2 | b | /tmp/parallel-bug49791-792/1/2/2/b/stdout | /tmp/parallel-bug49791-792/1/2/2/b/stderr par_shuf $PG sleep .3;echo 2 b | 2 | b | /tmp/parallel-bug49791- <792/1/2/2/b/stdout | /tmp/parallel-bug49791- <792/1/2/2/b/stderr
par_shuf $PG sleep .3;echo 2 c | 2 | c | /tmp/parallel-bug49791-792/1/2/2/c/stdout | /tmp/parallel-bug49791-792/1/2/2/c/stderr par_shuf $PG sleep .3;echo 2 c | 2 | c | /tmp/parallel-bug49791- <792/1/2/2/c/stdout | /tmp/parallel-bug49791- <792/1/2/2/c/stderr
par_shuf $PG sleep .3;echo 2 d | 2 | d | /tmp/parallel-bug49791-792/1/2/2/d/stdout | /tmp/parallel-bug49791-792/1/2/2/d/stderr par_shuf $PG sleep .3;echo 2 d | 2 | d | /tmp/parallel-bug49791- <792/1/2/2/d/stdout | /tmp/parallel-bug49791- <792/1/2/2/d/stderr
par_shuf $PG sleep .3;echo 2 e | 2 | e | /tmp/parallel-bug49791-792/1/2/2/e/stdout | /tmp/parallel-bug49791-792/1/2/2/e/stderr par_shuf $PG sleep .3;echo 2 e | 2 | e | /tmp/parallel-bug49791- <792/1/2/2/e/stdout | /tmp/parallel-bug49791- <792/1/2/2/e/stderr
par_shuf $PG sleep .3;echo 3 a | 3 | a | /tmp/parallel-bug49791-792/1/3/2/a/stdout | /tmp/parallel-bug49791-792/1/3/2/a/stderr par_shuf $PG sleep .3;echo 3 a | 3 | a | /tmp/parallel-bug49791- <792/1/3/2/a/stdout | /tmp/parallel-bug49791- <792/1/3/2/a/stderr
par_shuf $PG sleep .3;echo 3 b | 3 | b | /tmp/parallel-bug49791-792/1/3/2/b/stdout | /tmp/parallel-bug49791-792/1/3/2/b/stderr par_shuf $PG sleep .3;echo 3 b | 3 | b | /tmp/parallel-bug49791- <792/1/3/2/b/stdout | /tmp/parallel-bug49791- <792/1/3/2/b/stderr
par_shuf $PG sleep .3;echo 3 c | 3 | c | /tmp/parallel-bug49791-792/1/3/2/c/stdout | /tmp/parallel-bug49791-792/1/3/2/c/stderr par_shuf $PG sleep .3;echo 3 c | 3 | c | /tmp/parallel-bug49791- <792/1/3/2/c/stdout | /tmp/parallel-bug49791- <792/1/3/2/c/stderr
par_shuf $PG sleep .3;echo 3 d | 3 | d | /tmp/parallel-bug49791-792/1/3/2/d/stdout | /tmp/parallel-bug49791-792/1/3/2/d/stderr par_shuf $PG sleep .3;echo 3 d | 3 | d | /tmp/parallel-bug49791- <792/1/3/2/d/stdout | /tmp/parallel-bug49791- <792/1/3/2/d/stderr
par_shuf $PG sleep .3;echo 3 e | 3 | e | /tmp/parallel-bug49791-792/1/3/2/e/stdout | /tmp/parallel-bug49791-792/1/3/2/e/stderr par_shuf $PG sleep .3;echo 3 e | 3 | e | /tmp/parallel-bug49791- <792/1/3/2/e/stdout | /tmp/parallel-bug49791- <792/1/3/2/e/stderr
par_shuf $PG sleep .3;echo 4 a | 4 | a | /tmp/parallel-bug49791-792/1/4/2/a/stdout | /tmp/parallel-bug49791-792/1/4/2/a/stderr par_shuf $PG sleep .3;echo 4 a | 4 | a | /tmp/parallel-bug49791- <792/1/4/2/a/stdout | /tmp/parallel-bug49791- <792/1/4/2/a/stderr
par_shuf $PG sleep .3;echo 4 b | 4 | b | /tmp/parallel-bug49791-792/1/4/2/b/stdout | /tmp/parallel-bug49791-792/1/4/2/b/stderr par_shuf $PG sleep .3;echo 4 b | 4 | b | /tmp/parallel-bug49791- <792/1/4/2/b/stdout | /tmp/parallel-bug49791- <792/1/4/2/b/stderr
par_shuf $PG sleep .3;echo 4 c | 4 | c | /tmp/parallel-bug49791-792/1/4/2/c/stdout | /tmp/parallel-bug49791-792/1/4/2/c/stderr par_shuf $PG sleep .3;echo 4 c | 4 | c | /tmp/parallel-bug49791- <792/1/4/2/c/stdout | /tmp/parallel-bug49791- <792/1/4/2/c/stderr
par_shuf $PG sleep .3;echo 4 d | 4 | d | /tmp/parallel-bug49791-792/1/4/2/d/stdout | /tmp/parallel-bug49791-792/1/4/2/d/stderr par_shuf $PG sleep .3;echo 4 d | 4 | d | /tmp/parallel-bug49791- <792/1/4/2/d/stdout | /tmp/parallel-bug49791- <792/1/4/2/d/stderr
par_shuf $PG sleep .3;echo 4 e | 4 | e | /tmp/parallel-bug49791-792/1/4/2/e/stdout | /tmp/parallel-bug49791-792/1/4/2/e/stderr par_shuf $PG sleep .3;echo 4 e | 4 | e | /tmp/parallel-bug49791- <792/1/4/2/e/stdout | /tmp/parallel-bug49791- <792/1/4/2/e/stderr
par_shuf $PG sleep .3;echo 5 a | 5 | a | /tmp/parallel-bug49791-792/1/5/2/a/stdout | /tmp/parallel-bug49791-792/1/5/2/a/stderr par_shuf $PG sleep .3;echo 5 a | 5 | a | /tmp/parallel-bug49791- <792/1/5/2/a/stdout | /tmp/parallel-bug49791- <792/1/5/2/a/stderr
par_shuf $PG sleep .3;echo 5 b | 5 | b | /tmp/parallel-bug49791-792/1/5/2/b/stdout | /tmp/parallel-bug49791-792/1/5/2/b/stderr par_shuf $PG sleep .3;echo 5 b | 5 | b | /tmp/parallel-bug49791- <792/1/5/2/b/stdout | /tmp/parallel-bug49791- <792/1/5/2/b/stderr
par_shuf $PG sleep .3;echo 5 c | 5 | c | /tmp/parallel-bug49791-792/1/5/2/c/stdout | /tmp/parallel-bug49791-792/1/5/2/c/stderr par_shuf $PG sleep .3;echo 5 c | 5 | c | /tmp/parallel-bug49791- <792/1/5/2/c/stdout | /tmp/parallel-bug49791- <792/1/5/2/c/stderr
par_shuf $PG sleep .3;echo 5 d | 5 | d | /tmp/parallel-bug49791-792/1/5/2/d/stdout | /tmp/parallel-bug49791-792/1/5/2/d/stderr par_shuf $PG sleep .3;echo 5 d | 5 | d | /tmp/parallel-bug49791- <792/1/5/2/d/stdout | /tmp/parallel-bug49791- <792/1/5/2/d/stderr
par_shuf $PG sleep .3;echo 5 e | 5 | e | /tmp/parallel-bug49791-792/1/5/2/e/stdout | /tmp/parallel-bug49791-792/1/5/2/e/stderr par_shuf $PG sleep .3;echo 5 e | 5 | e | /tmp/parallel-bug49791- <792/1/5/2/e/stdout | /tmp/parallel-bug49791- <792/1/5/2/e/stderr
par_shuf $PG (25 rows) par_shuf $PG (25 rows)
par_shuf $PG par_shuf $PG
par_shuf $SQLITE p_wrapper par_shuf '$SQLITE' par_shuf $SQLITE p_wrapper par_shuf '$SQLITE'
@ -445,31 +445,31 @@ par_shuf $SQLITE OK: Diff bigger than 2500 char
par_shuf $SQLITE Exit=0 par_shuf $SQLITE Exit=0
par_shuf $SQLITE Exit=0 par_shuf $SQLITE Exit=0
par_shuf $SQLITE Command|V1|V2|Stdout|Stderr par_shuf $SQLITE Command|V1|V2|Stdout|Stderr
par_shuf $SQLITE sleep .3;echo 1 a|1|a|/tmp/parallel-bug49791-932/1/1/2/a/stdout|/tmp/parallel-bug49791-932/1/1/2/a/stderr par_shuf $SQLITE sleep .3;echo 1 a|1|a|/tmp/parallel-bug49791- <932/1/1/2/a/stdout|/tmp/parallel-bug49791- <932/1/1/2/a/stderr
par_shuf $SQLITE sleep .3;echo 1 b|1|b|/tmp/parallel-bug49791-932/1/1/2/b/stdout|/tmp/parallel-bug49791-932/1/1/2/b/stderr par_shuf $SQLITE sleep .3;echo 1 b|1|b|/tmp/parallel-bug49791- <932/1/1/2/b/stdout|/tmp/parallel-bug49791- <932/1/1/2/b/stderr
par_shuf $SQLITE sleep .3;echo 1 c|1|c|/tmp/parallel-bug49791-932/1/1/2/c/stdout|/tmp/parallel-bug49791-932/1/1/2/c/stderr par_shuf $SQLITE sleep .3;echo 1 c|1|c|/tmp/parallel-bug49791- <932/1/1/2/c/stdout|/tmp/parallel-bug49791- <932/1/1/2/c/stderr
par_shuf $SQLITE sleep .3;echo 1 d|1|d|/tmp/parallel-bug49791-932/1/1/2/d/stdout|/tmp/parallel-bug49791-932/1/1/2/d/stderr par_shuf $SQLITE sleep .3;echo 1 d|1|d|/tmp/parallel-bug49791- <932/1/1/2/d/stdout|/tmp/parallel-bug49791- <932/1/1/2/d/stderr
par_shuf $SQLITE sleep .3;echo 1 e|1|e|/tmp/parallel-bug49791-932/1/1/2/e/stdout|/tmp/parallel-bug49791-932/1/1/2/e/stderr par_shuf $SQLITE sleep .3;echo 1 e|1|e|/tmp/parallel-bug49791- <932/1/1/2/e/stdout|/tmp/parallel-bug49791- <932/1/1/2/e/stderr
par_shuf $SQLITE sleep .3;echo 2 a|2|a|/tmp/parallel-bug49791-932/1/2/2/a/stdout|/tmp/parallel-bug49791-932/1/2/2/a/stderr par_shuf $SQLITE sleep .3;echo 2 a|2|a|/tmp/parallel-bug49791- <932/1/2/2/a/stdout|/tmp/parallel-bug49791- <932/1/2/2/a/stderr
par_shuf $SQLITE sleep .3;echo 2 b|2|b|/tmp/parallel-bug49791-932/1/2/2/b/stdout|/tmp/parallel-bug49791-932/1/2/2/b/stderr par_shuf $SQLITE sleep .3;echo 2 b|2|b|/tmp/parallel-bug49791- <932/1/2/2/b/stdout|/tmp/parallel-bug49791- <932/1/2/2/b/stderr
par_shuf $SQLITE sleep .3;echo 2 c|2|c|/tmp/parallel-bug49791-932/1/2/2/c/stdout|/tmp/parallel-bug49791-932/1/2/2/c/stderr par_shuf $SQLITE sleep .3;echo 2 c|2|c|/tmp/parallel-bug49791- <932/1/2/2/c/stdout|/tmp/parallel-bug49791- <932/1/2/2/c/stderr
par_shuf $SQLITE sleep .3;echo 2 d|2|d|/tmp/parallel-bug49791-932/1/2/2/d/stdout|/tmp/parallel-bug49791-932/1/2/2/d/stderr par_shuf $SQLITE sleep .3;echo 2 d|2|d|/tmp/parallel-bug49791- <932/1/2/2/d/stdout|/tmp/parallel-bug49791- <932/1/2/2/d/stderr
par_shuf $SQLITE sleep .3;echo 2 e|2|e|/tmp/parallel-bug49791-932/1/2/2/e/stdout|/tmp/parallel-bug49791-932/1/2/2/e/stderr par_shuf $SQLITE sleep .3;echo 2 e|2|e|/tmp/parallel-bug49791- <932/1/2/2/e/stdout|/tmp/parallel-bug49791- <932/1/2/2/e/stderr
par_shuf $SQLITE sleep .3;echo 3 a|3|a|/tmp/parallel-bug49791-932/1/3/2/a/stdout|/tmp/parallel-bug49791-932/1/3/2/a/stderr par_shuf $SQLITE sleep .3;echo 3 a|3|a|/tmp/parallel-bug49791- <932/1/3/2/a/stdout|/tmp/parallel-bug49791- <932/1/3/2/a/stderr
par_shuf $SQLITE sleep .3;echo 3 b|3|b|/tmp/parallel-bug49791-932/1/3/2/b/stdout|/tmp/parallel-bug49791-932/1/3/2/b/stderr par_shuf $SQLITE sleep .3;echo 3 b|3|b|/tmp/parallel-bug49791- <932/1/3/2/b/stdout|/tmp/parallel-bug49791- <932/1/3/2/b/stderr
par_shuf $SQLITE sleep .3;echo 3 c|3|c|/tmp/parallel-bug49791-932/1/3/2/c/stdout|/tmp/parallel-bug49791-932/1/3/2/c/stderr par_shuf $SQLITE sleep .3;echo 3 c|3|c|/tmp/parallel-bug49791- <932/1/3/2/c/stdout|/tmp/parallel-bug49791- <932/1/3/2/c/stderr
par_shuf $SQLITE sleep .3;echo 3 d|3|d|/tmp/parallel-bug49791-932/1/3/2/d/stdout|/tmp/parallel-bug49791-932/1/3/2/d/stderr par_shuf $SQLITE sleep .3;echo 3 d|3|d|/tmp/parallel-bug49791- <932/1/3/2/d/stdout|/tmp/parallel-bug49791- <932/1/3/2/d/stderr
par_shuf $SQLITE sleep .3;echo 3 e|3|e|/tmp/parallel-bug49791-932/1/3/2/e/stdout|/tmp/parallel-bug49791-932/1/3/2/e/stderr par_shuf $SQLITE sleep .3;echo 3 e|3|e|/tmp/parallel-bug49791- <932/1/3/2/e/stdout|/tmp/parallel-bug49791- <932/1/3/2/e/stderr
par_shuf $SQLITE sleep .3;echo 4 a|4|a|/tmp/parallel-bug49791-932/1/4/2/a/stdout|/tmp/parallel-bug49791-932/1/4/2/a/stderr par_shuf $SQLITE sleep .3;echo 4 a|4|a|/tmp/parallel-bug49791- <932/1/4/2/a/stdout|/tmp/parallel-bug49791- <932/1/4/2/a/stderr
par_shuf $SQLITE sleep .3;echo 4 b|4|b|/tmp/parallel-bug49791-932/1/4/2/b/stdout|/tmp/parallel-bug49791-932/1/4/2/b/stderr par_shuf $SQLITE sleep .3;echo 4 b|4|b|/tmp/parallel-bug49791- <932/1/4/2/b/stdout|/tmp/parallel-bug49791- <932/1/4/2/b/stderr
par_shuf $SQLITE sleep .3;echo 4 c|4|c|/tmp/parallel-bug49791-932/1/4/2/c/stdout|/tmp/parallel-bug49791-932/1/4/2/c/stderr par_shuf $SQLITE sleep .3;echo 4 c|4|c|/tmp/parallel-bug49791- <932/1/4/2/c/stdout|/tmp/parallel-bug49791- <932/1/4/2/c/stderr
par_shuf $SQLITE sleep .3;echo 4 d|4|d|/tmp/parallel-bug49791-932/1/4/2/d/stdout|/tmp/parallel-bug49791-932/1/4/2/d/stderr par_shuf $SQLITE sleep .3;echo 4 d|4|d|/tmp/parallel-bug49791- <932/1/4/2/d/stdout|/tmp/parallel-bug49791- <932/1/4/2/d/stderr
par_shuf $SQLITE sleep .3;echo 4 e|4|e|/tmp/parallel-bug49791-932/1/4/2/e/stdout|/tmp/parallel-bug49791-932/1/4/2/e/stderr par_shuf $SQLITE sleep .3;echo 4 e|4|e|/tmp/parallel-bug49791- <932/1/4/2/e/stdout|/tmp/parallel-bug49791- <932/1/4/2/e/stderr
par_shuf $SQLITE sleep .3;echo 5 a|5|a|/tmp/parallel-bug49791-932/1/5/2/a/stdout|/tmp/parallel-bug49791-932/1/5/2/a/stderr par_shuf $SQLITE sleep .3;echo 5 a|5|a|/tmp/parallel-bug49791- <932/1/5/2/a/stdout|/tmp/parallel-bug49791- <932/1/5/2/a/stderr
par_shuf $SQLITE sleep .3;echo 5 b|5|b|/tmp/parallel-bug49791-932/1/5/2/b/stdout|/tmp/parallel-bug49791-932/1/5/2/b/stderr par_shuf $SQLITE sleep .3;echo 5 b|5|b|/tmp/parallel-bug49791- <932/1/5/2/b/stdout|/tmp/parallel-bug49791- <932/1/5/2/b/stderr
par_shuf $SQLITE sleep .3;echo 5 c|5|c|/tmp/parallel-bug49791-932/1/5/2/c/stdout|/tmp/parallel-bug49791-932/1/5/2/c/stderr par_shuf $SQLITE sleep .3;echo 5 c|5|c|/tmp/parallel-bug49791- <932/1/5/2/c/stdout|/tmp/parallel-bug49791- <932/1/5/2/c/stderr
par_shuf $SQLITE sleep .3;echo 5 d|5|d|/tmp/parallel-bug49791-932/1/5/2/d/stdout|/tmp/parallel-bug49791-932/1/5/2/d/stderr par_shuf $SQLITE sleep .3;echo 5 d|5|d|/tmp/parallel-bug49791- <932/1/5/2/d/stdout|/tmp/parallel-bug49791- <932/1/5/2/d/stderr
par_shuf $SQLITE sleep .3;echo 5 e|5|e|/tmp/parallel-bug49791-932/1/5/2/e/stdout|/tmp/parallel-bug49791-932/1/5/2/e/stderr par_shuf $SQLITE sleep .3;echo 5 e|5|e|/tmp/parallel-bug49791- <932/1/5/2/e/stdout|/tmp/parallel-bug49791- <932/1/5/2/e/stderr
par_sql_joblog $MYSQL p_wrapper par_sql_joblog '$MYSQL' par_sql_joblog $MYSQL p_wrapper par_sql_joblog '$MYSQL'
par_sql_joblog $MYSQL ### should only give a single --joblog heading par_sql_joblog $MYSQL ### should only give a single --joblog heading
par_sql_joblog $MYSQL ### --sqlmaster/--sqlworker par_sql_joblog $MYSQL ### --sqlmaster/--sqlworker

View file

@ -62,7 +62,9 @@ par_sshloginfile parallel
par_sshloginfile parallel par_sshloginfile parallel
par_sshloginfile parallel par_sshloginfile parallel
par_tmux_different_shells ### Test tmux works on different shells par_tmux_different_shells ### Test tmux works on different shells
par_tmux_different_shells See output with: tmux -S '/tmp/parallel-local-ssh4-tmp/
par_tmux_different_shells 0 par_tmux_different_shells 0
par_tmux_different_shells See output with: tmux -S '/tmp/parallel-local-ssh4-tmp/
par_tmux_different_shells 4 par_tmux_different_shells 4
par_tmux_different_shells 0 par_tmux_different_shells 0
par_tmux_different_shells 4 par_tmux_different_shells 4
@ -74,9 +76,16 @@ par_tmux_different_shells # command is currently too long for csh. Maybe it can
par_tmux_different_shells 0 par_tmux_different_shells 0
par_tmux_different_shells 4 par_tmux_different_shells 4
par_tmux_length ### works par_tmux_length ### works
par_tmux_length See output with: tmux -S attach par_tmux_length See output with: tmux -S '/tmp/parallel-local-ssh4-tmp/
par_tmux_length See output with: tmux -S attach par_tmux_length <' attach
par_tmux_length See output with: tmux -S '/tmp/parallel-local-ssh4-tmp/
par_tmux_length <' attach
par_tmux_length ### These blocked due to length par_tmux_length ### These blocked due to length
par_tmux_length See output with: tmux -S '/tmp/parallel-local-ssh4-tmp/
par_tmux_length See output with: tmux -S '/tmp/parallel-local-ssh4-tmp/
par_tmux_length See output with: tmux -S '/tmp/parallel-local-ssh4-tmp/
par_tmux_length See output with: tmux -S '/tmp/parallel-local-ssh4-tmp/
par_tmux_length See output with: tmux -S '/tmp/parallel-local-ssh4-tmp/
par_transfer_return_multiple_inputs ### bug #43746: --transfer and --return of multiple inputs {1} and {2} par_transfer_return_multiple_inputs ### bug #43746: --transfer and --return of multiple inputs {1} and {2}
par_transfer_return_multiple_inputs ### and: par_transfer_return_multiple_inputs ### and:
par_transfer_return_multiple_inputs ### bug #44371: --trc with csh complains par_transfer_return_multiple_inputs ### bug #44371: --trc with csh complains

View file

@ -1,3 +1,5 @@
par_ssh_cmd_with_newline ### Check --ssh with \n works
par_ssh_cmd_with_newline uid=1003(sh) gid=1003(sh) groups=1003(sh)
par_pipe_retries ### bug #45025: --pipe --retries does not reschedule on other host par_pipe_retries ### bug #45025: --pipe --retries does not reschedule on other host
par_pipe_retries parallel: Warning: Could not figure out number of cpus on a.a (). Using 1. par_pipe_retries parallel: Warning: Could not figure out number of cpus on a.a (). Using 1.
par_pipe_retries 165668 165668 1048571 par_pipe_retries 165668 165668 1048571
@ -18,6 +20,15 @@ par_env_parallel_onall Myfunc works
par_controlmaster_eats bug #36707: --controlmaster eats jobs par_controlmaster_eats bug #36707: --controlmaster eats jobs
par_controlmaster_eats OK1 par_controlmaster_eats OK1
par_controlmaster_eats OK2 par_controlmaster_eats OK2
par_controlmaster ### Check -M works if TMPDIR contains space
par_controlmaster 1
par_controlmaster 2
par_controlmaster 3
par_controlmaster 1
par_controlmaster 2
par_controlmaster 3
par_controlmaster Part2
par_controlmaster OK
par_command_len_shellquote ### test quoting will not cause a crash if too long par_command_len_shellquote ### test quoting will not cause a crash if too long
par_command_len_shellquote -Slo -j10 " 1 1 1 1 4 par_command_len_shellquote -Slo -j10 " 1 1 1 1 4
par_command_len_shellquote -Slo -j10 " 1 2 1 1 10 par_command_len_shellquote -Slo -j10 " 1 2 1 1 10

View file

@ -45,25 +45,25 @@ echo '### bug #42041: Implement $PARALLEL_JOBSLOT'
2 2
echo '### bug #42363: --pipepart and --fifo/--cat does not work' echo '### bug #42363: --pipepart and --fifo/--cat does not work'
### bug #42363: --pipepart and --fifo/--cat does not work ### bug #42363: --pipepart and --fifo/--cat does not work
seq 100 > /tmp/bug42363; parallel --pipepart --block 31 -a /tmp/bug42363 -k --fifo wc | perl -pe 's:(/tmp\S+par).....:${1}XXXXX:'; parallel --pipepart --block 31 -a /tmp/bug42363 -k --cat wc | perl -pe 's:(/tmp\S+par).....:${1}XXXXX:'; rm /tmp/bug42363 seq 100 > /tmp/bug42363; parallel --pipepart --block 31 -a /tmp/bug42363 -k --fifo wc | perl -pe 's:(/tmp.*par).....:${1}XXXXX:'; parallel --pipepart --block 31 -a /tmp/bug42363 -k --cat wc | perl -pe 's:(/tmp.*par).....:${1}XXXXX:'; rm /tmp/bug42363
14 14 33 /tmp/parallel-local22-tmpdir/parXXXXX 14 14 33 '/tmp/parallel-local22-tmp/'$'\n'' </tmp/parXXXXX'
11 11 33 /tmp/parallel-local22-tmpdir/parXXXXX 11 11 33 '/tmp/parallel-local22-tmp/'$'\n'' </tmp/parXXXXX'
11 11 33 /tmp/parallel-local22-tmpdir/parXXXXX 11 11 33 '/tmp/parallel-local22-tmp/'$'\n'' </tmp/parXXXXX'
11 11 33 /tmp/parallel-local22-tmpdir/parXXXXX 11 11 33 '/tmp/parallel-local22-tmp/'$'\n'' </tmp/parXXXXX'
11 11 33 /tmp/parallel-local22-tmpdir/parXXXXX 11 11 33 '/tmp/parallel-local22-tmp/'$'\n'' </tmp/parXXXXX'
11 11 33 /tmp/parallel-local22-tmpdir/parXXXXX 11 11 33 '/tmp/parallel-local22-tmp/'$'\n'' </tmp/parXXXXX'
11 11 33 /tmp/parallel-local22-tmpdir/parXXXXX 11 11 33 '/tmp/parallel-local22-tmp/'$'\n'' </tmp/parXXXXX'
11 11 33 /tmp/parallel-local22-tmpdir/parXXXXX 11 11 33 '/tmp/parallel-local22-tmp/'$'\n'' </tmp/parXXXXX'
9 9 28 /tmp/parallel-local22-tmpdir/parXXXXX 9 9 28 '/tmp/parallel-local22-tmp/'$'\n'' </tmp/parXXXXX'
14 14 33 /tmp/parallel-local22-tmpdir/parXXXXX 14 14 33 '/tmp/parallel-local22-tmp/'$'\n'' </tmp/parXXXXX'
11 11 33 /tmp/parallel-local22-tmpdir/parXXXXX 11 11 33 '/tmp/parallel-local22-tmp/'$'\n'' </tmp/parXXXXX'
11 11 33 /tmp/parallel-local22-tmpdir/parXXXXX 11 11 33 '/tmp/parallel-local22-tmp/'$'\n'' </tmp/parXXXXX'
11 11 33 /tmp/parallel-local22-tmpdir/parXXXXX 11 11 33 '/tmp/parallel-local22-tmp/'$'\n'' </tmp/parXXXXX'
11 11 33 /tmp/parallel-local22-tmpdir/parXXXXX 11 11 33 '/tmp/parallel-local22-tmp/'$'\n'' </tmp/parXXXXX'
11 11 33 /tmp/parallel-local22-tmpdir/parXXXXX 11 11 33 '/tmp/parallel-local22-tmp/'$'\n'' </tmp/parXXXXX'
11 11 33 /tmp/parallel-local22-tmpdir/parXXXXX 11 11 33 '/tmp/parallel-local22-tmp/'$'\n'' </tmp/parXXXXX'
11 11 33 /tmp/parallel-local22-tmpdir/parXXXXX 11 11 33 '/tmp/parallel-local22-tmp/'$'\n'' </tmp/parXXXXX'
9 9 28 /tmp/parallel-local22-tmpdir/parXXXXX 9 9 28 '/tmp/parallel-local22-tmp/'$'\n'' </tmp/parXXXXX'
echo '### bug #42055: --pipepart -a bigfile should not require sequential reading of bigfile' echo '### bug #42055: --pipepart -a bigfile should not require sequential reading of bigfile'
### bug #42055: --pipepart -a bigfile should not require sequential reading of bigfile ### bug #42055: --pipepart -a bigfile should not require sequential reading of bigfile
parallel --pipepart -a /etc/passwd -L 1 should not be run parallel --pipepart -a /etc/passwd -L 1 should not be run

View file

@ -254,7 +254,7 @@ echo '### Race condition bug - 1 - would block'; seq 1 80 | nice parallel -j0
### Race condition bug - 1 - would block ### Race condition bug - 1 - would block
echo '### Race condition bug - 2 - would block'; seq 1 100 | nice parallel -j100 --block 1 --recend "" --pipe cat >/dev/null echo '### Race condition bug - 2 - would block'; seq 1 100 | nice parallel -j100 --block 1 --recend "" --pipe cat >/dev/null
### Race condition bug - 2 - would block ### Race condition bug - 2 - would block
echo '### Test --block size=1'; seq 1 10| parallel --block 1 --files --recend "" --pipe sort -n | parallel -Xj1 sort -nm {} ";"rm {} echo '### Test --block size=1'; seq 1 10| TMPDIR=/tmp parallel --block 1 --files --recend "" --pipe sort -n | parallel -Xj1 sort -nm {} ";"rm {}
### Test --block size=1 ### Test --block size=1
@ -277,14 +277,14 @@ echo '### Test --block size=1'; seq 1 10| parallel --block 1 --files --recend
7 7
8 8
9 9
echo '### Test --block size=1M -j10 --files - more jobs than data'; sort -n < /tmp/blocktest | md5sum; cat /tmp/blocktest | parallel --files --recend "\n" -j10 --pipe sort -n | parallel -Xj1 sort -nm {} ";"rm {} | md5sum echo '### Test --block size=1M -j10 --files - more jobs than data'; sort -n < /tmp/blocktest | md5sum; cat /tmp/blocktest | TMPDIR=/tmp parallel --files --recend "\n" -j10 --pipe sort -n | parallel -Xj1 sort -nm {} ";"rm {} | md5sum
### Test --block size=1M -j10 --files - more jobs than data ### Test --block size=1M -j10 --files - more jobs than data
8a7095c1c23bfadc311fe6b16d950582 - 8a7095c1c23bfadc311fe6b16d950582 -
8a7095c1c23bfadc311fe6b16d950582 - 8a7095c1c23bfadc311fe6b16d950582 -
echo '### Test --block size=1M -j1 - more data than cpu'; cat /tmp/blocktest | parallel --files --recend "\n" -j1 --pipe sort -n | parallel -Xj1 sort -nm {} ";"rm {} | md5sum echo '### Test --block size=1M -j1 - more data than cpu'; cat /tmp/blocktest | TMPDIR=/tmp parallel --files --recend "\n" -j1 --pipe sort -n | parallel -Xj1 sort -nm {} ";"rm {} | md5sum
### Test --block size=1M -j1 - more data than cpu ### Test --block size=1M -j1 - more data than cpu
8a7095c1c23bfadc311fe6b16d950582 - 8a7095c1c23bfadc311fe6b16d950582 -
echo '### Test --block size=1M -j1 - more data than cpu'; cat /tmp/blocktest | parallel --files --recend "\n" -j2 --pipe sort -n | parallel -Xj1 sort -nm {} ";"rm {} | md5sum echo '### Test --block size=1M -j1 - more data than cpu'; cat /tmp/blocktest | TMPDIR=/tmp parallel --files --recend "\n" -j2 --pipe sort -n | parallel -Xj1 sort -nm {} ";"rm {} | md5sum
### Test --block size=1M -j1 - more data than cpu ### Test --block size=1M -j1 - more data than cpu
8a7095c1c23bfadc311fe6b16d950582 - 8a7095c1c23bfadc311fe6b16d950582 -
echo '### Test --pipe default settings'; cat /tmp/blocktest | parallel --pipe sort | sort -n | md5sum echo '### Test --pipe default settings'; cat /tmp/blocktest | parallel --pipe sort | sort -n | md5sum

View file

@ -1,13 +1,16 @@
echo '### tmux-1.9' echo '### tmux-1.9'
### tmux-1.9 ### tmux-1.9
seq 510 512 | PARALLEL_TMUX=tmux-1.9 par_tmux seq 510 512 | PARALLEL_TMUX=tmux-1.9 par_tmux
See output with: tmux-1.9 -S /tmp/parallel-local7-tmpdir/tmsXXXXX attach See output with: tmux-1.9 -S '/tmp/parallel-local7-tmp/
</tmp/tmsXXXXX' attach
0 0
seq 0000 10 510 | PARALLEL_TMUX=tmux-1.9 par_tmux seq 0000 10 510 | PARALLEL_TMUX=tmux-1.9 par_tmux
See output with: tmux-1.9 -S /tmp/parallel-local7-tmpdir/tmsXXXXX attach See output with: tmux-1.9 -S '/tmp/parallel-local7-tmp/
</tmp/tmsXXXXX' attach
0 0
echo '### tmux-1.9 fails' seq 512 10 2000 | PARALLEL_TMUX=tmux-1.9 par_tmux echo '### tmux-1.9 fails' seq 512 10 2000 | PARALLEL_TMUX=tmux-1.9 par_tmux
See output with: tmux-1.9 -S /tmp/parallel-local7-tmpdir/tmsXXXXX attach See output with: tmux-1.9 -S '/tmp/parallel-local7-tmp/
</tmp/tmsXXXXX' attach
0 0
seq 2001 10 3000 | PARALLEL_TMUX=tmux-1.9 par_tmux seq 2001 10 3000 | PARALLEL_TMUX=tmux-1.9 par_tmux
parallel: Error: Command line too long (2012 >= 523) at input 0: 2001 parallel: Error: Command line too long (2012 >= 523) at input 0: 2001
@ -62,19 +65,22 @@ parallel: Error: Command line too long (6 >= -1264) at input 0: 0
echo '### tmux-1.9 0..255 ascii' echo '### tmux-1.9 0..255 ascii'
### tmux-1.9 0..255 ascii ### tmux-1.9 0..255 ascii
perl -e 'print map { ($_, map { pack("c*",$_) } grep { $_>=1 && $_!=10 } 0..$_),"\n" } 0..255' | PARALLEL_TMUX=tmux-1.9 stdout parallel --tmux --timeout 5 echo | par_tmux_filter; echo $? perl -e 'print map { ($_, map { pack("c*",$_) } grep { $_>=1 && $_!=10 } 0..$_),"\n" } 0..255' | PARALLEL_TMUX=tmux-1.9 stdout parallel --tmux --timeout 5 echo | par_tmux_filter; echo $?
See output with: tmux-1.9 -S /tmp/parallel-local7-tmpdir/tmsXXXXX attach See output with: tmux-1.9 -S '/tmp/parallel-local7-tmp/
</tmp/tmsXXXXX' attach
0 0
echo '### Test output ascii' echo '### Test output ascii'
### Test output ascii ### Test output ascii
rm -f /tmp/paralocal7-ascii*; perl -e 'print map { ($_, map { pack("c*",$_) } grep { $_>=1 && $_!=10 } $_-10..$_),"\n" } 1..255' | stdout parallel --tmux echo {}'>>/tmp/paralocal7-ascii{%}' | par_tmux_filter; sort /tmp/paralocal7-ascii* | md5sum rm -f /tmp/paralocal7-ascii*; perl -e 'print map { ($_, map { pack("c*",$_) } grep { $_>=1 && $_!=10 } $_-10..$_),"\n" } 1..255' | stdout parallel --tmux echo {}'>>/tmp/paralocal7-ascii{%}' | par_tmux_filter; sort /tmp/paralocal7-ascii* | md5sum
See output with: tmux -S /tmp/parallel-local7-tmpdir/tmsXXXXX attach See output with: tmux -S '/tmp/parallel-local7-tmp/
</tmp/tmsXXXXX' attach
053c7e8e945ef7641fc63bc309ac069d - 053c7e8e945ef7641fc63bc309ac069d -
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 140 260 | PARALLEL_TMUX=tmux-1.8 stdout parallel --tmux echo '{}{=$_="&"x$_=}' | par_tmux_filter seq 140 260 | PARALLEL_TMUX=tmux-1.8 stdout parallel --tmux echo '{}{=$_="&"x$_=}' | par_tmux_filter
parallel: Error: Command line too long (150 >= -1264) at input 0: 140 parallel: Error: Command line too long (150 >= -1264) at input 0: 140
seq 140 260 | PARALLEL_TMUX=tmux-1.9 stdout parallel --tmux echo '{}{=$_="&"x$_=}' | par_tmux_filter seq 140 260 | PARALLEL_TMUX=tmux-1.9 stdout parallel --tmux echo '{}{=$_="&"x$_=}' | par_tmux_filter
See output with: tmux-1.9 -S /tmp/parallel-local7-tmpdir/tmsXXXXX attach See output with: tmux-1.9 -S '/tmp/parallel-local7-tmp/
</tmp/tmsXXXXX' attach
seq 560 850 | PARALLEL_TMUX=tmux-1.8 stdout parallel --tmux echo '{}{=$_="a"x$_=}' | par_tmux_filter seq 560 850 | PARALLEL_TMUX=tmux-1.8 stdout parallel --tmux echo '{}{=$_="a"x$_=}' | par_tmux_filter
parallel: Error: Command line too long (568 >= -1264) at input 0: 560 parallel: Error: Command line too long (568 >= -1264) at input 0: 560
seq 560 850 | PARALLEL_TMUX=tmux-1.9 stdout parallel --tmux echo '{}{=$_="a"x$_=}' | par_tmux_filter seq 560 850 | PARALLEL_TMUX=tmux-1.9 stdout parallel --tmux echo '{}{=$_="a"x$_=}' | par_tmux_filter

View file

@ -61,7 +61,8 @@ echo '### Test --spreadstdin - this failed during devel'; nice seq 1 1000000 |
echo '### Test --spreadstdin -k'; nice seq 1 1000000 | $NICEPAR -k --recend "\n" -j10 --spreadstdin gzip -9 | zcat | md5sum echo '### Test --spreadstdin -k'; nice seq 1 1000000 | $NICEPAR -k --recend "\n" -j10 --spreadstdin gzip -9 | zcat | md5sum
### Test --spreadstdin -k ### Test --spreadstdin -k
8a7095c1c23bfadc311fe6b16d950582 - 8a7095c1c23bfadc311fe6b16d950582 -
echo '### Test --spreadstdin --files'; nice seq 1 1000000 | shuf | $NICEPAR --files --recend "\n" -j10 --spreadstdin sort -n | parallel -Xj1 sort -nm {} ";"rm {} | md5sum # --files requires TMPDIR does not contain \n
echo '### Test --spreadstdin --files'; nice seq 1 1000000 | shuf | TMPDIR=/tmp $NICEPAR --files --recend "\n" -j10 --spreadstdin sort -n | parallel -Xj1 sort -nm {} ";"rm {} | md5sum
### Test --spreadstdin --files ### Test --spreadstdin --files
8a7095c1c23bfadc311fe6b16d950582 - 8a7095c1c23bfadc311fe6b16d950582 -
echo '### Test --tag ::: a ::: b'; stdout $NICEPAR -k --tag -j1 echo stderr-{.} ">&2;" echo stdout-{} ::: a ::: b echo '### Test --tag ::: a ::: b'; stdout $NICEPAR -k --tag -j1 echo stderr-{.} ">&2;" echo stdout-{} ::: a ::: b

View file

@ -150,7 +150,8 @@ num30000
num8 num8
tsv-file.tsv tsv-file.tsv
foo foo
~ /tmp/parallel-tutorial-tmp/
</tmp
my_func() { my_func() {
echo in my_func $1 echo in my_func $1
} }
@ -439,9 +440,14 @@ echo C
1-middle 1-middle
1-end 1-end
parallel --files echo ::: A B C parallel --files echo ::: A B C
/tmp/parallel-tutorial-tmpdir/parXXXXX.par /tmp/parallel-tutorial-tmp/
</tmp/tempfile
/tmp/parallel-tutorial-tmp/
</tmp/tempfile
/tmp/parallel-tutorial-tmp/
</tmp/tempfile
parallel --tmpdir /var/tmp --files echo ::: A B C parallel --tmpdir /var/tmp --files echo ::: A B C
/var/tmp/parXXXXX.par /var/tmp/tempfile
parallel --results outdir echo ::: A B C parallel --results outdir echo ::: A B C
outdir/1/A/seq outdir/1/A/seq
outdir/1/A/stderr outdir/1/A/stderr
@ -509,7 +515,8 @@ parallel: Warning: or increasing /proc/sys/fs/file-max
parallel --shuf echo ::: 1 2 3 ::: a b c ::: A B C parallel --shuf echo ::: 1 2 3 ::: a b c ::: A B C
123 abc ABC 123 abc ABC
seq 10 20 | parallel --tmux 'echo start {}; sleep {}; echo done {}' seq 10 20 | parallel --tmux 'echo start {}; sleep {}; echo done {}'
See output with: tmux -S /tmp/parallel-tutorial-tmpdir/tmsXXXXX attach See output with: tmux -S '/tmp/parallel-tutorial-tmp/
</tmp/tmsXXXXX' attach
tmux -S /tmp/tmsXXXXX attach tmux -S /tmp/tmsXXXXX attach
no sessions no sessions
parallel --delay 2.5 echo Starting {}\;date ::: 1 2 3 parallel --delay 2.5 echo Starting {}\;date ::: 1 2 3
@ -701,6 +708,8 @@ foo
parallel --workdir . -S $SERVER1 pwd ::: "" parallel --workdir . -S $SERVER1 pwd ::: ""
parallel --workdir ... -S $SERVER1 pwd ::: "" parallel --workdir ... -S $SERVER1 pwd ::: ""
/home/parallel /home/parallel
/tmp/parallel-tutorial-tmp/
</tmp
/home/parallel/.TMPWORKDIR /home/parallel/.TMPWORKDIR
parallel -S $SERVER1 --sshdelay 0.2 echo ::: 1 2 3 parallel -S $SERVER1 --sshdelay 0.2 echo ::: 1 2 3
9 9
@ -787,6 +796,7 @@ BASH_FUNC_run_test%%
_ _
mysqlrootpass mysqlrootpass
oracle_password oracle_password
testsuitedir
withpassword withpassword
# The function is only copied if using Bash # The function is only copied if using Bash
my_func2() { my_func2() {
@ -1315,7 +1325,7 @@ This helps funding further development; AND IT WON'T COST YOU A CENT.
If you pay 10000 EUR you should feel free to use GNU Parallel without citing. If you pay 10000 EUR you should feel free to use GNU Parallel without citing.
More about funding GNU Parallel and the citation notice: More about funding GNU Parallel and the citation notice:
https://lists.gnu.org/archive/html/parallel/2013-11/msg00006.html https://lists.gnu.org/archive/html/parallel/2013-11/msg00006.html
https://www.gnu.org/software/parallel/parallel_design.html#citation-notice https://www.gnu.org/software/tempfileallel_design.html#citation-notice
https:BASE64-notice-faq.txt https:BASE64-notice-faq.txt
If you send a copy of your published article to tange@gnu.org, it will be If you send a copy of your published article to tange@gnu.org, it will be
mentioned in the release notes of next version of GNU Parallel. mentioned in the release notes of next version of GNU Parallel.
@ -1330,4 +1340,10 @@ mentioned in the release notes of next version of GNU Parallel.
echo A echo A
echo B echo B
echo C echo C
9 ### 3+3 .par files (from --files), 1 .tms-file from tmux attach
A
A
B
B
C
C

View file

@ -47,7 +47,9 @@ def 3
### Test --debug ### Test --debug
dburl mysql://tange:tange@localhost:3306/tange dburl mysql://tange:tange@localhost:3306/tange
databasedriver mysql user tange password tange host localhost port 3306 database tange query databasedriver mysql user tange password tange host localhost port 3306 database tange query
[ | ((sleep 1; rm tmpfile) & mysql --defaults-extra-file=tmpfile -C --host=localhost --user=tange --port=3306 tange)] [ | ((sleep 1; rm '/tmp/sql01-tmp/
<tmpfile') & mysql --defaults-extra-file='/tmp/sql01-tmp/
<tmpfile' --host=localhost --user=tange --port=3306 tange)]
Test if --debug works Test if --debug works
Yes it does Yes it does
### Test --version -V ### Test --version -V

View file

@ -3,7 +3,7 @@ par_influx empty input
par_influx empty input par_influx empty input
par_influx empty input par_influx empty input
par_influx dbsize is not implemented for influx par_influx dbsize is not implemented for influx
par_influx Field separator not implemented for influx at /usr/local/bin/sql line 889. par_influx Field separator not implemented for influx at /usr/local/bin/sql line 892.
par_influx name: databases par_influx name: databases
par_influx name par_influx name
par_influx ---- par_influx ----