mirror of
https://git.savannah.gnu.org/git/parallel.git
synced 2024-11-26 07:57:58 +00:00
testsuite: Tests for env_parallel for multiple shells. Passes testsuite.
This commit is contained in:
parent
03a69b38ce
commit
6df65fa6ce
10
src/parallel
10
src/parallel
|
@ -832,7 +832,7 @@ sub options_hash {
|
||||||
"cat" => \$opt::cat,
|
"cat" => \$opt::cat,
|
||||||
"fifo" => \$opt::fifo,
|
"fifo" => \$opt::fifo,
|
||||||
"pipepart|pipe-part" => \$opt::pipepart,
|
"pipepart|pipe-part" => \$opt::pipepart,
|
||||||
"hgrp|hostgroup|hostgroups" => \$opt::hostgroups,
|
"hgrp|hostgrp|hostgroup|hostgroups" => \$opt::hostgroups,
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1075,7 +1075,7 @@ sub parse_options {
|
||||||
|
|
||||||
sub init_globals {
|
sub init_globals {
|
||||||
# Defaults:
|
# Defaults:
|
||||||
$Global::version = 20150516;
|
$Global::version = 20150521;
|
||||||
$Global::progname = 'parallel';
|
$Global::progname = 'parallel';
|
||||||
$Global::infinity = 2**31;
|
$Global::infinity = 2**31;
|
||||||
$Global::debug = 0;
|
$Global::debug = 0;
|
||||||
|
@ -6448,6 +6448,12 @@ sub wrapped {
|
||||||
' $PARALLEL_TMP'.
|
' $PARALLEL_TMP'.
|
||||||
';';
|
';';
|
||||||
}
|
}
|
||||||
|
if($ENV{'PARALLEL_ENV'}) {
|
||||||
|
# If $PARALLEL_ENV set, put that in front of the command
|
||||||
|
# Used for importing functions for fish
|
||||||
|
$ENV{'PARALLEL_ENV'} =~ s/\001/\n/g;
|
||||||
|
$command = $ENV{'PARALLEL_ENV'}."\n".$command;
|
||||||
|
}
|
||||||
# Wrap with ssh + tranferring of files
|
# Wrap with ssh + tranferring of files
|
||||||
$command = $self->sshlogin_wrap($command);
|
$command = $self->sshlogin_wrap($command);
|
||||||
if(@Global::cat_partials) {
|
if(@Global::cat_partials) {
|
||||||
|
|
|
@ -80,41 +80,74 @@ similar to B<cat | sh>.
|
||||||
The I<command> must be an executable, a script, a composed command, or
|
The I<command> must be an executable, a script, a composed command, or
|
||||||
a function.
|
a function.
|
||||||
|
|
||||||
If it is a Bash function you need to B<export -f> the function
|
B<Bash functions>: B<export -f> the function first.
|
||||||
first. To use aliases copy the full environment as described under
|
|
||||||
B<--env> and use B<env_parallel> instead of B<parallel>.
|
|
||||||
|
|
||||||
If it is a Ksh function you can encode the function in a variable:
|
B<Bash aliases>: Copy the full environment using this and use B<env_parallel> instead of B<parallel>.
|
||||||
|
|
||||||
|
env_parallel() {
|
||||||
|
export PARALLEL_ENV="$(echo "shopt -s expand_aliases 2>/dev/null"; alias;typeset -p | grep -vFf <(readonly; echo GROUPS; echo FUNCNAME; echo DIRSTACK; echo _; echo PIPESTATUS; echo USERNAME) | grep -v BASH_;typeset -f)";
|
||||||
|
`which parallel` "$@";
|
||||||
|
unset PARALLEL_ENV;
|
||||||
|
}
|
||||||
|
# call as:
|
||||||
|
env_parallel [normal parallel options]
|
||||||
|
|
||||||
|
B<Ksh functions>: If it is a Ksh function you can encode the function in a variable:
|
||||||
|
|
||||||
foo() {
|
foo() {
|
||||||
echo $*;
|
echo $*;
|
||||||
}
|
}
|
||||||
export fun=`typeset -f foo`; parallel 'eval "$fun";' foo ::: works
|
export PARALLEL_ENV=`typeset -f foo`
|
||||||
|
parallel foo ::: works
|
||||||
|
|
||||||
To export all functions and make them available when running remote:
|
To export all functions and also make them available when running remote:
|
||||||
|
|
||||||
export fun=`typeset -f`; parallel --env fun 'eval "$fun";' foo ::: works
|
env_parallel() {
|
||||||
|
export PARALLEL_ENV="$(alias | perl -pe 's/^/alias /';typeset -p;typeset -f)";
|
||||||
|
`which parallel` "$@";
|
||||||
|
unset PARALLEL_ENV;
|
||||||
|
}
|
||||||
|
# call as:
|
||||||
|
env_parallel [normal parallel options]
|
||||||
|
|
||||||
=cut
|
B<Zsh functions>: If it is a Zsh function you can encode the function in a variable:
|
||||||
# ssh ksh@lo 'foo() { echo $* ; }; export fun="`typeset -f`"; parallel -S ksh@lo --env fun "eval \"\$fun\";"foo ::: works'
|
|
||||||
# ssh zsh@lo 'foo() { echo $* ; }; export fun="`typeset -f`"; parallel -S zsh@lo --env fun "eval \"\$fun\";"foo ::: works'
|
|
||||||
|
|
||||||
# If it is a zsh function you will need to use this helper function
|
foo() {
|
||||||
# B<exportf> to export and to set $PARALLEL_SHELL to bash:
|
echo $*;
|
||||||
#
|
}
|
||||||
# function exportf (){
|
PARALLEL_ENV="$(typeset -f foo)";
|
||||||
# export $(echo $1)="`whence -f $1 | sed -e "s/$1 //" `"
|
export PARALLEL_ENV
|
||||||
# }
|
parallel foo ::: works
|
||||||
#
|
|
||||||
# function my_func(){
|
To export all functions and also make them available when running remote:
|
||||||
# echo $1;
|
|
||||||
# echo "hello";
|
env_parallel() {
|
||||||
# }
|
PARALLEL_ENV="$(alias | perl -pe 's/^/alias /';typeset -f)";
|
||||||
#
|
export PARALLEL_ENV
|
||||||
# exportf my_func
|
`which parallel` "$@";
|
||||||
# parallel --env my_func "my_func {}" ::: 1 2
|
unset PARALLEL_ENV;
|
||||||
# TODO accept --env without -S
|
}
|
||||||
=pod
|
# call as:
|
||||||
|
env_parallel [normal parallel options]
|
||||||
|
|
||||||
|
B<Fish functions>: If it is a Fish function you can encode the function in a variable:
|
||||||
|
|
||||||
|
function foo
|
||||||
|
echo $argv;
|
||||||
|
end
|
||||||
|
|
||||||
|
setenv PARALLEL_ENV (functions foo|perl -pe 's/\n/\001/')
|
||||||
|
parallel foo ::: works
|
||||||
|
|
||||||
|
To export all functions and also make them available when running remote:
|
||||||
|
|
||||||
|
function env_parallel
|
||||||
|
setenv PARALLEL_ENV (functions -n | perl -pe 's/,/\n/g' | while read d; functions $d; end|perl -pe 's/\n/\001/')
|
||||||
|
parallel $argv;
|
||||||
|
set -e PARALLEL_ENV
|
||||||
|
end
|
||||||
|
# call as:
|
||||||
|
env_parallel [normal parallel options]
|
||||||
|
|
||||||
The command cannot contain the character \257 (macron: ¯).
|
The command cannot contain the character \257 (macron: ¯).
|
||||||
|
|
||||||
|
|
|
@ -1434,9 +1434,9 @@
|
||||||
|
|
||||||
<pre><code> force 4 cpus on server</code></pre>
|
<pre><code> force 4 cpus on server</code></pre>
|
||||||
|
|
||||||
<p>Servers can be put into groups by prepending '@groupname' to the server and the group can then be selected by appending '@groupname' to the argument if using '--hostgrp'.</p>
|
<p>Servers can be put into groups by prepending '@groupname' to the server and the group can then be selected by appending '@groupname' to the argument if using '--hostgroup'.</p>
|
||||||
|
|
||||||
<pre><code> parallel --hostgrp -S @grp1/$SERVER1 -S @grp2/SERVER2 echo {} ::: run_on_grp1@grp1 run_on_grp2@grp2</code></pre>
|
<pre><code> parallel --hostgroup -S @grp1/$SERVER1 -S @grp2/$SERVER2 echo {} ::: run_on_grp1@grp1 run_on_grp2@grp2</code></pre>
|
||||||
|
|
||||||
<p>Output:</p>
|
<p>Output:</p>
|
||||||
|
|
||||||
|
|
|
@ -1387,9 +1387,9 @@ Output:
|
||||||
|
|
||||||
Servers can be put into groups by prepending '@groupname' to the
|
Servers can be put into groups by prepending '@groupname' to the
|
||||||
server and the group can then be selected by appending '@groupname' to
|
server and the group can then be selected by appending '@groupname' to
|
||||||
the argument if using '--hostgrp'.
|
the argument if using '--hostgroup'.
|
||||||
|
|
||||||
parallel --hostgrp -S @grp1/$SERVER1 -S @grp2/SERVER2 echo {} ::: run_on_grp1@grp1 run_on_grp2@grp2
|
parallel --hostgroup -S @grp1/$SERVER1 -S @grp2/$SERVER2 echo {} ::: run_on_grp1@grp1 run_on_grp2@grp2
|
||||||
|
|
||||||
Output:
|
Output:
|
||||||
|
|
||||||
|
|
|
@ -65,3 +65,59 @@ echo '### bug #44143: csh and nice'
|
||||||
parallel --nice 1 -S csh@lo setenv B {}\; echo '$B' ::: OK
|
parallel --nice 1 -S csh@lo setenv B {}\; echo '$B' ::: OK
|
||||||
|
|
||||||
EOF
|
EOF
|
||||||
|
|
||||||
|
echo
|
||||||
|
echo "### Fish environment"
|
||||||
|
stdout ssh -q fish@lo <<'EOS' | grep -v 'packages can be updated.'
|
||||||
|
alias alias_echo=echo;
|
||||||
|
function func_echo
|
||||||
|
echo $argv;
|
||||||
|
end
|
||||||
|
function env_parallel
|
||||||
|
setenv PARALLEL_ENV (functions -n | perl -pe 's/,/\n/g' | while read d; functions $d; end|perl -pe 's/\n/\001/')
|
||||||
|
parallel $argv;
|
||||||
|
set -e PARALLEL_ENV
|
||||||
|
end
|
||||||
|
env_parallel alias_echo ::: alias_works
|
||||||
|
env_parallel func_echo ::: function_works
|
||||||
|
env_parallel -S fish@lo alias_echo ::: alias_works_over_ssh
|
||||||
|
env_parallel -S fish@lo func_echo ::: function_works_over_ssh
|
||||||
|
EOS
|
||||||
|
|
||||||
|
echo
|
||||||
|
echo "### Zsh environment"
|
||||||
|
stdout ssh -q zsh@lo <<'EOS' | grep -v 'packages can be updated.'
|
||||||
|
alias alias_echo=echo;
|
||||||
|
func_echo() {
|
||||||
|
echo $*;
|
||||||
|
}
|
||||||
|
env_parallel() {
|
||||||
|
PARALLEL_ENV="$(typeset -f)";
|
||||||
|
export PARALLEL_ENV
|
||||||
|
`which parallel` "$@";
|
||||||
|
unset PARALLEL_ENV;
|
||||||
|
}
|
||||||
|
env_parallel alias_echo ::: alias_does_not_work
|
||||||
|
env_parallel func_echo ::: function_works
|
||||||
|
env_parallel -S zsh@lo alias_echo ::: alias_does_not_work_over_ssh
|
||||||
|
env_parallel -S zsh@lo func_echo ::: function_works_over_ssh
|
||||||
|
EOS
|
||||||
|
|
||||||
|
echo
|
||||||
|
echo "### Ksh environment"
|
||||||
|
stdout ssh -q ksh@lo <<'EOS' | grep -v 'packages can be updated.'
|
||||||
|
alias alias_echo=echo;
|
||||||
|
func_echo() {
|
||||||
|
echo $*;
|
||||||
|
}
|
||||||
|
env_parallel() {
|
||||||
|
export PARALLEL_ENV="$(alias | perl -pe 's/^/alias /';typeset -p;typeset -f)";
|
||||||
|
`which parallel` "$@";
|
||||||
|
unset PARALLEL_ENV;
|
||||||
|
}
|
||||||
|
env_parallel alias_echo ::: alias_works
|
||||||
|
env_parallel func_echo ::: function_works
|
||||||
|
env_parallel -S ksh@lo alias_echo ::: alias_works_over_ssh
|
||||||
|
env_parallel -S ksh@lo func_echo ::: function_works_over_ssh
|
||||||
|
EOS
|
||||||
|
|
||||||
|
|
|
@ -24,7 +24,7 @@ perl -ne '$/="\n\n"; /^Output/../^[^O]\S/ and next; /^ / and print;' ../../src/
|
||||||
stdout parallel -j7 -vd'\n\n' |
|
stdout parallel -j7 -vd'\n\n' |
|
||||||
perl -pe '$|=1;
|
perl -pe '$|=1;
|
||||||
# --tmux
|
# --tmux
|
||||||
s:(/tmp\S+)(/tms).....:$1XXXXX$2:;
|
s:(/tmp\S+)(tms).....:$1$2XXXXX:;
|
||||||
# --files
|
# --files
|
||||||
s:(/tmp\S+par).....(\....):$1XXXXX$2:;
|
s:(/tmp\S+par).....(\....):$1XXXXX$2:;
|
||||||
# --eta --progress
|
# --eta --progress
|
||||||
|
|
|
@ -69,3 +69,42 @@ echo '### bug #44143: csh and nice'
|
||||||
### bug #44143: csh and nice
|
### bug #44143: csh and nice
|
||||||
parallel --nice 1 -S csh@lo setenv B {}\; echo '$B' ::: OK
|
parallel --nice 1 -S csh@lo setenv B {}\; echo '$B' ::: OK
|
||||||
OK
|
OK
|
||||||
|
|
||||||
|
### Fish environment
|
||||||
|
Welcome to Linux Mint 17 Qiana (GNU/Linux 3.16.0-31-lowlatency x86_64)
|
||||||
|
|
||||||
|
Welcome to Linux Mint
|
||||||
|
* Documentation: http://www.linuxmint.com
|
||||||
|
|
||||||
|
0 updates are security updates.
|
||||||
|
|
||||||
|
alias_works
|
||||||
|
function_works
|
||||||
|
alias_works_over_ssh
|
||||||
|
function_works_over_ssh
|
||||||
|
|
||||||
|
### Zsh environment
|
||||||
|
Welcome to Linux Mint 17 Qiana (GNU/Linux 3.16.0-31-lowlatency x86_64)
|
||||||
|
|
||||||
|
Welcome to Linux Mint
|
||||||
|
* Documentation: http://www.linuxmint.com
|
||||||
|
|
||||||
|
0 updates are security updates.
|
||||||
|
|
||||||
|
zsh:10: command not found: alias_echo
|
||||||
|
function_works
|
||||||
|
zsh:10: command not found: alias_echo
|
||||||
|
function_works_over_ssh
|
||||||
|
|
||||||
|
### Ksh environment
|
||||||
|
Welcome to Linux Mint 17 Qiana (GNU/Linux 3.16.0-31-lowlatency x86_64)
|
||||||
|
|
||||||
|
Welcome to Linux Mint
|
||||||
|
* Documentation: http://www.linuxmint.com
|
||||||
|
|
||||||
|
0 updates are security updates.
|
||||||
|
|
||||||
|
alias_works
|
||||||
|
function_works
|
||||||
|
alias_works_over_ssh
|
||||||
|
function_works_over_ssh
|
||||||
|
|
|
@ -90,7 +90,7 @@ With script in $PARALLEL /bin/bash=/home/tange/privat/parallel/testsuite
|
||||||
echo '### bug #42892: parallel -a nonexiting --pipepart'
|
echo '### bug #42892: parallel -a nonexiting --pipepart'
|
||||||
### bug #42892: parallel -a nonexiting --pipepart
|
### bug #42892: parallel -a nonexiting --pipepart
|
||||||
parallel --pipepart -a nonexisting wc
|
parallel --pipepart -a nonexisting wc
|
||||||
parallel: Error: Cannot open input file `nonexisting': No such file or directory.
|
parallel: Error: nonexisting is not a seekable file.
|
||||||
echo '### bug #42913: Dont use $SHELL but the shell currently running'
|
echo '### bug #42913: Dont use $SHELL but the shell currently running'
|
||||||
### bug #42913: Dont use $SHELL but the shell currently running
|
### bug #42913: Dont use $SHELL but the shell currently running
|
||||||
echo '## Unknown shell => $SHELL (bash)'
|
echo '## Unknown shell => $SHELL (bash)'
|
||||||
|
|
|
@ -404,10 +404,38 @@ B D
|
||||||
wait
|
wait
|
||||||
3
|
3
|
||||||
parallel --use-cpus-instead-of-cores -N0 sleep 1 :::: num8
|
parallel --use-cpus-instead-of-cores -N0 sleep 1 :::: num8
|
||||||
|
parallel --shuf echo ::: 1 2 3 ::: a b c ::: A B C
|
||||||
|
123 abc ABC
|
||||||
|
123 abc ABC
|
||||||
|
123 abc ABC
|
||||||
|
123 abc ABC
|
||||||
|
123 abc ABC
|
||||||
|
123 abc ABC
|
||||||
|
123 abc ABC
|
||||||
|
123 abc ABC
|
||||||
|
123 abc ABC
|
||||||
|
123 abc ABC
|
||||||
|
123 abc ABC
|
||||||
|
123 abc ABC
|
||||||
|
123 abc ABC
|
||||||
|
123 abc ABC
|
||||||
|
123 abc ABC
|
||||||
|
123 abc ABC
|
||||||
|
123 abc ABC
|
||||||
|
123 abc ABC
|
||||||
|
123 abc ABC
|
||||||
|
123 abc ABC
|
||||||
|
123 abc ABC
|
||||||
|
123 abc ABC
|
||||||
|
123 abc ABC
|
||||||
|
123 abc ABC
|
||||||
|
123 abc ABC
|
||||||
|
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-tutorialXXXXX/tms attach
|
See output with: tmux -S /tmp/parallel-tutorial/tmsXXXXX attach
|
||||||
tmux -S /tmp/parXXXXX.tms 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
|
||||||
Starting 1
|
Starting 1
|
||||||
|
@ -446,7 +474,7 @@ BASE64 parallel --joblog /tmp/log exit ::: 1 2 3 0
|
||||||
cat /tmp/log;
|
cat /tmp/log;
|
||||||
parallel --resume-failed --joblog /tmp/log exit ::: 1 2 3 0 0 0
|
parallel --resume-failed --joblog /tmp/log exit ::: 1 2 3 0 0 0
|
||||||
cat /tmp/log;
|
cat /tmp/log;
|
||||||
parallel -j2 --halt 1 echo {}\; exit {} ::: 0 0 1 2 3
|
parallel -j2 --halt soon,fail=1 echo {}\; exit {} ::: 0 0 1 2 3
|
||||||
Seq Host Starttime JobRuntime Send Receive Exitval Signal Command
|
Seq Host Starttime JobRuntime Send Receive Exitval Signal Command
|
||||||
1 : TIMESTAMP 9.999 0 0 1 0 exit 1
|
1 : TIMESTAMP 9.999 0 0 1 0 exit 1
|
||||||
2 : TIMESTAMP 9.999 0 0 2 0 exit 2
|
2 : TIMESTAMP 9.999 0 0 2 0 exit 2
|
||||||
|
@ -483,14 +511,13 @@ echo 1; exit 1
|
||||||
parallel: Starting no more jobs. Waiting for 1 jobs to finish.
|
parallel: Starting no more jobs. Waiting for 1 jobs to finish.
|
||||||
parallel: This job failed:
|
parallel: This job failed:
|
||||||
echo 2; exit 2
|
echo 2; exit 2
|
||||||
parallel -j2 --halt 2 echo {}\; exit {} ::: 0 0 1 2 3
|
parallel -j2 --halt now,fail=1 echo {}\; exit {} ::: 0 0 1 2 3
|
||||||
0
|
0
|
||||||
0
|
0
|
||||||
1
|
1
|
||||||
parallel: This job failed:
|
parallel: This job failed:
|
||||||
echo 1; exit 1
|
echo 1; exit 1
|
||||||
parallel -j2 --halt 20% echo {}\; exit {} ::: 0 0 1 2 3 4 5 6 7
|
parallel -j2 --halt soon,fail=20% echo {}\; exit {} ::: 0 1 2 3 4 5 6 7 8 9
|
||||||
0
|
|
||||||
0
|
0
|
||||||
1
|
1
|
||||||
2
|
2
|
||||||
|
@ -502,6 +529,15 @@ echo 2; exit 2
|
||||||
parallel: Starting no more jobs. Waiting for 1 jobs to finish.
|
parallel: Starting no more jobs. Waiting for 1 jobs to finish.
|
||||||
parallel: This job failed:
|
parallel: This job failed:
|
||||||
echo 3; exit 3
|
echo 3; exit 3
|
||||||
|
parallel -j2 --halt soon,success=1 echo {}\; exit {} ::: 1 2 3 0 4 5 6
|
||||||
|
1
|
||||||
|
2
|
||||||
|
3
|
||||||
|
0
|
||||||
|
4
|
||||||
|
parallel: This job succeeded:
|
||||||
|
echo 0; exit 0
|
||||||
|
parallel: Starting no more jobs. Waiting for 1 jobs to finish.
|
||||||
parallel -k --retries 3 'echo tried {} >>/tmp/runs; echo completed {}; exit {}' ::: 1 2 0
|
parallel -k --retries 3 'echo tried {} >>/tmp/runs; echo completed {}; exit {}' ::: 1 2 0
|
||||||
cat /tmp/runs
|
cat /tmp/runs
|
||||||
completed 1
|
completed 1
|
||||||
|
@ -540,6 +576,9 @@ more
|
||||||
hosts
|
hosts
|
||||||
parallel -S 4/$SERVER1 echo force {} cpus on server ::: 4
|
parallel -S 4/$SERVER1 echo force {} cpus on server ::: 4
|
||||||
force 4 cpus on server
|
force 4 cpus on server
|
||||||
|
parallel --hostgroup -S @grp1/$SERVER1 -S @grp2/$SERVER2 echo {} ::: run_on_grp1@grp1 run_on_grp2@grp2
|
||||||
|
run_on_grp1
|
||||||
|
run_on_grp2
|
||||||
echo This is input_file > input_file
|
echo This is input_file > input_file
|
||||||
parallel -S $SERVER1 --transfer cat ::: input_file
|
parallel -S $SERVER1 --transfer cat ::: input_file
|
||||||
This is input_file
|
This is input_file
|
||||||
|
@ -895,6 +934,15 @@ The second finished
|
||||||
Fourth started
|
Fourth started
|
||||||
The third finished
|
The third finished
|
||||||
The fourth finished
|
The fourth finished
|
||||||
|
sem --id foo -u 'echo Slow started; sleep 5; echo Slow ended' &&
|
||||||
|
sem --id foo --semaphoretimeout 1 'echo Force this running after 1 sec' &&
|
||||||
|
sem --id foo --semaphoretimeout -2 'echo Give up after 1 sec'
|
||||||
|
sem --id foo --wait
|
||||||
|
Slow started
|
||||||
|
Force this running after 1 sec
|
||||||
|
Slow ended
|
||||||
|
parallel: Warning: Semaphore timed out. Stealing the semaphore.
|
||||||
|
parallel: Warning: Semaphore timed out. Exiting.
|
||||||
parallel --help
|
parallel --help
|
||||||
Usage:
|
Usage:
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue