Compare commits

..

5 commits

58 changed files with 1605 additions and 635 deletions

View file

@ -14,6 +14,10 @@ License: GPL-3.0-or-later
Files: doc/citation-notice-faq.txt CREDITS NEWS README src/parallel_cheat_bw.fodt packager/debian/README doc/parallel*directive doc/screenshot.png
Copyright: 2007-2022 Ole Tange, http://ole.tange.dk and Free Software Foundation, Inc.
License: GFDL-1.3-or-later
Files: doc/citation-notice-faq.txt CREDITS NEWS README src/parallel_cheat_bw.fodt packager/debian/README doc/parallel*directive doc/screenshot.png
Copyright: 2007-2022 Ole Tange, http://ole.tange.dk and Free Software Foundation, Inc.
# Dual license - copy of the previous paragraph
License: CC-BY-SA-4.0
Files: testsuite/input-files/perl-v5.14.2/* testsuite/input-files/perllib/*

26
NEWS
View file

@ -1,3 +1,29 @@
20240722
New in this release:
* No new features. This is a candidate for a stable release.
* Bug fixes and man page updates.
News about GNU Parallel:
* Scientific Workflows at Scale using GNU Parallel
https://web.cvent.com/event/f318e73c-2230-432a-a044-b75625020543/websitePage:afd80266-008e-414b-9f94-2fd9b4dd1924?session=fe79a785-ec60-414c-8d2b-c29208f53d4c&shareLink=true
* Use GNU Parallel to render blender movies distributed by a bunch of
nodes https://github.com/tfmoraes/blender_gnu_parallel_render
* Lessons Learned from Scaling to Multi-Terabyte Datasets
https://v2thegreat.com/2024/06/19/lessons-learned-from-scaling-to-multi-terabyte-datasets/
* Efisiensi Maksimal: Cara Paralelisasi Perintah di CLI Linux
https://medium.com/@nfrozi/efisiensi-maksimal-cara-paralelisasi-perintah-di-cli-linux-f4fda3afe2a0
* Introduction to GNU parallel
https://datascience.101workbook.org/06-hpc/06-parallel/01-intro-to-gnu-parallel/#gsc.tab=0
20240622
New in this release:

24
README
View file

@ -57,11 +57,11 @@ document.
Full installation of GNU Parallel is as simple as:
wget https://ftpmirror.gnu.org/parallel/parallel-20240622.tar.bz2
wget https://ftpmirror.gnu.org/parallel/parallel-20240622.tar.bz2.sig
gpg parallel-20240622.tar.bz2.sig
bzip2 -dc parallel-20240622.tar.bz2 | tar xvf -
cd parallel-20240622
wget https://ftpmirror.gnu.org/parallel/parallel-20240722.tar.bz2
wget https://ftpmirror.gnu.org/parallel/parallel-20240722.tar.bz2.sig
gpg parallel-20240722.tar.bz2.sig
bzip2 -dc parallel-20240722.tar.bz2 | tar xvf -
cd parallel-20240722
./configure && make && sudo make install
@ -70,11 +70,11 @@ Full installation of GNU Parallel is as simple as:
If you are not root you can add ~/bin to your path and install in
~/bin and ~/share:
wget https://ftpmirror.gnu.org/parallel/parallel-20240622.tar.bz2
wget https://ftpmirror.gnu.org/parallel/parallel-20240622.tar.bz2.sig
gpg parallel-20240622.tar.bz2.sig
bzip2 -dc parallel-20240622.tar.bz2 | tar xvf -
cd parallel-20240622
wget https://ftpmirror.gnu.org/parallel/parallel-20240722.tar.bz2
wget https://ftpmirror.gnu.org/parallel/parallel-20240722.tar.bz2.sig
gpg parallel-20240722.tar.bz2.sig
bzip2 -dc parallel-20240722.tar.bz2 | tar xvf -
cd parallel-20240722
./configure --prefix=$HOME && make && make install
Or if your system lacks 'make' you can simply copy src/parallel
@ -122,8 +122,8 @@ will love you for it.
When using programs that use GNU Parallel to process data for
publication please cite:
Tange, O. (2024, June 22). GNU Parallel 20240622 ('34 counts').
Zenodo. https://doi.org/10.5281/zenodo.12518196
Tange, O. (2024, July 22). GNU Parallel 20240722 ('Assange').
Zenodo. https://doi.org/10.5281/zenodo.12789352
Copyright (C) 2007-2022 Ole Tange, http://ole.tange.dk and Free
Software Foundation, Inc.

20
configure vendored
View file

@ -1,6 +1,6 @@
#! /bin/sh
# Guess values for system-dependent variables and create Makefiles.
# Generated by GNU Autoconf 2.71 for parallel 20240622.
# Generated by GNU Autoconf 2.71 for parallel 20240722.
#
# Report bugs to <bug-parallel@gnu.org>.
#
@ -610,8 +610,8 @@ MAKEFLAGS=
# Identity of this package.
PACKAGE_NAME='parallel'
PACKAGE_TARNAME='parallel'
PACKAGE_VERSION='20240622'
PACKAGE_STRING='parallel 20240622'
PACKAGE_VERSION='20240722'
PACKAGE_STRING='parallel 20240722'
PACKAGE_BUGREPORT='bug-parallel@gnu.org'
PACKAGE_URL=''
@ -1246,7 +1246,7 @@ if test "$ac_init_help" = "long"; then
# Omit some internal or obsolete options to make the list less imposing.
# This message is too long to be a string in the A/UX 3.1 sh.
cat <<_ACEOF
\`configure' configures parallel 20240622 to adapt to many kinds of systems.
\`configure' configures parallel 20240722 to adapt to many kinds of systems.
Usage: $0 [OPTION]... [VAR=VALUE]...
@ -1313,7 +1313,7 @@ fi
if test -n "$ac_init_help"; then
case $ac_init_help in
short | recursive ) echo "Configuration of parallel 20240622:";;
short | recursive ) echo "Configuration of parallel 20240722:";;
esac
cat <<\_ACEOF
@ -1390,7 +1390,7 @@ fi
test -n "$ac_init_help" && exit $ac_status
if $ac_init_version; then
cat <<\_ACEOF
parallel configure 20240622
parallel configure 20240722
generated by GNU Autoconf 2.71
Copyright (C) 2021 Free Software Foundation, Inc.
@ -1427,7 +1427,7 @@ cat >config.log <<_ACEOF
This file contains any messages produced by compilers while
running configure, to aid debugging if configure makes a mistake.
It was created by parallel $as_me 20240622, which was
It was created by parallel $as_me 20240722, which was
generated by GNU Autoconf 2.71. Invocation command line was
$ $0$ac_configure_args_raw
@ -2379,7 +2379,7 @@ fi
# Define the identity of the package.
PACKAGE='parallel'
VERSION='20240622'
VERSION='20240722'
printf "%s\n" "#define PACKAGE \"$PACKAGE\"" >>confdefs.h
@ -3026,7 +3026,7 @@ cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
# report actual input values of CONFIG_FILES etc. instead of their
# values after options handling.
ac_log="
This file was extended by parallel $as_me 20240622, which was
This file was extended by parallel $as_me 20240722, which was
generated by GNU Autoconf 2.71. Invocation command line was
CONFIG_FILES = $CONFIG_FILES
@ -3090,7 +3090,7 @@ ac_cs_config_escaped=`printf "%s\n" "$ac_cs_config" | sed "s/^ //; s/'/'\\\\\\\\
cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
ac_cs_config='$ac_cs_config_escaped'
ac_cs_version="\\
parallel config.status 20240622
parallel config.status 20240722
configured by $0, generated by GNU Autoconf 2.71,
with options \\"\$ac_cs_config\\"

View file

@ -1,4 +1,4 @@
AC_INIT([parallel],[20240622],[bug-parallel@gnu.org])
AC_INIT([parallel],[20240722],[bug-parallel@gnu.org])
AM_INIT_AUTOMAKE([-Wall -Werror foreign])
AC_CONFIG_HEADERS([config.h])
AC_CONFIG_FILES([

View file

@ -15,14 +15,14 @@ Output is in sync
write a haiku about gnu parallel and the :::+ option
o GNU Parallel é muito foda, acabei de usar ele pra dividir um CSV
-- @pumpkin_link@twitter Johnny Cage.dev
GNU Parallel and Tmux are the two tools I rely on daily for my work. Indispensable.
-- @mitchelvalentino1569@YouTube
parallel is frickin great for launching jobs on multiple
machines. Ansible and Jenkins and others may be good too but I was
able to jump right in with parallel.
-- dwhite21787@reddit
今始めて知ったが GNU parallel ってコマンドクソ便利じゃん。なんで今まで自分のアンテナに引っかからなかったんだろう…。
-- @kawaz@twitter Yoshiaki Kawazu
Big fan of GNU parallel!
-- lovelyloafers@reddit
@ -221,6 +221,11 @@ https://negfeedback.blogspot.com/2020/05/indispensable-command-line-tools.html
=== Used ===
parallel is frickin great for launching jobs on multiple
machines. Ansible and Jenkins and others may be good too but I was
able to jump right in with parallel.
-- dwhite21787@reddit
The most glorious 15,000 lines of Perl ever written.
-- @nibblrrr7124@YouTube

View file

@ -245,14 +245,10 @@ http://freshmeat.net/projects/parallel/releases/new
https://hostux.social/@GNU_Parallel
# Dead: https://joindiaspora.com/stream
New release of #GNU Parallel pi.dk/0
New in this release pi.dk/2
See the intro videos pi.dk/1
10 secs installation: https://git.savannah.gnu.org/cgit/parallel.git/tree/README
Aspect: Public
10 secs installation: pi.dk/3
GNU Parallel - for people who live life in the parallel lane.
@ -272,24 +268,34 @@ from:tange@gnu.org
to:parallel@gnu.org, bug-parallel@gnu.org
stable-bcc: Jesse Alama <jessealama@fastmail.fm>
Subject: GNU Parallel 20240622 ('34 counts') released
Subject: GNU Parallel 20240722 ('Assange') released [stable]
GNU Parallel 20240622 ('34 counts') has been released. It is available for download at: lbry://@GnuParallel:4
GNU Parallel 20240722 ('Assange') has been released. It is available for download at: lbry://@GnuParallel:4
Quote of the month:
The most glorious 15,000 lines of Perl ever written.
-- @nibblrrr7124@YouTube
parallel is frickin great for launching jobs on multiple
machines. Ansible and Jenkins and others may be good too but I was
able to jump right in with parallel.
-- dwhite21787@reddit
New in this release:
* No new features. This is a candidate for a stable release.
* Bug fixes and man page updates.
News about GNU Parallel:
* Howto - Parallel: lanciare comandi in simultanea https://github.com/linuxhubit/linuxhub.it/blob/main/_posts/2024-06-14-howto-parallel-per-lanciare-comandi-in-simultanea.md
* Scientific Workflows at Scale using GNU Parallel https://web.cvent.com/event/f318e73c-2230-432a-a044-b75625020543/websitePage:afd80266-008e-414b-9f94-2fd9b4dd1924?session=fe79a785-ec60-414c-8d2b-c29208f53d4c&shareLink=true
* Implementing Concurrency in Shell Scripts https://dev.to/siddhantkcode/implementing-concurrency-in-shell-scripts-521o
* Use GNU Parallel to render blender movies distributed by a bunch of nodes https://github.com/tfmoraes/blender_gnu_parallel_render
* Lessons Learned from Scaling to Multi-Terabyte Datasets https://v2thegreat.com/2024/06/19/lessons-learned-from-scaling-to-multi-terabyte-datasets/
* Efisiensi Maksimal: Cara Paralelisasi Perintah di CLI Linux https://medium.com/@nfrozi/efisiensi-maksimal-cara-paralelisasi-perintah-di-cli-linux-f4fda3afe2a0
* Introduction to GNU parallel https://datascience.101workbook.org/06-hpc/06-parallel/01-intro-to-gnu-parallel/#gsc.tab=0
GNU Parallel - For people who live life in the parallel lane.

View file

@ -1,8 +1,8 @@
<directory name="parallel" rev="389" vrev="2" srcmd5="8dc4fed077745f6e2807891e42f73703">
<directory name="parallel" rev="390" vrev="2" srcmd5="491dbee376ddabe7e9acf3e6dd268f7b">
<entry name="Makefile" md5="a165cdcca90c744dc5a5b17cde72ad8e" size="1182" mtime="1698101769" />
<entry name="PKGBUILD" md5="d9d67ae64d3839f14e461846f34ac714" size="714" mtime="1719249737" />
<entry name="parallel-20240622.tar.bz2" md5="68ff354e027014e83570e44895b4cf66" size="2570487" mtime="1719249790" />
<entry name="parallel.spec" md5="2df5ce1371be81fb1a3cb5f3f9fda974" size="6224" mtime="1719249792" />
<entry name="parallel_20240622.dsc" md5="ed82106cb7f6002906855500479977e2" size="556" mtime="1719249793" />
<entry name="parallel_20240622.tar.gz" md5="6ce704b44dfcd122c98aaaa4d06a51c5" size="2840248" mtime="1719249808" />
<entry name="PKGBUILD" md5="16b2780a64ee18b0df1060680cec804c" size="714" mtime="1721531636" />
<entry name="parallel-20240722.tar.bz2" md5="e6bdcd2fa790b2096665ed05850bbe53" size="2617438" mtime="1721531681" />
<entry name="parallel.spec" md5="d49c3a3bd1906e68ad98cf2377b3d8ea" size="6224" mtime="1721531682" />
<entry name="parallel_20240722.dsc" md5="13bb25db4380d128d45b57f95d1422e0" size="556" mtime="1721531683" />
<entry name="parallel_20240722.tar.gz" md5="0229f60e3fe8aabc84dd7a908ff6bb11" size="2883193" mtime="1721531695" />
</directory>

View file

@ -1,7 +1,7 @@
Summary: Shell tool for executing jobs in parallel
Name: parallel
Version: 20240622
Version: 20240722
Release: 2.1
License: GPL-3.0-or-later
Group: Productivity/File utilities

View file

@ -601,7 +601,7 @@ _parset_main() {
fi
if [ "$_parset_NAME" = "--version" ] ; then
# shellcheck disable=SC2006
echo "parset 20240622 (GNU parallel `parallel --minversion 1`)"
echo "parset 20240722 (GNU parallel `parallel --minversion 1`)"
echo "Copyright (C) 2007-2024 Ole Tange, http://ole.tange.dk and Free Software"
echo "Foundation, Inc."
echo "License GPLv3+: GNU GPL version 3 or later <https://gnu.org/licenses/gpl.html>"

View file

@ -605,7 +605,7 @@ _parset_main() {
fi
if [ "$_parset_NAME" = "--version" ] ; then
# shellcheck disable=SC2006
echo "parset 20240622 (GNU parallel `parallel --minversion 1`)"
echo "parset 20240722 (GNU parallel `parallel --minversion 1`)"
echo "Copyright (C) 2007-2024 Ole Tange, http://ole.tange.dk and Free Software"
echo "Foundation, Inc."
echo "License GPLv3+: GNU GPL version 3 or later <https://gnu.org/licenses/gpl.html>"

View file

@ -30,8 +30,14 @@
set _parallel_exit_CODE=0
if ("`alias env_parallel`" == '' || ! $?PARALLEL_CSH) then
# Activate alias
alias env_parallel '(setenv PARALLEL_CSH "\!*"; source `which env_parallel.csh`)'
set _parallel_eNv_pAtH=`which env_parallel.csh`
if ( $status == 0 ) then
# Activate alias
alias env_parallel '(setenv PARALLEL_CSH "\!*"; source '$_parallel_eNv_pAtH')'
unset _parallel_eNv_pAtH
else
echo 'env_parallel: Error: env_parallel.csh must be in $PATH ('$PATH')'
endif
else
# Get the --env variables if set
# --env _ should be ignored

View file

@ -601,7 +601,7 @@ _parset_main() {
fi
if [ "$_parset_NAME" = "--version" ] ; then
# shellcheck disable=SC2006
echo "parset 20240622 (GNU parallel `parallel --minversion 1`)"
echo "parset 20240722 (GNU parallel `parallel --minversion 1`)"
echo "Copyright (C) 2007-2024 Ole Tange, http://ole.tange.dk and Free Software"
echo "Foundation, Inc."
echo "License GPLv3+: GNU GPL version 3 or later <https://gnu.org/licenses/gpl.html>"

View file

@ -129,7 +129,8 @@ function env_parallel
perl -ne 'chomp;
($name,$val)=split(/ /,$_,2);
$name=~/^(HOME|USER|COLUMNS|FISH_VERSION|LINES|PWD|SHLVL|_|
history|status|version)$|\./x and next;
fish_kill_signal|fish_pid|history|hostname|status|
status_generation|version)$|\./x and next;
if($val=~/^'"'"'/) { next; }
print "set $name \"\$$name\";\n";
')
@ -160,7 +161,8 @@ function env_parallel
($name,$val)=split(/ /,$_,2);
# Ignore read-only vars
$name=~/^(HOME|USER|COLUMNS|FISH_VERSION|LINES|PWD|SHLVL|_|
fish_pid|history|hostname|status|version)$/x and next;
fish_kill_signal|fish_pid|history|hostname|status|
status_generation|version)$/x and next;
# Single quote $val
if($val =~ /[^-_.+a-z0-9\/]/i) {
$val =~ s/\047/\047"\047"\047/g; # "-quote single quotes

View file

@ -601,7 +601,7 @@ _parset_main() {
fi
if [ "$_parset_NAME" = "--version" ] ; then
# shellcheck disable=SC2006
echo "parset 20240622 (GNU parallel `parallel --minversion 1`)"
echo "parset 20240722 (GNU parallel `parallel --minversion 1`)"
echo "Copyright (C) 2007-2024 Ole Tange, http://ole.tange.dk and Free Software"
echo "Foundation, Inc."
echo "License GPLv3+: GNU GPL version 3 or later <https://gnu.org/licenses/gpl.html>"

View file

@ -570,7 +570,7 @@ _parset_main() {
fi
if [ "$_parset_NAME" = "--version" ] ; then
# shellcheck disable=SC2006
echo "parset 20240622 (GNU parallel `parallel --minversion 1`)"
echo "parset 20240722 (GNU parallel `parallel --minversion 1`)"
echo "Copyright (C) 2007-2024 Ole Tange, http://ole.tange.dk and Free Software"
echo "Foundation, Inc."
echo "License GPLv3+: GNU GPL version 3 or later <https://gnu.org/licenses/gpl.html>"

View file

@ -275,7 +275,7 @@ Due to a bug in Bash, aliases containing newlines must be followed by
a newline in the command. Some systems are not affected by this bug,
but will print a warning anyway.
=head2 csh
=head2 csh (alpha testing)
B<env_parallel> for B<csh> breaks B<$PARALLEL>, so do not use
B<$PARALLEL>.
@ -384,7 +384,7 @@ B<--session> is supported.
=back
=head2 fish
=head2 fish (alpha testing)
=head3 Installation
@ -434,6 +434,8 @@ B<--session> is supported.
=item arrays
Arrays normally work, but fail intermitently.
set myarray arrays work, too
env_parallel -k echo '$myarray[{}]' ::: 1 2 3
env_parallel -k -S server echo '$myarray[{}]' ::: 1 2 3
@ -677,7 +679,7 @@ B<--session> is supported.
=back
=head2 tcsh
=head2 tcsh (alpha testing)
B<env_parallel> for B<tcsh> breaks B<$PARALLEL>, so do not use
B<$PARALLEL>.

View file

@ -601,7 +601,7 @@ _parset_main() {
fi
if [ "$_parset_NAME" = "--version" ] ; then
# shellcheck disable=SC2006
echo "parset 20240622 (GNU parallel `parallel --minversion 1`)"
echo "parset 20240722 (GNU parallel `parallel --minversion 1`)"
echo "Copyright (C) 2007-2024 Ole Tange, http://ole.tange.dk and Free Software"
echo "Foundation, Inc."
echo "License GPLv3+: GNU GPL version 3 or later <https://gnu.org/licenses/gpl.html>"

View file

@ -30,8 +30,15 @@
set _parallel_exit_CODE=0
if ("`alias env_parallel`" == '' || ! $?PARALLEL_CSH) then
# Activate alias
alias env_parallel '(setenv PARALLEL_CSH "\!*"; source `which env_parallel.csh`)'
set _parallel_eNv_pAtH=`which env_parallel.tcsh`
if ( $status == 0 ) then
# Activate alias
alias env_parallel '(setenv PARALLEL_CSH "\!*"; source '$_parallel_eNv_pAtH')'
unset _parallel_eNv_pAtH
else
echo 'env_parallel: Error: env_parallel.tcsh must be in $PATH ('$PATH')'
unset _parallel_eNv_pAtH
endif
else
# Get the --env variables if set
# --env _ should be ignored

View file

@ -601,7 +601,7 @@ _parset_main() {
fi
if [ "$_parset_NAME" = "--version" ] ; then
# shellcheck disable=SC2006
echo "parset 20240622 (GNU parallel `parallel --minversion 1`)"
echo "parset 20240722 (GNU parallel `parallel --minversion 1`)"
echo "Copyright (C) 2007-2024 Ole Tange, http://ole.tange.dk and Free Software"
echo "Foundation, Inc."
echo "License GPLv3+: GNU GPL version 3 or later <https://gnu.org/licenses/gpl.html>"

View file

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

View file

@ -1980,7 +1980,7 @@ sub options_completion_hash() {
"gnu[Behave like GNU parallel]" => \$opt::gnu,
"link|xapply[Link input sources]" => \$opt::link,
"linkinputsource|xapplyinputsource=i" => \@opt::linkinputsource,
# Before changing these lines, please read
# Before changing these lines, please read
# https://www.gnu.org/software/parallel/parallel_design.html#citation-notice
# https://git.savannah.gnu.org/cgit/parallel.git/tree/doc/citation-notice-faq.txt
# You accept to be put in a public hall-of-shame by removing
@ -2561,7 +2561,7 @@ sub parse_options(@) {
# If you want GNU Parallel to be maintained in the future you
# should keep this.
# *YOU* will be harming free software by removing the notice.
# _YOU_ will be harming free software by removing the notice.
#
# Funding a free software project is hard. GNU Parallel is no
# exception. On top of that it seems the less visible a project
@ -2603,6 +2603,10 @@ sub parse_options(@) {
# list. Ideas that will cost work and which have not been tested
# are, however, unlikely to be prioritized.
#
# _YOU_ will be harming free software by removing the notice. You
# accept to be added to a public hall of shame by removing the
# line. That includes you, George and Andreas.
#
# Please note that GPL version 3 gives you the right to fork GNU
# Parallel under a new name, but it does not give you the right to
# distribute modified copies with the citation notice disabled in
@ -2634,13 +2638,8 @@ sub parse_options(@) {
# This is because _YOU_ actively make it harder to justify
# spending time developing GNU Parallel by removing it.
# If you disagree, please read (especially 77-):
# If you disagree, please read (especially 77-):
# https://www.fordfoundation.org/media/2976/roads-and-bridges-the-unseen-labor-behind-our-digital-infrastructure.pdf
# *YOU* will be harming free software by removing the notice. You
# accept to be added to a public hall of shame by removing the
# line. That includes you, George and Andreas.
parse_halt();
if($ENV{'PARALLEL_ENV'}) {
@ -2794,7 +2793,7 @@ sub check_invalid_option_combinations() {
sub init_globals() {
# Defaults:
$Global::version = 20240622;
$Global::version = 20240722;
$Global::progname = 'parallel';
$::name = "GNU Parallel";
$Global::infinity = 2**31;
@ -5848,10 +5847,10 @@ sub usage() {
"If you use programs that use GNU Parallel to process data for an article in a",
"scientific publication, please cite:",
"",
" Tange, O. (2024, June 22). GNU Parallel 20240622 ('34 counts').",
" Zenodo. https://doi.org/10.5281/zenodo.12518196",
" Tange, O. (2024, July 22). GNU Parallel 20240722 ('Assange').",
" Zenodo. https://doi.org/10.5281/zenodo.12789352",
"",
# Before changing these lines, please read
# Before changing these lines, please read
# https://www.gnu.org/software/parallel/parallel_design.html#citation-notice
# https://git.savannah.gnu.org/cgit/parallel.git/tree/doc/citation-notice-faq.txt
# You accept to be put in a public hall of shame by removing
@ -5881,14 +5880,13 @@ sub citation_notice() {
"If you use programs that use GNU Parallel to process data for an article in a",
"scientific publication, please cite:",
"",
" Tange, O. (2024, June 22). GNU Parallel 20240622 ('34 counts').",
" Zenodo. https://doi.org/10.5281/zenodo.12518196",
" Tange, O. (2024, July 22). GNU Parallel 20240722 ('Assange').",
" Zenodo. https://doi.org/10.5281/zenodo.12789352",
"",
# Before changing these line, please read
# Before changing these line, please read
# https://www.gnu.org/software/parallel/parallel_design.html#citation-notice and
# https://git.savannah.gnu.org/cgit/parallel.git/tree/doc/citation-notice-faq.txt
# You accept to be put in a public hall of shame by
# removing these lines
# You accept to be put in a public hall of shame by removing these lines
"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.",
"",
@ -6009,20 +6007,20 @@ sub citation() {
"If you use programs that use GNU Parallel to process data for an article in a",
"scientific publication, please cite:",
"",
"\@software{tange_2024_12518196,",
"\@software{tange_2024_12789352,",
" author = {Tange, Ole},",
" title = {GNU Parallel 20240622 ('34 counts')},",
" month = Jun,",
" title = {GNU Parallel 20240722 ('Assange')},",
" month = Jul,",
" year = 2023,",
" note = {{GNU Parallel is a general parallelizer to run",
" multiple serial command line programs in parallel",
" without changing them.}},",
" publisher = {Zenodo},",
" doi = {10.5281/zenodo.12518196},",
" url = {https://doi.org/10.5281/zenodo.12518196}",
" doi = {10.5281/zenodo.12789352},",
" url = {https://doi.org/10.5281/zenodo.12789352}",
"}",
"",
"(Feel free to use \\nocite{tange_2024_12518196})",
"(Feel free to use \\nocite{tange_2024_12789352})",
"",
# Before changing these lines, please read
# https://www.gnu.org/software/parallel/parallel_design.html#citation-notice and
@ -6731,10 +6729,10 @@ sub which(@) {
if(not $regexp) {
# All shells known to mankind
#
# ash bash csh dash fdsh fish fizsh ksh ksh93 mksh pdksh
# ash bash csh dash fdsh fish fizsh ion ksh ksh93 mksh pdksh
# posh rbash rc rush rzsh sash sh static-sh tcsh yash zsh
my @shells = (qw(ash bash bsd-csh csh dash fdsh fish fizsh ksh
my @shells = (qw(ash bash bsd-csh csh dash fdsh fish fizsh ion ksh
ksh93 lksh mksh pdksh posh rbash rc rush rzsh sash sh
static-sh tcsh yash zsh -sh -csh -bash),
'-sh (sh)' # sh on FreeBSD
@ -6744,7 +6742,7 @@ sub which(@) {
# /bin/sh /sbin/sh /opt/csw/sh
# But not: foo.sh sshd crash flush pdflush scosh fsflush ssh
$shell = "(?:".join("|",map { "\Q$_\E" } @shells).")";
$regexp = '^((\[)(-?)('. $shell. ')(\])|(|\S+/|busybox )'.
$regexp = '^((\[)(-?)('. $shell. ')(\])|(|\S+/|\S*busybox |\S*rosetta )'.
'(-?)('. $shell. '))( *$| [^(])';
%fakename = (
# sh disguises itself as -sh (sh) on FreeBSD
@ -6776,6 +6774,11 @@ sub which(@) {
if(open(my $fd, "<", "/proc/$testpid/cmdline")) {
local $/="\0";
chomp($shellline = <$fd>);
if($shellline =~ /busybox$|rosetta$/) {
# Possibly: busybox \0 sh or .../rosetta \0 /bin/bash
# Skip busybox/rosetta
chomp($shellline = <$fd>);
}
if($shellline =~ /$regexp/o) {
my $shellname = $4 || $8;
my $dash = $3 || $7;
@ -8522,7 +8525,8 @@ sub user_requested_processes($) {
my $opt_P = shift;
my $processes;
if(defined $opt_P) {
if (-f $opt_P) {
if (-f $opt_P and not $opt_P =~ /^[-+]?\d+%?$/) {
# This is a file. Ignore files called +10% 4 -3
$Global::max_procs_file = $opt_P;
my $opt_P_file = ::slurp_or_exit($Global::max_procs_file);
if($opt_P_file !~ /\S/) {

View file

@ -1775,7 +1775,7 @@ If in doubt use B<-X> as that will most likely do what is needed.
See also: B<-X> B<--xargs>
=item B<--memfree> I<size> (alpha testing)
=item B<--memfree> I<size>
Minimum memory free when starting another job.
@ -1879,7 +1879,7 @@ is somewhat slower than B<--block>.
See also: UNIT PREFIX B<--pipe> B<--block> B<-m> B<-X> B<--max-args>
=item B<--nonall> (alpha testing)
=item B<--nonall>
B<--onall> with no arguments.
@ -1894,7 +1894,7 @@ servers.
See also: B<--onall> B<--sshlogin>
=item B<--onall> (alpha testing)
=item B<--onall>
Run all the jobs on all computers given with B<--sshlogin>.
@ -3896,10 +3896,14 @@ as 1M-12*2.024*2k.
GNU B<parallel> is very liberal in quoting. You only need to quote
characters that have special meaning in shell:
=for pod2rst next-code-block: text
( ) $ ` ' " < > ; | \
and depending on context these needs to be quoted, too:
=for pod2rst next-code-block: text
~ & ! ? space * { #
Therefore most people will never need more quoting than putting '\'
@ -4410,14 +4414,20 @@ you, file a bug-report.
If you get:
=for pod2rst next-code-block: text
Can't exec "command": No such file or directory
or:
=for pod2rst next-code-block: text
open3: exec of by command failed
or:
=for pod2rst next-code-block: text
/bin/bash: command: command not found
it may be because I<command> is not known, but it could also be

View file

@ -118,6 +118,10 @@ The following features are in some of the comparable tools:
=item E7. Only spawn new jobs if load is less than a limit
=item E8. Full command has non-zero exit value if one job has non-zero exit value
=item E9. Jobs can be started without reading all input first
=back
@ -183,7 +187,7 @@ parallel:
=item O1 O2 O3 O4 O5 O6 O7 O8 O9 O10
=item E1 E2 E3 E4 E5 E6 E7
=item E1 E2 E3 E4 E5 E6 E7 E8 E9
=item R1 R2 R3 R4 R5 R6 R7 R8 R9
@ -204,7 +208,7 @@ Summary (see legend above):
=item - O2 O3 - O5 O6
=item E1 - - - - - -
=item E1 - - - - - - E8 E9
=item - - - - - x - - -
@ -541,7 +545,7 @@ using GNU B<parallel>:
'pnmscale 0.5 | pnmtojpeg | sem --id diskio cat > th_{}'
https://www.gnu.org/software/pexec/
(Last checked: 2010-12)
(Last checked: 2024-06)
=head2 DIFFERENCES BETWEEN xjobs AND GNU Parallel
@ -614,7 +618,7 @@ using GNU B<parallel>:
1$ parallel mogrify -flip ::: *.jpg
https://github.com/exzombie/prll
(Last checked: 2019-01)
(Last checked: 2024-06)
=head2 DIFFERENCES BETWEEN dxargs AND GNU Parallel
@ -645,7 +649,7 @@ berlios.de/usage.html ported to GNU B<parallel>:
find dir -execdir sem cmd {} \;
https://github.com/cklin/mdm
(Last checked: 2019-01)
(Last checked: 2014-06)
=head2 DIFFERENCES BETWEEN xapply AND GNU Parallel
@ -708,8 +712,8 @@ using GNU B<parallel>:
11$ parallel '[ -f {} ] && echo {}' < List | ...
https://www.databits.net/~ksb/msrc/local/bin/xapply/xapply.html (Last
checked: 2010-12)
https://www.databits.net/~ksb/msrc/local/bin/xapply/xapply.html
(Last checked: 2010-12)
=head2 DIFFERENCES BETWEEN AIX apply AND GNU Parallel
@ -753,55 +757,358 @@ ssw_aix_71/com.ibm.aix.cmds1/apply.htm
=head2 DIFFERENCES BETWEEN paexec AND GNU Parallel
Summary (see legend above):
=over
=item I1 - - - - - I7
=item - - M3 - - -
=item (O1) O2 O3 (O4) (O5) O6 - O8 x -
=item E1 - - - (E5) - - -
=item R1 - - - x R6 - R8 R9
=item - -
=back
B<paexec> can run jobs in parallel on both the local and remote computers.
B<paexec> requires commands to print a blank line as the last
output. This means you will have to write a wrapper for most programs.
B<paexec> has a job dependency facility so a job can depend on another
job to be executed successfully. Sort of a poor-man's B<make>.
job to be executed successfully. Sort of a poor-man's B<make>. This
can partly be emulated in GNU B<parallel> with B<tsort>.
=head3 EXAMPLES FROM paexec's EXAMPLE CATALOG
B<paexec> fails if output of a single line is > 2 GB. Output of a 2 GB
line requires 6 GB RAM. Lines of standard output is interleaved (but
there is no half line mixing), and output of standard error
mixes. Combined with B<paexec_reorder> output order can be the same as
input order. In certain situations B<paexec> will eat the last newline
of standard output.
Here are the examples from B<paexec>'s example catalog with the equivalent
There seems to be no way to make 4 jobs run on a remote server with 4
cores and 16 jobs on a remote server with 16 cores.
=head3 EXAMPLES FROM man paexec
Here are the examples from B<man paexec> with the equivalent using GNU
B<parallel>.
1$ paexec -t '/usr/bin/ssh -x' -n 'host1 host2 host3' \
-le -g -c calculate-me < tasks.txt |
paexec_reorder -Mf -Sl
# GNU Parallel cannot stop processing jobs that depend on another.
# It can either try all:
1$ tsort tasks.txt |
parallel --ssh '/usr/bin/ssh -x' -S "host1,host2,host3" \
--tagstring {#} --pipe -N1 --log my.log calculate-me
# Or it can stop at the first failing:
1$ tsort tasks.txt |
parallel --ssh '/usr/bin/ssh -x' -S "host1,host2,host3" \
--tagstring {#} --halt now,fail=1 --pipe -N1 --log my.log calculate-me
# To retry the the failed and missing tasks:
1$ tsort tasks.txt |
parallel --ssh '/usr/bin/ssh -x' -S "host1,host2,host3" \
--tagstring {#} --halt now,fail=1 --pipe -N1 --joblog my.log \
--resume-failed calculate-me
2$ ls -1 *.wav | paexec -x -n +4 -c 'oggenc -Q'
2$ ls -1 *.wav | parallel -j4 oggenc -Q
3$ ls -1 *.wav | paexec -xCil -n+4 flac -f --silent
3$ ls -1 *.wav | parallel --tagstring {#} -j4 'echo {}; flac -f --silent {}'
4$ { uname -s; uname -r; uname -m; } |
paexec -x -lp -n+2 -c banner |
paexec_reorder -l
4$ { uname -s; uname -r; uname -m; } |
parallel --tagstring '{#}' -k \
'banner {} | perl -pe "s/^/getppid().\" \"/e"'
5$ find . -name '*.dat' -print0 |
paexec -0 -n+10 -C -J// scp // remoteserver:/remote/path
5$ find . -name '*.dat' -print0 |
parallel -0 -j10 -I// scp // remoteserver:/remote/path
6$ ls -1 *.txt | paexec -n+10 -J%% -c 'awk "BEGIN {print toupper(\"%%\")}"'
6$ ls -1 *.txt | parallel -j10 -I%% 'awk "BEGIN {print toupper(\"%%\")}"'
=head3 EXAMPLES FROM presentation/paexec.tex
7$ ls -1 *.wav | \
paexec -x -c 'flac -s' -n +4 > /dev/null
7$ ls -1 *.wav | \
parallel -j4 flac -s > /dev/null
8$ cat ~/bin/toupper
#!/usr/bin/awk -f
{
print " ", toupper($0)
print "" # empty line -- end-of-task marker!
fflush() # We must flush stdout!
}
cat tasks
apple
bananas
orange
paexec -t ssh -c ~/bin/toupper -n 'server1 server2' < tasks
8$ parallel --pipe -n1 -S server1,server2 ~/bin/toupper < tasks
9$ paexec -lr -t ssh -c ~/bin/toupper -n 'server1 server2' < tasks
9$ # GNU Parallel has no easy way to prepend the server
parallel --tagstring {#} --pipe -n1 -S server1,server2 ~/bin/toupper < tasks
cat tasks | parallel --tagstring {#} --pipe -n1 -S server1,server2 --plus \
~/bin/toupper '| perl -pe "s/^/{sshlogin}/"' < tasks
10$ paexec -n +4 -c ~/bin/toupper < tasks
10$ parallel -j4 --pipe -n1 ~/bin/toupper < tasks
11$ paexec -x -t ssh -n 'server1 server2' \
-c "awk 'BEGIN {print toupper(ARGV[1])}' " < tasks
11$ parallel -S 'server1,server2' \
"awk 'BEGIN {print toupper(ARGV[1])}'" < tasks
12$ paexec -x -C -t ssh -n 'server1 server2' \
awk 'BEGIN {print toupper(ARGV[1])}' < tasks
12$ parallel -S 'server1,server2' -q \
awk 'BEGIN {print toupper(ARGV[1])}' < tasks
13$ paexec -Z240 -x -t ssh -n 'server1 badhostname server2' \
-c "awk 'BEGIN {print toupper(ARGV[1])}' " < tasks
13$ parallel --filter-hosts -S 'server1,badhostname,server2' \
"awk 'BEGIN {print toupper(ARGV[1])}' " < tasks
14$ cat ~/bin/pbanner
#!/usr/bin/env sh
while read task; do
banner -f M "$task" | pv -qL 300
echo "$PAEXEC_EOT" # end-of-task marker
done
cat tasks
pae
xec
paexec -l -mt='SE@X-L0S0!&' -c ~/bin/pbanner -n +2 < tasks |
paexec_reorder -mt='SE@X-L0S0!&'
14$ paexec -y -lc ~/bin/pbanner -n+2 < tasks | paexec_reorder -y
14$ paexec -l -x -c banner -n+2 < tasks
14$ parallel --pipe -n1 -j2 ~/bin/pbanner < tasks
16$ cat ~/tmp/packages_to_build
audio/cd-discid audio/abcde
textproc/gsed audio/abcde
audio/cdparanoia audio/abcde
audio/id3v2 audio/abcde
audio/id3 audio/abcde
misc/mkcue audio/abcde
shells/bash audio/abcde
devel/libtool-base audio/cdparanoia
devel/gmake audio/cdparanoia
devel/libtool-base audio/id3lib
devel/gmake audio/id3v2
audio/id3lib audio/id3v2
devel/m4 devel/bison
lang/f2c devel/libtool-base
devel/gmake misc/mkcue
devel/bison shells/bash
cat ~/bin/pkg_builder
#!/usr/bin/awk -f
{
print "build " $0
print "success" # build succeeded! (paexec -ms=)
print "" # end-of-task marker
fflush() # we must flush stdout
}
paexec -g -l -c ~/bin/pkg_builder -n 'server2 server1' \
-t ssh < ~/tmp/packages_to_build | paexec_reorder
# GNU Parallel cannot postpone jobs that depend on another.
# In some cases this will work
16$ tsort ~/tmp/packages_to_build | parallel -S server2,server1 \
--pipe -n1 ~/bin/pkg_builder
17$ cat ~/bin/pkg_builder
#!/usr/bin/awk -f
{
print "build " $0
if ($0 == "devel/gmake")
print "failure" # Oh no...
exit 255 # Exit value needed for GNU Parallel
else
print "success" # build succeeded!
print "" # end-of-task marker
fflush() # we must flush stdout
}
paexec -gl -c ~/bin/pkg_builder -n 'server2 server1' \
-t ssh < ~/tmp/packages_to_build | paexec_reorder
# GNU Parallel cannot refrain from starting jobs, that depend on others
# In some cases this will work
17$ tsort ~/tmp/packages_to_build | parallel -S server2,server1 \
--halt now,fail=1 --pipe -n1 ~/bin/pkg_builder
18$ cat ~/bin/pkg_builder
#!/usr/bin/awk -f
{
"hostname -s" | getline hostname
print "build " $0 " on " hostname
if (hostname == "server1" && $0 == "textproc/gsed")
exit 139
# Damn it, I'm dying...
# Exit value is needed by GNU Parallel
else
print "success" # Yes! :-)
print "" # end-of-task marker
fflush() # we must flush stdout
}
paexec -gl -Z300 -t ssh -c ~/bin/pkg_builder \
-n 'server2 server1' < ~/tmp/packages_to_build |
paexec_reorder > result
# GNU Parallel retries a job on another server, if --retries > 1
17$ tsort ~/tmp/packages_to_build | parallel -S server2,server1 \
--halt now,fail=1 --retries 2 --pipe -n1 ~/bin/pkg_builder
18$ ls -1 *.wav | paexec -x -c 'flac -s' -n+3 >/dev/null
18$ ls -1 *.wav | parallel -j3 flac -s >/dev/null
19$ ls -1 *.wav | paexec -ixC -n+3 oggenc -Q | grep .
19$ ls -1 *.wav | parallel -j3 'echo {}; oggenc -Q {}' | grep .
20$ cat calc
#!/bin/sh
# $1 -- task given on input
if test $1 = huge; then
sleep 6
else
sleep 1
fi
echo "task $1 done"
printf 'small1\nsmall2\nsmall3\nsmall4\nsmall5\nhuge\n' |
time -p paexec -c ~/bin/calc -n +2 -xg | grep -v success
20$ printf 'small1\nsmall2\nsmall3\nsmall4\nsmall5\nhuge\n' |
time -p parallel -j2 ~/bin/calc | grep -v success
21$ printf 'small1\nsmall2\nsmall3\nsmall4\nweight: huge 6\n' |
time -p paexec -c ~/bin/calc -n +2 -x -W1 | grep -v success
21$ # GNU Parallel does not support weighted jobs.
# It can be simulated by sorting:
printf 'small1\nsmall2\nsmall3\nsmall4\nweight: huge 6\n' |
perl -pe 's/^weight: (.*) (\d+)/$2 $1/ or s/^/1 /' |
sort -nr | time parallel ~/bin/calc '{=s/^\d* //=}' |
grep -v success
=head3 EXAMPLES FROM paexec's example dir
Here are the examples from B<paexec>'s example dir with the equivalent
using GNU B<parallel>:
=head4 1_div_X_run
=head4 all_substr
1$ ../../paexec -s -l -c "`pwd`/1_div_X_cmd" -n +1 <<EOF [...]
$ paexec -lpe -c "`pwd`/cmd" -n +3 <<EOF
1$ parallel echo {} '|' `pwd`/1_div_X_cmd <<EOF [...]
$ parallel -j3 --pipe -n1 --tagstring {#} \
'./cmd | perl -pe "s/^/getppid().\" \"/e"' <<EOF
=head4 all_substr_run
=head4 cc_wrapper
2$ ../../paexec -lp -c "`pwd`/all_substr_cmd" -n +3 <<EOF [...]
2$ parallel echo {} '|' `pwd`/all_substr_cmd <<EOF [...]
=head4 cc_wrapper_run
3$ ../../paexec -c "env CC=gcc CFLAGS=-O2 `pwd`/cc_wrapper_cmd" \
$ paexec -c "env CC=gcc CFLAGS=-O2 `pwd`/cmd" \
-n 'host1 host2' \
-t '/usr/bin/ssh -x' <<EOF [...]
-t '/usr/bin/ssh -x' <<EOF
3$ parallel echo {} '|' "env CC=gcc CFLAGS=-O2 `pwd`/cc_wrapper_cmd" \
-S host1,host2 <<EOF [...]
$ parallel --pipe -n1 -S 'host1,host2' \
"env CC=gcc CFLAGS=-O2 `pwd`/cmd" <<EOF
# This is not exactly the same, but avoids the wrapper
parallel gcc -O2 -c -o {.}.o {} \
-S host1,host2 <<EOF [...]
# This is not exactly the same, but avoids the wrapper
$ parallel -S host1,host2 gcc -O2 -c -o {.}.o {} <<EOF
=head4 toupper_run
=head4 cc_wrapper2
4$ ../../paexec -lp -c "`pwd`/toupper_cmd" -n +10 <<EOF [...]
$ ls -1 $PWD/*.c | paexec -c "env $CC $CFLAGS -c " -n +4 -x
4$ parallel echo {} '|' ./toupper_cmd <<EOF [...]
$ ls -1 $PWD/*.c | parallel -j4 "env $CC $CFLAGS -c"
# Without the wrapper:
parallel echo {} '| awk {print\ toupper\(\$0\)}' <<EOF [...]
=head4 dirtest
$ paexec -gx -l -c 'test -d' -md=';' -n +3 < tasks
# GNU Parallel cannot refrain from starting jobs, that depend on others
$ parallel -j3 --tag test -d '{= s/.*;// =}; echo $?' < tasks
=head4 divide
$ paexec -s -l -c cmd_divide -n +3 <<EOF
# GNU Parallel cannot refrain from starting jobs, that depend on others
$ parallel -j3 --pipe -n1 cmd_divide <<EOF
=head4 make_package
1$ paexec -g -le -c "`pwd`/cmd" -n +3 < tasks | paexec_reorder -g -Ms
# GNU Parallel cannot refrain from starting jobs, that depend on others
1$ cat < tasks | parallel --pipe -n1 -j3 "`pwd`/cmd"
2$ paexec -g -le -c "`pwd`/cmd" -n +3 < tasks_cycle
2$ tsort < tasks_cycle | parallel --pipe -n1 -j3 "`pwd`/cmd"
=head4 toupper
$ input | paexec -c "`pwd`/cmd" -n +2 | cut -b 2-
$ input | parallel --pipe -n1 -j2 "`pwd`/cmd" | cut -b 2-
$ # Without the wrapper:
input | parallel --pipe -n1 -j2 'awk {print\ toupper\(\$0\)}'
=head4 wav2flac
$ ls -1 "$dir"/*.wav | paexec -x -c 'flac --silent' -n +"$num"
$ ls -1 "$dir"/*.wav | parallel -j $num flac --silent
https://github.com/cheusov/paexec
(Last checked: 2010-12)
(Last checked: 2024-06)
=head2 DIFFERENCES BETWEEN map(sitaramc) AND GNU Parallel
@ -989,7 +1296,7 @@ and that it is run under a shell that supports '**' globbing (such as B<zsh>):
4$ parallel lame -V 2 FULLPATH DIRNAME/BASENAME.mp3 ::: ~/Music/*.wav
https://github.com/danielgtaylor/ladon
(Last checked: 2019-01)
(Last checked: 2024-06)
=head2 DIFFERENCES BETWEEN jobflow AND GNU Parallel
@ -1067,7 +1374,7 @@ jobs. This can be emulated by GNU B<parallel> using B<bash>'s B<ulimit>:
5$ seq 100 | parallel echo '{= $_>10 and $_<=20 or skip() =}'
https://github.com/rofl0r/jobflow
(Last checked: 2022-05)
(Last checked: 2024-06)
=head2 DIFFERENCES BETWEEN gargs AND GNU Parallel
@ -1214,6 +1521,8 @@ B<rush> has some string manipulations that can be emulated by putting
this into ~/.parallel/config (/ is used instead of %, and % is used
instead of ^ as that is closer to bash's ${var%postfix}):
=for pod2rst next-code-block: text
--rpl '{:} s:(\.[^/]+)*$::'
--rpl '{:%([^}]+?)} s:$$1(\.[^/]+)*$::'
--rpl '{/:%([^}]*?)} s:.*/(.*)$$1(\.[^/]+)*$:$1:'
@ -1368,6 +1677,8 @@ If you I<really> want the B<for>-loop:
Contrary to B<rush> this also works if the value is complex like:
=for pod2rst next-code-block: text
My brother's 12" records
@ -1637,10 +1948,10 @@ computer has 8 cores).
GNU B<parallel> can be used as a poor-man's version of ClusterSSH:
B<parallel --nonall -S server-a,server-b do_stuff foo bar>
parallel --nonall -S server-a,server-b do_stuff foo bar
https://github.com/duncs/clusterssh
(Last checked: 2010-12)
(Last checked: 2024-06)
=head2 DIFFERENCES BETWEEN coshell AND GNU Parallel
@ -1689,7 +2000,7 @@ It can be emulated with GNU B<parallel> using this Bash function:
}
https://github.com/tfogo/spread
(Last checked: 2024-04)
(Last checked: 2024-06)
=head2 DIFFERENCES BETWEEN pyargs AND GNU Parallel
@ -1733,7 +2044,7 @@ and fails on B<pyargs traceroute gnu.org fsf.org>.
parallel seq ::: 1 2 3 4 5 6
https://github.com/robertblackwell/pyargs
(Last checked: 2019-01)
(Last checked: 2024-01)
=head2 DIFFERENCES BETWEEN concurrently AND GNU Parallel
@ -1858,7 +2169,7 @@ emulated with GNU B<parallel>:
$ loopy touch '{= $_=seq()*5 =}'.txt
$ loop --until-contains 200 -- \
./get_response_code.sh --site mysite.biz`
./get_response_code.sh --site mysite.biz
$ loopy --halt now,success=1 \
'./get_response_code.sh --site mysite.biz | match 200'
@ -2018,7 +2329,7 @@ template to generate the jobs, but requires jobs to be in a
file. Output from the jobs mix.
https://github.com/john01dav/spp
(Last checked: 2019-01)
(Last checked: 2024-06)
=head2 DIFFERENCES BETWEEN paral AND GNU Parallel
@ -2088,7 +2399,7 @@ the GNU B<parallel> command):
echo g && sleep 0.5 && echo h"
https://github.com/amattn/paral
(Last checked: 2019-01)
(Last checked: 2024-06)
=head2 DIFFERENCES BETWEEN concurr AND GNU Parallel
@ -2116,7 +2427,7 @@ B<concurr> deals badly empty input files and with output larger than
64 KB.
https://github.com/mmstick/concurr
(Last checked: 2019-01)
(Last checked: 2024-01)
=head2 DIFFERENCES BETWEEN lesser-parallel AND GNU Parallel
@ -2130,7 +2441,7 @@ hardly any options, whereas B<parallel --embed> gives you the full
GNU B<parallel> experience.
https://github.com/kou1okada/lesser-parallel
(Last checked: 2019-01)
(Last checked: 2024-06)
=head2 DIFFERENCES BETWEEN npm-parallel AND GNU Parallel
@ -2141,7 +2452,7 @@ There are no examples and very little documentation, so it is hard to
compare to GNU B<parallel>.
https://github.com/spion/npm-parallel
(Last checked: 2019-01)
(Last checked: 2024-06)
=head2 DIFFERENCES BETWEEN machma AND GNU Parallel
@ -2355,7 +2666,7 @@ https://github.com/codingo/Interlace
I have been unable to get the code to run at all. It seems unfinished.
https://github.com/otonvm/Parallel
(Last checked: 2019-02)
(Last checked: 2024-06)
=head2 DIFFERENCES BETWEEN k-bx par AND GNU Parallel
@ -2430,7 +2741,7 @@ will cause the system to freeze if there are so many jobs that there
is not enough memory to run them all at the same time.
https://github.com/royriojas/shell-executor
(Last checked: 2019-02)
(Last checked: 2024-06)
=head2 DIFFERENCES BETWEEN non-GNU par AND GNU Parallel
@ -2551,7 +2862,7 @@ corresponding GNU B<sem> and GNU B<parallel> commands:
wait
https://github.com/akramer/lateral
(Last checked: 2019-03)
(Last checked: 2024-06)
=head2 DIFFERENCES BETWEEN with-this AND GNU Parallel
@ -2585,7 +2896,7 @@ B<with-this> gives some additional information, so the output has to
be cleaned before piping it to the next command.
https://github.com/amritb/with-this.git
(Last checked: 2019-03)
(Last checked: 2024-06)
=head2 DIFFERENCES BETWEEN Tollef's parallel (moreutils) AND GNU Parallel
@ -2732,7 +3043,7 @@ lost. B<threader> buffers in RAM, so output bigger than the machine's
virtual memory will cause the machine to crash.
https://github.com/voodooEntity/threader
(Last checked: 2020-04)
(Last checked: 2024-06)
=head2 DIFFERENCES BETWEEN runp AND GNU Parallel
@ -3016,7 +3327,7 @@ composed commands.
https://github.com/ctbur/async/
(Last checked: 2023-01)
(Last checked: 2024-06)
=head2 DIFFERENCES BETWEEN pardi AND GNU Parallel
@ -3117,7 +3428,7 @@ You cannot quote space in the command, so you cannot run composed
commands like B<sh -c "echo a; echo b">.
https://gitlab.com/netikras/bthread
(Last checked: 2021-01)
(Last checked: 2024-06)
=head2 DIFFERENCES BETWEEN simple_gpu_scheduler AND GNU Parallel
@ -3183,7 +3494,7 @@ Summary (see legend above):
seq 3 | parallel echo true >> gpu.queue
https://github.com/ExpectationMax/simple_gpu_scheduler
(Last checked: 2021-01)
(Last checked: 2024-06)
=head2 DIFFERENCES BETWEEN parasweep AND GNU Parallel
@ -3246,7 +3557,7 @@ https://github.com/eviatarbach/parasweep
(Last checked: 2021-01)
=head2 DIFFERENCES BETWEEN parallel-bash AND GNU Parallel
=head2 DIFFERENCES BETWEEN parallel-bash(2021) AND GNU Parallel
Summary (see legend above):
@ -3309,8 +3620,99 @@ running jobs.
4$ something | parallel -j 5 echo {} {}
https://reposhub.com/python/command-line-tools/Akianonymus-parallel-bash.html
(Last checked: 2021-06)
https://github.com/Akianonymus/parallel-bash/
(Last checked: 2024-06)
=head2 DIFFERENCES BETWEEN parallel-bash(2024) AND GNU Parallel
Summary (see legend above):
=over
=item I1 I2 - - - - -
=item - - M3 - - M6
=item - O2 O3 - O5 O6 - O8 x O10
=item E1 - - - - - -
=item - - - - - - - - -
=item - -
=back
B<parallel-bash> is written in pure bash. It is really fast (overhead
of ~0.05 ms/job compared to GNU B<parallel>'s 3-10 ms/job). So if your
jobs are extremely short lived, and you can live with the quite
limited command, this may be useful.
It seems the number of jobs must be divisible by B<-p>, so it
sometimes does not run the jobs:
# Does nothing
$ seq 3 | parallel-bash -p 4 bash -c 'touch myfile-{}'
This should create myfile-1..3, but creates nothing.
It splits the input into queues. Each queue is of length B<-p>. So
this will make 250 queues and run all 250 processes in parallel:
$ seq 1000 | parallel-bash -p 4 bash -c 'sleep {}'
This is quite different from B<parallel-bash>(2021) where B<-p> is the
number of workers - similar to B<--jobs> in GNU B<parallel>.
In other words: B<parallel-bash> does I<not> quarantee that only 4 jobs
will be run in parallel. This can overload your machine:
# Warning: This will start 25000 processes - not just 4
$ seq 100000 | parallel-bash -p 4 sleep {}
If you are unlucky all long jobs may end up in the same queue:
$ printf "%b\n" 1 1 1 1 5 5 5 5 1 1 1 1 |
time parallel -P4 sleep {}
(7 seconds)
$ printf "%b\n" 1 1 1 1 5 5 5 5 1 1 1 1 |
time ./parallel-bash.bash -p 4 -c sleep {}
(20 seconds)
Ctrl-C kills the jobs (as expected). Ctrl-Z does not suspend running jobs.
=head3 EXAMPLES FROM parallel-bash
1$ main() { echo "${1}" ;}
export -f main
1$ printf "%b\n" {1..1000} | ./parallel-bash -p 10 main {}
1$ printf "%b\n" {1..1000} | parallel -j 100 main {}
2$ # Number of inputs must be divisible by 5
some_input | parallel-bash -p 5 echo
2$ some_input | parallel -j 5 echo
3$ # Number of inputs must be divisible by 5
parallel-bash -p 5 echo < some_file
3$ parallel -j 5 echo < some_file
4$ # Number of lines in 'some string' must be divisible by 5
parallel-bash -p 5 echo <<< 'some string'
4$ parallel -j 5 -c echo <<< 'some string'
5$ something | parallel-bash -p 5 echo {}
5$ something | parallel -j 5 echo {}
https://github.com/Akianonymus/parallel-bash/
(Last checked: 2024-06)
=head2 DIFFERENCES BETWEEN bash-concurrent AND GNU Parallel
@ -3332,7 +3734,7 @@ It uses an O(n*n) algorithm, so if you have 1000 independent jobs it
takes 22 seconds to start it.
https://github.com/themattrix/bash-concurrent
(Last checked: 2021-02)
(Last checked: 2024-06)
=head2 DIFFERENCES BETWEEN spawntool AND GNU Parallel
@ -3358,7 +3760,6 @@ Summary (see legend above):
B<spawn> reads a full command line from stdin which it executes in
parallel.
http://code.google.com/p/spawntool/
(Last checked: 2021-07)
@ -3422,7 +3823,7 @@ Summary (see legend above):
=over
=item I1 I2 - - - - I7
=item I1 I2 - - - - (I7)
=item - - M3 - - M6
@ -3439,6 +3840,34 @@ Summary (see legend above):
B<go-parallel> uses Go templates for replacement strings. Quite
similar to the I<{= perl expr =}> replacement string.
The basic replacement strings can be emulated by putting this into
B<~/.parallel/config>:
--rpl '{{.Input}} '
--rpl '{{.Time}} use DateTime; $_= DateTime->from_epoch(time);'
--rpl '{{.Start}} use DateTime; $_= DateTime->from_epoch($^T);'
Then you can do:
seq 10 | parallel sleep {{.Input}}';' echo {{.Start}} {{.Time}}
seq 10 | go-parallel -t 'bash -c "sleep {{.Input}}; echo \"{{.Start}}\" \"{{.Time}}\""'
If the input is too long (64K), you get no error:
perl -e 'print "works."."x"x100' | parallel.go -t 'echo {{noExt .Input}} '
perl -e 'print "fails."."x"x100_000_000' | parallel.go -t 'echo {{noExt .Input}} '
Special chars are quoted:
echo '"&+<>' | go-parallel echo
"&+<>
but not shell quoted when using replacement strings:
echo '"&+<>' | go-parallel -t 'echo {{.Input}}'
&#34;&amp;&#43;&lt;&gt;
=head3 EXAMPLES FROM go-parallel
1$ go-parallel -a ./files.txt -t 'cp {{.Input}} {{.Input | dirname | dirname}}'
@ -3453,8 +3882,14 @@ similar to the I<{= perl expr =}> replacement string.
3$ parallel -a ./files.txt echo mkdir -p {} {/.}
4$ time find ~/src/go -type f | go-parallel md5sum > /dev/null
4$ time find ~/src/go -type f | parallel md5sum > /dev/null
# Though you would probably do this instead:
time find ~/src/go -type f | parallel -X md5sum > /dev/null
https://github.com/mylanconnolly/parallel
(Last checked: 2021-07)
(Last checked: 2024-06)
=head2 DIFFERENCES BETWEEN p AND GNU Parallel
@ -4063,7 +4498,7 @@ jobs to run in parallel.
It is half as fast as GNU B<parallel> for short jobs.
https://github.com/thilinaba/bash-parallel
(Last checked: 2023-05)
(Last checked: 2024-06)
=head2 DIFFERENCES BETWEEN PaSH AND GNU Parallel
@ -4301,7 +4736,7 @@ Summary (see legend above):
=item - - - - - -
=item - O2 O3 N/A - O6 - x x ?O10
=item - O2 O3 x - O6 - x x ?O10
=item E1 - - - E5 - -
@ -4402,21 +4837,22 @@ cause segfault.
=head3 EXAMPLES
simple.dat:
simple.dat:
sleep 5
foo
cat alire.toml
loc src/parallelize.adb
sh loc src/*.ad?
sleep 5
foo
cat alire.toml
loc src/parallelize.adb
sh loc src/*.ad?
1$ bin/parallelize -v <simple.dat
1$ bin/parallelize -v <simple.dat
1$ parallel <simple.dat
1$ parallel <simple.dat
https://github.com/simonjwright/parallelize
(Last checked: 2024-04)
=head2 Todo
https://github.com/justanhduc/task-spooler
@ -4473,7 +4909,7 @@ This test stresses whether output mixes.
paralleltool="parallel -j 30"
cat <<-EOF > mycommand
cat <<-'EOF' > mycommand
#!/bin/bash
# If a, b, c, d, e, and f mix: Very bad
@ -4483,18 +4919,26 @@ This test stresses whether output mixes.
perl -e 'print STDERR "d"x3000_000," "'
perl -e 'print STDOUT "e"x3000_000," "'
perl -e 'print STDERR "f"x3000_000," "'
echo
echo >&2
echo "stdout line 1 of id $@"
echo "stderr line 1 of id $@" >&2
perl -e 'print STDOUT "A"x3000_000," "'
perl -e 'print STDERR "B"x3000_000," "'
perl -e 'print STDOUT "C"x3000_000," "'
perl -e 'print STDERR "D"x3000_000," "'
perl -e 'print STDOUT "E"x3000_000," "'
perl -e 'print STDERR "F"x3000_000," "'
echo "stdout line 2 of id $@"
echo "stderr line 2 of id $@" >&2
EOF
chmod +x mycommand
# Run 30 jobs in parallel
seq 30 |
$paralleltool ./mycommand > >(tr -s abcdef) 2> >(tr -s abcdef >&2)
$paralleltool -j 30 ./mycommand > >(tr -s a-zA-Z) 2> >(tr -s a-zA-Z >&2)
# 'a c e' and 'b d f' should always stay together
# and there should only be a single line per job
# For each job there be 2 lines of standard output and standard error
# They should not be interleaved with other id's
=head2 STDERRMERGE: Stderr is merged with stdout
@ -4606,6 +5050,8 @@ buffers on disk, they may not clean up, if they are killed.
It is not uncommon for users to create files like:
=for pod2rst next-code-block: text
My brother's 12" *** record (costs $$$).jpg
Some tools break on this.
@ -4669,6 +5115,11 @@ Some tools become very slow if output lines have many words.
paralleltool="parallel -j0"
wcc() {
parallel --recend '' --block 100M --pipe 'LC_ALL=C wc' |
datamash -W sum 1 sum 2 sum 3
}
cat <<-EOF > mycommand
#!/bin/bash
@ -4677,7 +5128,7 @@ Some tools become very slow if output lines have many words.
chmod +x mycommand
# Run 1 job
seq 1 | $paralleltool ./mycommand | LC_ALL=C wc
seq 1 | $paralleltool ./mycommand | wcc
=head1 AUTHOR

View file

@ -905,6 +905,24 @@ combined in the correct order.
{}0000000-{}9999999 https://example.com/the/big/file > file
=head2 EXAMPLE: Keep order, but make job 1 output fast
If you want the output of job 1 unbuffered, but otherwise keep the
order, you can do this:
doit() {
echo "$@" ERR >&2
echo "$@" out
sleep 0.$1
echo "$@" ERR >&2
echo "$@" out
}
export -f doit
parallel -k -u doit {= 'seq() > 1 and $opt::ungroup = 0' =} ::: 9 1 2 3
It will output job 1 with less overhead.
=head2 EXAMPLE: Parallel grep
B<grep -r> greps recursively through directories. GNU B<parallel> can

View file

@ -2053,6 +2053,8 @@ your environment:
Output:
=for pod2rst next-code-block: text
Joe's var is green
The disadvantage is that if your environment is huge B<env_parallel>
@ -2789,6 +2791,8 @@ This technique can be used for:
=item Common LISP:
=for pod2rst next-code-block: clisp
#!/usr/bin/parallel --shebang-wrap /usr/bin/clisp
(format t "~&~S~&" 'Arguments)
@ -2959,6 +2963,8 @@ B<--help> will print a summary of the most important options:
Output:
=for pod2rst next-code-block: text
Usage:
parallel [options] [command [arguments]] < list_of_arguments
@ -3032,6 +3038,8 @@ generated using B<--citation>:
Output:
=for pod2rst next-code-block: bash
Academic tradition requires you to cite works you base your article on.
When using programs that use GNU Parallel to process data for publication
please cite:

View file

@ -137,7 +137,7 @@ GetOptions(
"help" => \$opt::dummy,
) || exit(255);
$Global::progname = ($0 =~ m:(^|/)([^/]+)$:)[1];
$Global::version = 20240622;
$Global::version = 20240722;
if($opt::version) { version(); exit 0; }
# Remove -D and --parallel=N
my @s = (grep { ! /^-D$|^--parallel=\S+$/ }

View file

@ -91,6 +91,20 @@ sub pre2 {
}
}
sub pre3 {
$/ = undef;
# Default syntax language: Bash
# If =for not already there, insert:
# =for pod2rst next-code-block: bash
$all = <STDIN>;
@codepar = split/(?<=\n .{0,25}\S.{0,200}\n{2,10})(?=[0-9a-zA-Z=])/, $all;
for(@codepar) {
/=for pod2rst next-code-block:/ and next;
s/((\n +\S))/\n=for pod2rst next-code-block: bash\n$1/;
}
print @codepar;
}
sub pod2rst {
exec "pod2rst";
}
@ -109,5 +123,5 @@ sub post {
}
}
# stdin | pre1() | pre2() | pod2rst() | post()
pipefunc(*pre1,*pre2,*pod2rst,*post);
# stdin | pre1() | pre2() | pre3() | pod2rst() | post()
pipefunc(*pre1,*pre2,*pre3,*pod2rst,*post);

27
src/sql
View file

@ -548,7 +548,7 @@ parse_options();
my $pass_through_options = (defined $::opt_p) ? join(" ",@{$::opt_p}) : "";
my $dburl_or_alias = shift;
if (not defined $dburl_or_alias) { Usage("No DBURL given"); exit -1; }
if (not defined $dburl_or_alias) { usage("No DBURL given"); exit -1; }
my %dburl = parse_dburl(get_alias($dburl_or_alias));
my $interactive_command;
@ -670,7 +670,7 @@ $Global::Initfile && unlink $Global::Initfile;
exit ($err);
sub parse_options {
$Global::version = 20240622;
$Global::version = 20240722;
$Global::progname = 'sql';
# This must be done first as this may exec myself
@ -716,7 +716,7 @@ sub parse_options {
"verbose|v" => \$::opt_verbose,
) || die_usage();
if(defined $::opt_help) { die_usage(); }
if(defined $::opt_help) { usage(); exit(0); }
if(defined $::opt_version) { version(); exit(0); }
$Global::debug = $::opt_debug;
}
@ -1073,15 +1073,6 @@ sub find_command_in_path {
return $path;
}
sub Usage {
if(@_) {
print "Error:\n";
print map{ "$_\n" } @_;
print "\n";
}
print "sql [-hnr] [--table-size] [--db-size] [-p pass-through] [-s string] dburl [command]\n";
}
sub get_alias {
my $alias = shift;
$alias =~ s/^(sql:)*//; # Accept aliases prepended with sql:
@ -1134,7 +1125,7 @@ sub get_alias {
if($dburl) {
return get_alias($dburl.$rest);
} else {
Usage("$alias is not defined in @search");
usage("$alias is not defined in @search");
exit(-1);
}
}
@ -1199,7 +1190,7 @@ sub parse_dburl {
" port ", $options{port}, " database ", $options{database},
" query ",$options{query}, "\n");
} else {
Usage("$url is not a valid DBURL");
usage("$url is not a valid DBURL");
exit -1;
}
return %options;
@ -1262,9 +1253,13 @@ sub die_usage {
sub usage {
# Returns: N/A
if(@_) {
print map{ "$Global::progname: Error: $_\n" } @_;
print "\n";
}
print "Usage:\n";
print "$Global::progname [options] dburl [sqlcommand]\n";
print "$Global::progname [options] dburl < sql_command_file\n";
print "$Global::progname [-hnr] [--table-size] [--db-size] [-p pass-through] [-s string] dburl [sqlcommand]\n";
print "$Global::progname [-hnr] [--table-size] [--db-size] [-p pass-through] [-s string] dburl < sql_command_file\n";
print "\n";
print "See 'man $Global::progname' for the options\n";
}

View file

@ -134,12 +134,11 @@ stopvm:
parallel -j0 --tag -k '${stop}' ::: ${namedservers} || true
startdb:
true TODO should start Oracle in vagrant
startdb-old:
#echo shutdown abort | sudo su - oracle -c "sqlplus / as sysdba"
sudo parallel /etc/init.d/{} status '||' /etc/init.d/{} restart ::: postgresql mysql # oracle-xe
VBoxManage startvm OracleXE || true
parallel 'ping {} | read' ::: oracle11.tange.dk
sql oracle://SYSTEM:$$VM_ORACLE_PWD@/FREE "select 'Oracle is running' from dual;" || \
(cd vagrant-projects/OracleDatabase/23.4.0-Free && vagrant up && \
sql oracle://SYSTEM:$$VM_ORACLE_PWD@/FREE "select 'Oracle is running' from dual;")
stopdb:
cd vagrant-projects/OracleDatabase/23.4.0-Free; vagrant suspend
### Distribution
installparallel: ../src/parallel

View file

@ -132,13 +132,18 @@ install_oracle_client() {
fi
# libaio
sudo apt install libaio1t64
sudo ln -s libaio.so.1t64 /usr/lib/x86_64-linux-gnu/libaio.so.1
perl -MCPAN -e 'install DBD::Oracle'
# TODO set up vagrant oracle server
git clone https://github.com/oracle/vagrant-projects.git
# TODO set up default passwd
echo sudo su - oracle -c "'/home/oracle/setPassword.sh $oracle_password'" |
vagrant ssh
# test it works: sql oracle://
(
cd vagrant-projects/OracleDatabase/23.4.0-Free
echo export VM_ORACLE_PWD=`goodpasswd` >> ~/.passwords
. ~/.passwords
vagrant up
)
# test it works:
sql --showtables oracle://SYSTEM:$VM_ORACLE_PWD@/FREE
}
setup_databases() {

View file

@ -92,7 +92,7 @@ echo '### -H and --hard'
niceload --hard -l 9 uptime | grep ':.[1-9][0-9].[0-9][0-9],' || echo OK-load below 10
EOF
cat <<'EOF' | sed -e 's/;$/; /;s/$SERVER1/'$SERVER1'/;s/$SERVER2/'$SERVER2'/' | stdout parallel -vj0 --joblog /tmp/jl-`basename $0` -L1
cat <<'EOF' | sed -e 's/;$/; /;s/$SERVER1/'$SERVER1'/;s/$SERVER2/'$SERVER2'/' | stdout parallel --timeout 300 -vj0 --joblog /tmp/jl-`basename $0` -L1
echo '### -f and --factor'
niceload -H --factor 30 -l6 echo factor 30 finish last
niceload -H -f 0.01 -l6 echo f 0.1 finish first

0
testsuite/tests-to-run/parallel-local-0.3s.sh Normal file → Executable file
View file

View file

@ -8,6 +8,19 @@
# Each should be taking 1-3s and be possible to run in parallel
# I.e.: No race conditions, no logins
par_keep_order_make_job_1_output_fast() {
echo '# EXAMPLE: Keep order, but make job 1 output fast'
doit() {
echo "$@" ERR >&2
echo "$@" out
sleep 0.$1
echo "$@" ERR >&2
echo "$@" out
}
export -f doit
parallel -k -u doit {= 'seq() > 1 and $opt::ungroup = 0' =} ::: 9 1 2 3
}
par_citation_no_config_dir() {
echo '### bug #64329: parallel --citation will loop forever unless the config dir exists'
t=$(mktemp -d)

View file

@ -514,24 +514,6 @@ par_race_condition1() {
rm /tmp/parallel_race_cond
}
par__memory_leak() {
a_run() {
seq $1 |time -v parallel true 2>&1 |
grep 'Maximum resident' |
field 6;
}
export -f a_run
echo "### Test for memory leaks"
echo "Of 300 runs of 1 job at least one should be bigger than a 3000 job run"
. env_parallel.bash
parset small_max,big ::: 'seq 300 | parallel a_run 1 | jq -s max' 'a_run 3000'
if [ $small_max -lt $big ] ; then
echo "Bad: Memleak likely."
else
echo "Good: No memleak detected."
fi
}
par_slow_total_jobs() {
echo 'bug #51006: Slow total_jobs() eats job'
(echo a; sleep 15; echo b; sleep 15; seq 2) |

View file

@ -1541,7 +1541,7 @@ line2"' 'echo "command2"'
) | replace_tmpdir
}
par_parset2() {
par__parset2() {
echo '### parset into array'
(
. `which env_parallel.bash`

View file

@ -0,0 +1,33 @@
#!/bin/bash
# SPDX-FileCopyrightText: 2021-2024 Ole Tange, http://ole.tange.dk and Free Software and Foundation, Inc.
#
# SPDX-License-Identifier: GPL-3.0-or-later
# Simple jobs that never fails
# Each should be taking 30-100s and be possible to run in parallel
# I.e.: No race conditions, no logins
par__memory_leak() {
a_run() {
seq $1 |time -v parallel true 2>&1 |
grep 'Maximum resident' |
field 6;
}
export -f a_run
echo "### Test for memory leaks"
echo "Of 300 runs of 1 job at least one should be bigger than a 3000 job run"
. env_parallel.bash
parset small_max,big ::: 'seq 300 | parallel a_run 1 | jq -s max' 'a_run 3000'
# Perl 5.38.2 has a small leak (~300KB) - not present in 5.2X.X
# TODO find out which perl version introduces this
echo "`date` [ $small_max < $big ]" >> /tmp/parallel-mem-leak.out
if [ $(($small_max+500)) -lt $big ] ; then
echo "Bad: Memleak likely. [ $small_max < $big ]"
else
echo "Good: No memleak detected."
fi
}
export -f $(compgen -A function | grep par_)
compgen -A function | G par_ "$@" | sort |
parallel --delay 0.3 --timeout 300% -j6 --lb --tag -k --joblog /tmp/jl-`basename $0` '{} 2>&1'

View file

@ -39,13 +39,13 @@ par__sshpass_with_password() {
echo '### Crazy passwords: `date>>/tmp/trap`;(|<*&)'"'"
> /tmp/trap
(
# These fail. The important part is that /tmp/trap is empty
echo '# These fail. The important part is that /tmp/trap is empty'
stdout parallel --onall -S5/user:'`date>>/tmp/trap`;'@host echo ::: A
stdout parallel --onall -S5/user:'`date>>/tmp/trap`;(|<*&)'"'"@host echo ::: A
) | perl -pe 's/([a-f0-9]{100,} )+[a-f0-9]{1,}/HEX/g; s/\r/\n/g;' |
perl -pe 's/(ssh: Could not resolve hostname host:) .*/$1/'
echo This must stay empty:
cat /tmp/trap
grep . /tmp/trap || echo OK
}
par_--ssh_ssh_in_ssh() {

View file

@ -189,7 +189,8 @@ par__--tmux_different_shells() {
}
par_--tmux_length() {
echo '### works'
echo '### tmux examples that earlier blocked'
echo 'Runtime 14 seconds on non-loaded machine'
short_TMPDIR() {
# TMPDIR must be short for -M
export TMPDIR=/tmp/ssh/'
@ -236,5 +237,5 @@ par_z_multiple_hosts_repeat_arg() {
export -f $(compgen -A function | grep par_)
compgen -A function | G par_ "$@" | LC_ALL=C sort |
parallel --timeout 200 -j6 --tag -k --joblog /tmp/jl-`basename $0` '{} 2>&1' |
parallel --timeout 250 -j6 --tag -k --joblog /tmp/jl-`basename $0` '{} 2>&1' |
perl -pe 's:/usr/bin:/bin:g;'

View file

@ -6,6 +6,25 @@
echo '### test --env _, env_parallel for different shells'
retry() {
times=$1
shift
declare -a array_runs
first_run=$($@)
array_runs+=("$first_run")
for ((i=1; i<=$times; i++)); do
run=$($@)
exit=$?
if [[ " ${array_runs[@]} " =~ " $run " ]]; then
echo "$run"
return $exit
fi
done
echo "$run"
return $exit
}
export -f retry
#
## par_*_man = tests from the man page
#
@ -281,15 +300,11 @@ par__man_fish() {
set myarray arrays 'with = & " !'" '" work, too
echo $myarray[1] $myarray[2] $myarray[3] $myarray[4]
sleep 0.1
echo "# these 4 fail often. Race condition?"
env_parallel -k echo '$myarray[{}]' ::: 1 2 3 4
sleep 0.1
env_parallel -k -S server echo '$myarray[{}]' ::: 1 2 3 4
sleep 0.1
env_parallel -k --env myarray echo '$myarray[{}]' ::: 1 2 3 4
sleep 0.1
env_parallel -k --env myarray -S server echo '$myarray[{}]' ::: 1 2 3 4
env_parallel --argsep --- env_parallel -k echo ::: multi level --- env_parallel
env_parallel ::: true false true false
@ -815,12 +830,7 @@ par_--env_underscore_fish() {
set myarray and arrays in;
echo Test copying;
env_parallel myfunc ::: work;
env_parallel -S server myfunc ::: work;
env_parallel --env myfunc,myvar,myarray,myecho myfunc ::: work;
env_parallel --env myfunc,myvar,myarray,myecho -S server myfunc ::: work;
env_parallel --env _ myfunc ::: work;
env_parallel --env _ -S server myfunc ::: work;
echo '*** Moved to parallel-ssh-fish.sh ***'
echo Test ignoring;
env_parallel --env _ -S server not_copied_alias ::: error=OK;
@ -3152,14 +3162,7 @@ _EOF
export -f $(compgen -A function | grep par_)
# --retries 2 due to ssh_exchange_identification: read: Connection reset by peer
#compgen -A function | grep par_ | sort | parallel --delay $D -j$P --tag -k '{} 2>&1'
#compgen -A function | grep par_ | sort |
compgen -A function | G par_ "$@" | LC_ALL=C sort |
# parallel --joblog /tmp/jl-`basename $0` --delay $D -j$P --tag -k '{} 2>&1'
# 2019-07-14 200% too high for 16 GB/4 thread
parallel --joblog /tmp/jl-`basename $0` -j75% --retries 2 --tag -k '{} 2>&1' |
clean_output() {
perl -pe 's/line \d\d+/line 99/g;
s/\d+ >= \d+/999 >= 999/;
s/sh:? \d?\d\d:/sh: 999:/;
@ -3171,3 +3174,18 @@ compgen -A function | G par_ "$@" | LC_ALL=C sort |
s!/tmp/par-job-\d+_.....!script!g;
s/script: \d\d+/script: 99/g;
'
}
# --retries 2 due to ssh_exchange_identification: read: Connection reset by peer
#compgen -A function | grep par_ | sort | parallel --delay $D -j$P --tag -k '{} 2>&1'
#compgen -A function | grep par_ | sort |
compgen -A function | G par_ "$@" | LC_ALL=C sort | G -v fish |
# 2019-07-14 200% too high for 16 GB/4 thread
parallel --joblog /tmp/jl-`basename $0` -j75% --retries 2 --tag -k '{} 2>&1' |
clean_output
compgen -A function | G par_ "$@" | LC_ALL=C sort | G fish |
# 2024-07-18 fish is prone to racing
parallel --joblog /tmp/jl-`basename $0` -j1 --retries 2 --tag -k '{} 2>&1' |
clean_output

View file

@ -29,7 +29,7 @@ export -f par_tmux
# echo '### bug #48841: --tmux(pane) --fg should start tmux in foreground'
# stdout /usr/bin/time -f %e script -q -f -c /tmp/parallel-local7-script /dev/null | perl -ne '$_ >= 26 and $_ <= 45 and print "OK\n"'
cat <<'EOF' | sed -e 's/;$/; /;s/$SERVER1/'$SERVER1'/;s/$SERVER2/'$SERVER2'/' | stdout parallel -vj8 --delay 1 --timeout 20 --retries 3 -k --joblog /tmp/jl-`basename $0` -L1 -r
cat <<'EOF' | sed -e 's/;$/; /;s/$SERVER1/'$SERVER1'/;s/$SERVER2/'$SERVER2'/' | stdout parallel -vj8 --delay 1 --timeout 30 --retries 3 -k --joblog /tmp/jl-`basename $0` -L1 -r
echo '### tmux-1.9'
seq 510 512 | PARALLEL_TMUX=tmux-1.9 par_tmux

View file

@ -0,0 +1,262 @@
#!/bin/bash
# SPDX-FileCopyrightText: 2021-2024 Ole Tange, http://ole.tange.dk and Free Software and Foundation, Inc.
#
# SPDX-License-Identifier: GPL-3.0-or-later
# Run parts from parallel-local-ssh7.sh that fail often
# I think there is a race condition in fish
par__man_fish() {
echo '### fish'
myscript=$(cat <<'_EOF'
echo "### From man env_parallel"
env_parallel --session
alias myecho='echo aliases with \= \& \" \!'" \'"
myecho work
env_parallel myecho ::: work
env_parallel -S server myecho ::: work
env_parallel --env myecho myecho ::: work
env_parallel --env myecho -S server myecho ::: work
# multiline aliases does not work in fish
function myfunc
echo functions 'with = & " !'" '" $argv;
end
myfunc work
env_parallel myfunc ::: work
env_parallel -S server myfunc ::: work
env_parallel --env myfunc myfunc ::: work
env_parallel --env myfunc -S server myfunc ::: work
set myvar 'variables with = & " !'" '"
echo "$myvar" work
env_parallel echo '$myvar' ::: work
env_parallel -S server echo '$myvar' ::: work
env_parallel --env myvar echo '$myvar' ::: work
env_parallel --env myvar -S server echo '$myvar' ::: work
set multivar 'multiline
variables with = & " !'" '"
echo "$multivar" work
env_parallel echo '"$multivar"' ::: work
env_parallel -S server echo '"$multivar"' ::: work
env_parallel --env multivar echo '"$multivar"' ::: work
env_parallel --env multivar -S server echo '"$multivar"' ::: work
set myarray arrays 'with = & " !'" '" work, too
echo $myarray[1] $myarray[2] $myarray[3] $myarray[4]
echo "# these 4 fail often. Race condition?"
env_parallel -k echo '$myarray[{}]' ::: 1 2 3 4
env_parallel -k -S server echo '$myarray[{}]' ::: 1 2 3 4
env_parallel -k --env myarray echo '$myarray[{}]' ::: 1 2 3 4
env_parallel -k --env myarray -S server echo '$myarray[{}]' ::: 1 2 3 4
env_parallel --argsep --- env_parallel -k echo ::: multi level --- env_parallel
env_parallel ::: true false true false
echo exit value $status should be 2
env_parallel --no-such-option >/dev/null
echo exit value $status should be 255 `sleep 1`
_EOF
)
ssh fish@lo "$myscript"
#| LC_ALL=C sort
}
par_--env_underscore_fish() {
echo '### fish'
myscript=$(cat <<'_EOF'
echo "Fish is broken"
echo "### Testing of --env _"
source (which env_parallel.fish)
true > ~/.parallel/ignored_vars;
alias not_copied_alias="echo BAD"
function not_copied_func
echo BAD
end
set not_copied_var "BAD";
set not_copied_array BAD BAD BAD;
# env_parallel --record-env;
env_parallel --session;
alias myecho="echo \$myvar aliases";
function myfunc
myecho $myarray functions $argv
end
set myvar "variables in";
set myarray and arrays in;
echo Test copying;
env_parallel myfunc ::: work;
env_parallel -S server myfunc ::: work;
env_parallel --env myfunc,myvar,myarray,myecho myfunc ::: work;
env_parallel --env myfunc,myvar,myarray,myecho -S server myfunc ::: work;
env_parallel --env _ myfunc ::: work;
env_parallel --env _ -S server myfunc ::: work;
# echo Test ignoring;
# env_parallel --env _ -S server not_copied_alias ::: error=OK;
# env_parallel --env _ -S server not_copied_func ::: error=OK;
# env_parallel --env _ -S server echo \$not_copied_var ::: error=OK;
# env_parallel --env _ -S server echo \$not_copied_array ::: error=OK;
#
# echo Test single ignoring;
# echo myvar > ~/.parallel/ignored_vars;
# env_parallel --env _ myfunc ::: work;
# sleep 0.1
# env_parallel --env _ -S server myfunc ::: work;
# sleep 0.1
# echo myarray >> ~/.parallel/ignored_vars;
# env_parallel --env _ myfunc ::: work;
# env_parallel --env _ -S server myfunc ::: work;
# echo myecho >> ~/.parallel/ignored_vars;
# env_parallel --env _ myfunc ::: work;
# echo "OK if ^^^^^^^^^^^^^^^^^ no myecho" >&2;
# env_parallel --env _ -S server myfunc ::: work;
# echo "OK if ^^^^^^^^^^^^^^^^^ no myecho" >&2;
# echo myfunc >> ~/.parallel/ignored_vars;
# env_parallel --env _ myfunc ::: work;
# echo "OK if ^^^^^^^^^^^^^^^^^ no myfunc" >&2;
# env_parallel --env _ -S server myfunc ::: work;
# echo "OK if ^^^^^^^^^^^^^^^^^ no myfunc" >&2;
_EOF
)
# Old versions of fish sometimes throw up bugs all over,
# but seem to work OK otherwise. So ignore these errors.
stdout ssh fish@lo "$myscript" |
perl -ne '/^\^|fish:|fish\(/ and next; print' |
perl -pe 's/^[ ~^]+$//g'
}
par_funky_fish() {
myscript=$(cat <<'_EOF'
env_parallel --session
set myvar "myvar works"
setenv myenvvar "myenvvar works"
set funky (perl -e "print pack \"c*\", 1..255")
# 10 and 30 cause problems
setenv funkyenv (perl -e "print pack \"c*\", 1..9,11..29,31..255")
set myarray "" array_val2 3 "" 5 " space 6 "
# Assoc arrays do not exist
#typeset -A assocarr
#assocarr[a]=assoc_val_a
#assocarr[b]=assoc_val_b
alias alias_echo="echo 3 arg";
function func_echo
echo $argv;
echo "$myvar"
echo "$myenvvar"
echo "$myarray[6]"
# Assoc arrays do not exist in fish
# echo ${assocarr[a]}
echo
echo
echo
echo Funky-"$funky"-funky
echo Funkyenv-"$funkyenv"-funkyenv
echo
echo
echo
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
echo
echo "$funky" | parallel --shellquote
_EOF
)
ssh fish@lo "$myscript"
}
par_env_parallel_fish() {
myscript=$(cat <<'_EOF'
echo 'bug #50435: Remote fifo broke in 20150522'
# Due to $PARALLEL_TMP being transferred
env_parallel --session
set OK OK
echo data from stdin | env_parallel --pipe -S lo --fifo 'cat {}; and echo $OK'
echo data from stdin | env_parallel --pipe -S lo --cat 'cat {}; and echo $OK'
echo OK: 0==$status
echo '### Test failing command with --cat'
echo data from stdin | env_parallel --pipe -S lo --cat 'cat {}; false'
echo OK: 1==$status
echo data from stdin | parallel --pipe -S lo --cat 'cat {}; false'
echo OK: 1==$status
_EOF
)
ssh fish@lo "$myscript"
}
par_env_parallel_--session_fish() {
myscript=$(cat <<'_EOF'
. (which env_parallel.fish)
echo '### Test env_parallel --session'
alias aliasbefore='echo before'
set varbefore 'before'
function funcbefore
echo 'before' "$argv"
end
set arraybefore array before
env_parallel --session
# stuff defined
env_parallel aliasbefore ::: must_fail
env_parallel -S lo aliasbefore ::: must_fail
env_parallel funcbefore ::: must_fail
env_parallel -S lo funcbefore ::: must_fail
env_parallel echo '$varbefore' ::: no_before
env_parallel -S lo echo '$varbefore' ::: no_before
env_parallel echo '$arraybefore' ::: no_before
env_parallel -S lo echo '$arraybefore' ::: no_before
alias aliasafter='echo after'
set varafter 'after'
function funcafter
echo 'after' "$argv"
end
set arrayafter array after
env_parallel aliasafter ::: aliasafter_OK
env_parallel -S lo aliasafter ::: aliasafter_OK
env_parallel funcafter ::: funcafter_OK
env_parallel -S lo funcafter ::: funcafter_OK
env_parallel echo '$varafter' ::: varafter_OK
env_parallel -S lo echo '$varafter' ::: varafter_OK
env_parallel echo '$arrayafter' ::: arrayafter_OK
env_parallel -S lo echo '$arrayafter' ::: arrayafter_OK
set -e PARALLEL_IGNORED_NAMES
_EOF
)
ssh fish@lo "$myscript" 2>&1 |
perl -pe 's/^[ ~^]+$//g'
}
export -f $(compgen -A function | grep par_)
clean_output() {
perl -pe 's/line \d\d+/line 99/g;
s/\d+ >= \d+/999 >= 999/;
s/sh:? \d?\d\d:/sh: 999:/;
s/:\d?\d\d:/:999:/;
s/sh\[\d+\]/sh[999]/;
s/.*(tange|zenodo).*//i;
s:/usr/bin:/bin:g;
s:/tmp/par-job-\d+_.....\[\d+\]:script[9]:g;
s!/tmp/par-job-\d+_.....!script!g;
s/script: \d\d+/script: 99/g;
'
}
compgen -A function | G par_ "$@" | LC_ALL=C sort |
parallel --joblog /tmp/jl-`basename $0` -j1 --retries 2 --tag -k '{} 2>&1' |
clean_output

View file

@ -23,7 +23,7 @@ srcdir=$(echo "$testsuitedir" | perl -pe 's=$ENV{HOME}==')
export SERVER1=parallel@lo
export SERVER2=csh@lo
export PARALLEL=-k
perl -ne '$/="\n\n"; /^Output/../^[^O]\S/ and next; /^ / and print;' "$testsuitedir"/../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)' |
egrep -v 'shellquote|works|num128|--filter-hosts|--tmux|my_id' |
perl -pe 's/username@//;s/user@//;

View file

@ -63,7 +63,6 @@ EOF
sql $MYSQL_TEST_DBURL/sqlunittest <"$unittest"
}
testtable() {
tbl=$1
cat <<EOF
@ -97,7 +96,7 @@ par_sql_aliases() {
sql sql:sql::sqlunittest "SELECT 'Yes it works' as 'Test sql:sql::alias';"
}
par_noheaders() {
par__noheaders() {
echo "### Test --noheaders --no-headers -n"
testtable noheader | sql "$DBURL"
sql -n "$DBURL" 'select * from noheader order by id' |
@ -108,7 +107,7 @@ par_noheaders() {
parallel -k --colsep '\t' echo {2} {1}
}
par_--sep() {
par_sep() {
echo "### Test --sep -s";
sql --no-headers -s : pg:/// 'select 1,2' |
parallel --colsep ':' echo {2} {1}
@ -116,7 +115,7 @@ par_--sep() {
parallel --colsep ':' echo {2} {1}
}
par_--passthrough() {
par_passthrough() {
echo "### Test --passthrough -p";
testtable passthrough | sql "$DBURL"
sql -p -H "$DBURL" 'select * from passthrough'
@ -125,68 +124,68 @@ par_--passthrough() {
echo
}
par_--html() {
par_html() {
echo "### Test --html";
testtable html | sql "$DBURL"
sql --html "$DBURL" 'select * from html'
echo
}
par_listproc() {
par__listproc() {
echo "### Test --show-processlist|proclist|listproc";
# Take the minimum of 3 runs to avoid error counting
# if one of the other jobs happens to be running
(
sql --show-processlist "$DBURL" | wc -lw
sql --show-processlist "$DBURL" | wc -lw
sql --show-processlist "$DBURL" | wc -lw
) | sort | head -n1
(
sql --proclist "$DBURL" | wc -lw
sql --proclist "$DBURL" | wc -lw
sql --proclist "$DBURL" | wc -lw
) | sort | head -n1
(
sql --listproc "$DBURL" | wc -lw
sql --listproc "$DBURL" | wc -lw
sql --listproc "$DBURL" | wc -lw
) | sort | head -n1
}
par_dbsize() {
par__dbsize() {
echo "### Test --db-size --dbsize";
sql --dbsize "$DBURL" | wc -w
sql --db-size "$DBURL" | wc -w
}
par_tablesize() {
par__tablesize() {
echo "### Test --table-size --tablesize"
sql --showtables "$DBURL" | grep TBL | parallel sql "$DBURL" drop table
sql --tablesize "$DBURL" | wc -l
sql --table-size "$DBURL" | wc -l
}
par_--debug() {
par_debug() {
echo "### Test --debug"
stdout sql --debug "$DBURL" "SELECT 'Yes it does' as 'Test if --debug works';" |
replace_tmpdir |
perl -pe 's:/...........sql:/tmpfile:g'
}
par_-_version() {
par_version() {
echo "### Test --version -V"
sql --version | wc
sql -V | wc
}
par_-r() {
par_retry() {
echo "### Test -r - retry 3 times"
stdout sql -r --debug pg://nongood@127.0.0.3:2227/ "SELECT 'This should fail 3 times';"
}
par_--retries() {
echo "### Test --retries=s"
stdout sql --retries=4 --debug pg://nongood@127.0.0.3:2227/ "SELECT 'This should fail 4 times';"
}
par_--help() {
par_help() {
echo "### Test --help -h"
sql --help
sql -h
@ -195,4 +194,4 @@ par_--help() {
export -f $(compgen -A function | grep par_)
compgen -A function | G par_ "$@" | LC_ALL=C sort |
parallel --timeout 10 -j0 --tag -k --joblog /tmp/jl-`basename $0` '{} 2>&1'
parallel --timeout 1000% -j0 --tag -k --joblog /tmp/jl-`basename $0` '{} 2>&1'

View file

@ -4,6 +4,9 @@
#
# SPDX-License-Identifier: GPL-3.0-or-later
# Start
(cd "$testsuitedir"; stdout make startdb) >/dev/tty
mysqlrootpass=${mysqlrootpass:-M-b+Ydjq4ejT4E}
MYSQL_ADMIN_DBURL=mysql://root:$mysqlrootpass@/mysql
@ -84,7 +87,7 @@ par_test_dburl_colon() {
par_multiarg_on_command_line() {
echo "### Test oracle with multiple arguments on the command line"
echo ":oraunittest oracle://hr:hr@oracle11.tange.dk/xe" >> ~/.sql/aliases
echo ":oraunittest oracle://SYSTEM:$VM_ORACLE_PWD@/FREE" >> ~/.sql/aliases
uniqify ~/.sql/aliases
sql :oraunittest "WHENEVER SQLERROR EXIT FAILURE" "SELECT 'arg2' FROM DUAL;" "SELECT 'arg3' FROM DUAL;"
}
@ -106,7 +109,11 @@ par_showdatabases() {
par_listproc() {
echo "### Test --listproc"
sql --listproc :oraunittest
sql --listproc :oraunittest |
perl -ne '/select 1 from dual|user_objects|user_tablespaces|connect_by_filtering/ and next;
s/[21]\.\d+/1.99999/;
s/ +/ /g;
print'
sql --listproc $MYSQL_TEST_DBURL |
perl -pe 's/^\d+/XXX/'
}

View file

@ -211,6 +211,23 @@ par_keep_order ### Bug made 3 go before 1 2
par_keep_order 1
par_keep_order 2
par_keep_order 3
par_keep_order_make_job_1_output_fast # EXAMPLE: Keep order, but make job 1 output fast
par_keep_order_make_job_1_output_fast 9 ERR
par_keep_order_make_job_1_output_fast 9 out
par_keep_order_make_job_1_output_fast 9 ERR
par_keep_order_make_job_1_output_fast 9 out
par_keep_order_make_job_1_output_fast 1 out
par_keep_order_make_job_1_output_fast 1 out
par_keep_order_make_job_1_output_fast 1 ERR
par_keep_order_make_job_1_output_fast 1 ERR
par_keep_order_make_job_1_output_fast 2 out
par_keep_order_make_job_1_output_fast 2 out
par_keep_order_make_job_1_output_fast 2 ERR
par_keep_order_make_job_1_output_fast 2 ERR
par_keep_order_make_job_1_output_fast 3 out
par_keep_order_make_job_1_output_fast 3 out
par_keep_order_make_job_1_output_fast 3 ERR
par_keep_order_make_job_1_output_fast 3 ERR
par_long_input ### Long input lines should not fail if they are not used
par_long_input a a a a
par_long_input b b b b

View file

@ -1527,9 +1527,6 @@ par__groupby_pipepart csv , s/^(\d+[\t ,]+){2}(\d+).*/$2/ NewRec
par__groupby_pipepart csv , s/^(\d+[\t ,]+){2}(\d+).*/$2/ 90001 90001 1170031
par__keeporder_roundrobin bug #50081: --keep-order --round-robin should give predictable results
par__keeporder_roundrobin OK
par__memory_leak ### Test for memory leaks
par__memory_leak Of 300 runs of 1 job at least one should be bigger than a 3000 job run
par__memory_leak Good: No memleak detected.
par__plus_dyn_repl Dynamic replacement strings defined by --plus
par__plus_dyn_repl myval
par__plus_dyn_repl myval

View file

@ -254,6 +254,57 @@ par__argfile_plus 2 11 6
par__argfile_plus 3 12 4
par__argfile_plus 3 12 5
par__argfile_plus 3 12 6
par__parset2 ### parset into array
par__parset2 foo bar baz
par__parset2 foo bar baz
par__parset2 ### parset into vars with comma
par__parset2 foo bar baz
par__parset2 foo bar baz
par__parset2 ### parset into vars with space
par__parset2 foo bar baz
par__parset2 foo bar baz
par__parset2 ### parset with newlines
par__parset2 1 1 2 1 2 3
par__parset2 1
par__parset2 1
par__parset2 2
par__parset2 1
par__parset2 2
par__parset2 3
par__parset2 ### parset into indexed array vars
par__parset2 foo bar baz
par__parset2 foo bar baz
par__parset2 foo bar bar
par__parset2 foo bar bar
par__parset2 ### env_parset
par__parset2 myecho myvar myarr 1 foo myecho myvar myarr 1 bar myecho myvar myarr 1 baz
par__parset2 myecho myvar myarr 1 foo myecho myvar myarr 1 bar myecho myvar myarr 1 baz
par__parset2 myecho myvar myarr 1 foo myecho myvar myarr 1 bar myecho myvar myarr 1 baz
par__parset2 myecho myvar myarr 1 foo myecho myvar myarr 1 bar myecho myvar myarr 1 baz
par__parset2 myecho myvar myarr 1 foo myecho myvar myarr 1 bar myecho myvar myarr 1 baz
par__parset2 myecho myvar myarr 1 foo myecho myvar myarr 1 bar myecho myvar myarr 1 baz
par__parset2 newline1 newline2 1 newline1 newline2 1 2 newline1 newline2 1 2 3
par__parset2 newline1
par__parset2 newline2
par__parset2 1
par__parset2 newline1
par__parset2 newline2
par__parset2 1
par__parset2 2
par__parset2 newline1
par__parset2 newline2
par__parset2 1
par__parset2 2
par__parset2 3
par__parset2 myecho myvar myarr 1 foo myecho myvar myarr 1 bar myecho myvar myarr 1 baz
par__parset2 myecho myvar myarr 1 foo myecho myvar myarr 1 bar myecho myvar myarr 1 baz
par__parset2 myecho myvar myarr 1 foo myecho myvar myarr 1 bar myecho myvar myarr 1 bar
par__parset2 myecho myvar myarr 1 foo myecho myvar myarr 1 bar myecho myvar myarr 1 bar
par__parset2 bug #52507: parset arr1 -v echo ::: fails
par__parset2 seq 3
par__parset2 1
par__parset2 2
par__parset2 3
par__parset_assoc_arr bash@lo parset into an assoc array
par__parset_assoc_arr bash@lo val 1 val 2 val 3
par__parset_assoc_arr bash@lo val 1 val 2 val 3
@ -630,7 +681,7 @@ par__test_cpu_detection_topology 1 4 8 4
par__test_cpu_detection_topology 1-2-4-2 ThinkPad A475 AMD PRO A12-8830B R7 (64g)
par__test_cpu_detection_topology 1 2 4 2
par__test_cpu_detection_topology 1-16-24-16 8*2 thr + 8*1 thr Intel Core i7-13700HX (user submit)
par__test_cpu_detection_topology 1 4 8 4
par__test_cpu_detection_topology 1 2 4 2
par_children_receive_sig ### Do children receive --termseq signals
par_children_receive_sig parallel: Warning: This job was killed because it timed out:
par_children_receive_sig parallel: Warning: show_signals ''
@ -851,57 +902,6 @@ par_parset 9
par_parset Commands with newline require -0
par_parset line1
par_parset line2
par_parset2 ### parset into array
par_parset2 foo bar baz
par_parset2 foo bar baz
par_parset2 ### parset into vars with comma
par_parset2 foo bar baz
par_parset2 foo bar baz
par_parset2 ### parset into vars with space
par_parset2 foo bar baz
par_parset2 foo bar baz
par_parset2 ### parset with newlines
par_parset2 1 1 2 1 2 3
par_parset2 1
par_parset2 1
par_parset2 2
par_parset2 1
par_parset2 2
par_parset2 3
par_parset2 ### parset into indexed array vars
par_parset2 foo bar baz
par_parset2 foo bar baz
par_parset2 foo bar bar
par_parset2 foo bar bar
par_parset2 ### env_parset
par_parset2 myecho myvar myarr 1 foo myecho myvar myarr 1 bar myecho myvar myarr 1 baz
par_parset2 myecho myvar myarr 1 foo myecho myvar myarr 1 bar myecho myvar myarr 1 baz
par_parset2 myecho myvar myarr 1 foo myecho myvar myarr 1 bar myecho myvar myarr 1 baz
par_parset2 myecho myvar myarr 1 foo myecho myvar myarr 1 bar myecho myvar myarr 1 baz
par_parset2 myecho myvar myarr 1 foo myecho myvar myarr 1 bar myecho myvar myarr 1 baz
par_parset2 myecho myvar myarr 1 foo myecho myvar myarr 1 bar myecho myvar myarr 1 baz
par_parset2 newline1 newline2 1 newline1 newline2 1 2 newline1 newline2 1 2 3
par_parset2 newline1
par_parset2 newline2
par_parset2 1
par_parset2 newline1
par_parset2 newline2
par_parset2 1
par_parset2 2
par_parset2 newline1
par_parset2 newline2
par_parset2 1
par_parset2 2
par_parset2 3
par_parset2 myecho myvar myarr 1 foo myecho myvar myarr 1 bar myecho myvar myarr 1 baz
par_parset2 myecho myvar myarr 1 foo myecho myvar myarr 1 bar myecho myvar myarr 1 baz
par_parset2 myecho myvar myarr 1 foo myecho myvar myarr 1 bar myecho myvar myarr 1 bar
par_parset2 myecho myvar myarr 1 foo myecho myvar myarr 1 bar myecho myvar myarr 1 bar
par_parset2 bug #52507: parset arr1 -v echo ::: fails
par_parset2 seq 3
par_parset2 1
par_parset2 2
par_parset2 3
par_pipe_regexp ### --pipe --regexp
par_pipe_regexp Record
par_pipe_regexp A2, Start, 5

View file

@ -0,0 +1,3 @@
par__memory_leak ### Test for memory leaks
par__memory_leak Of 300 runs of 1 job at least one should be bigger than a 3000 job run
par__memory_leak Good: No memleak detected.

View file

@ -2,18 +2,24 @@ CSV do_dburl CSV
CSV par_append p_wrapper par_append $CSV
CSV par_append Exit=0
CSV par_append Exit=0
CSV par_append Error:
CSV par_append csv:///%2Frun%2Fshm is not a valid DBURL
CSV par_append sql: Error: csv:///%2Frun%2Fshm is not a valid DBURL
CSV par_append
CSV par_append sql [-hnr] [--table-size] [--db-size] [-p pass-through] [-s string] dburl [command]
CSV par_append Usage:
CSV par_append sql [-hnr] [--table-size] [--db-size] [-p pass-through] [-s string] dburl [sqlcommand]
CSV par_append sql [-hnr] [--table-size] [--db-size] [-p pass-through] [-s string] dburl < sql_command_file
CSV par_append
CSV par_append See 'man sql' for the options
CSV par_empty p_wrapper par_empty $CSV
CSV par_empty Do nothing: TBL99999 does not exist because it is not created
CSV par_empty Exit=0
CSV par_empty Exit=0
CSV par_empty Error:
CSV par_empty csv:///%2Frun%2Fshm is not a valid DBURL
CSV par_empty sql: Error: csv:///%2Frun%2Fshm is not a valid DBURL
CSV par_empty
CSV par_empty sql [-hnr] [--table-size] [--db-size] [-p pass-through] [-s string] dburl [command]
CSV par_empty Usage:
CSV par_empty sql [-hnr] [--table-size] [--db-size] [-p pass-through] [-s string] dburl [sqlcommand]
CSV par_empty sql [-hnr] [--table-size] [--db-size] [-p pass-through] [-s string] dburl < sql_command_file
CSV par_empty
CSV par_empty See 'man sql' for the options
CSV par_no_table p_wrapper par_no_table $CSV
CSV par_no_table bug #50018: --dburl without table dies
CSV par_no_table 255
@ -21,10 +27,13 @@ CSV par_no_table 255
CSV par_no_table 255
CSV par_no_table Exit=0
CSV par_no_table Exit=0
CSV par_no_table Error:
CSV par_no_table csv:///%2Frun%2Fshm is not a valid DBURL
CSV par_no_table sql: Error: csv:///%2Frun%2Fshm is not a valid DBURL
CSV par_no_table
CSV par_no_table sql [-hnr] [--table-size] [--db-size] [-p pass-through] [-s string] dburl [command]
CSV par_no_table Usage:
CSV par_no_table sql [-hnr] [--table-size] [--db-size] [-p pass-through] [-s string] dburl [sqlcommand]
CSV par_no_table sql [-hnr] [--table-size] [--db-size] [-p pass-through] [-s string] dburl < sql_command_file
CSV par_no_table
CSV par_no_table See 'man sql' for the options
CSV par_no_table parallel: Error: The DBURL (csv:///%2Frun%2Fshm) must contain a table.
CSV par_no_table parallel: Error: The DBURL (csv:///%2Frun%2Fshm) must contain a table.
CSV par_no_table parallel: Error: The DBURL (csv:///%2Frun%2Fshm) must contain a table.
@ -56,10 +65,13 @@ CSV par_shuf 5 d
CSV par_shuf 5 e
CSV par_shuf Exit=0
CSV par_shuf Exit=0
CSV par_shuf Error:
CSV par_shuf csv:///%2Frun%2Fshm is not a valid DBURL
CSV par_shuf sql: Error: csv:///%2Frun%2Fshm is not a valid DBURL
CSV par_shuf
CSV par_shuf sql [-hnr] [--table-size] [--db-size] [-p pass-through] [-s string] dburl [command]
CSV par_shuf Usage:
CSV par_shuf sql [-hnr] [--table-size] [--db-size] [-p pass-through] [-s string] dburl [sqlcommand]
CSV par_shuf sql [-hnr] [--table-size] [--db-size] [-p pass-through] [-s string] dburl < sql_command_file
CSV par_shuf
CSV par_shuf See 'man sql' for the options
CSV par_sql_joblog p_wrapper par_sql_joblog $CSV
CSV par_sql_joblog ### should only give a single --joblog heading
CSV par_sql_joblog ### --sqlmaster/--sqlworker
@ -168,73 +180,103 @@ CSV par_sql_joblog 24 : 999.999 999.999 0 0 0 0 sleep .3;echo 5 d
CSV par_sql_joblog 25 : 999.999 999.999 0 0 0 0 sleep .3;echo 5 e
CSV par_sql_joblog Exit=0
CSV par_sql_joblog Exit=0
CSV par_sql_joblog Error:
CSV par_sql_joblog csv:///%2Frun%2Fshm is not a valid DBURL
CSV par_sql_joblog sql: Error: csv:///%2Frun%2Fshm is not a valid DBURL
CSV par_sql_joblog
CSV par_sql_joblog sql [-hnr] [--table-size] [--db-size] [-p pass-through] [-s string] dburl [command]
CSV par_sql_joblog Usage:
CSV par_sql_joblog sql [-hnr] [--table-size] [--db-size] [-p pass-through] [-s string] dburl [sqlcommand]
CSV par_sql_joblog sql [-hnr] [--table-size] [--db-size] [-p pass-through] [-s string] dburl < sql_command_file
CSV par_sql_joblog
CSV par_sql_joblog See 'man sql' for the options
CSV par_sqlandworker p_wrapper par_sqlandworker $CSV
CSV par_sqlandworker Exit=0
CSV par_sqlandworker Exit=0
CSV par_sqlandworker Error:
CSV par_sqlandworker csv:///%2Frun%2Fshm is not a valid DBURL
CSV par_sqlandworker sql: Error: csv:///%2Frun%2Fshm is not a valid DBURL
CSV par_sqlandworker
CSV par_sqlandworker sql [-hnr] [--table-size] [--db-size] [-p pass-through] [-s string] dburl [command]
CSV par_sqlandworker Usage:
CSV par_sqlandworker sql [-hnr] [--table-size] [--db-size] [-p pass-through] [-s string] dburl [sqlcommand]
CSV par_sqlandworker sql [-hnr] [--table-size] [--db-size] [-p pass-through] [-s string] dburl < sql_command_file
CSV par_sqlandworker
CSV par_sqlandworker See 'man sql' for the options
CSV par_sqlandworker_compress_linebuffer_tag p_wrapper par_sqlandworker_compress_linebuffer_tag $CSV
CSV par_sqlandworker_compress_linebuffer_tag Exit=0
CSV par_sqlandworker_compress_linebuffer_tag Exit=0
CSV par_sqlandworker_compress_linebuffer_tag Error:
CSV par_sqlandworker_compress_linebuffer_tag csv:///%2Frun%2Fshm is not a valid DBURL
CSV par_sqlandworker_compress_linebuffer_tag sql: Error: csv:///%2Frun%2Fshm is not a valid DBURL
CSV par_sqlandworker_compress_linebuffer_tag
CSV par_sqlandworker_compress_linebuffer_tag sql [-hnr] [--table-size] [--db-size] [-p pass-through] [-s string] dburl [command]
CSV par_sqlandworker_compress_linebuffer_tag Usage:
CSV par_sqlandworker_compress_linebuffer_tag sql [-hnr] [--table-size] [--db-size] [-p pass-through] [-s string] dburl [sqlcommand]
CSV par_sqlandworker_compress_linebuffer_tag sql [-hnr] [--table-size] [--db-size] [-p pass-through] [-s string] dburl < sql_command_file
CSV par_sqlandworker_compress_linebuffer_tag
CSV par_sqlandworker_compress_linebuffer_tag See 'man sql' for the options
CSV par_sqlandworker_linebuffer p_wrapper par_sqlandworker_linebuffer $CSV
CSV par_sqlandworker_linebuffer Exit=0
CSV par_sqlandworker_linebuffer Exit=0
CSV par_sqlandworker_linebuffer Error:
CSV par_sqlandworker_linebuffer csv:///%2Frun%2Fshm is not a valid DBURL
CSV par_sqlandworker_linebuffer sql: Error: csv:///%2Frun%2Fshm is not a valid DBURL
CSV par_sqlandworker_linebuffer
CSV par_sqlandworker_linebuffer sql [-hnr] [--table-size] [--db-size] [-p pass-through] [-s string] dburl [command]
CSV par_sqlandworker_linebuffer Usage:
CSV par_sqlandworker_linebuffer sql [-hnr] [--table-size] [--db-size] [-p pass-through] [-s string] dburl [sqlcommand]
CSV par_sqlandworker_linebuffer sql [-hnr] [--table-size] [--db-size] [-p pass-through] [-s string] dburl < sql_command_file
CSV par_sqlandworker_linebuffer
CSV par_sqlandworker_linebuffer See 'man sql' for the options
CSV par_sqlandworker_linebuffer_tag p_wrapper par_sqlandworker_linebuffer_tag $CSV
CSV par_sqlandworker_linebuffer_tag Exit=0
CSV par_sqlandworker_linebuffer_tag Exit=0
CSV par_sqlandworker_linebuffer_tag Error:
CSV par_sqlandworker_linebuffer_tag csv:///%2Frun%2Fshm is not a valid DBURL
CSV par_sqlandworker_linebuffer_tag sql: Error: csv:///%2Frun%2Fshm is not a valid DBURL
CSV par_sqlandworker_linebuffer_tag
CSV par_sqlandworker_linebuffer_tag sql [-hnr] [--table-size] [--db-size] [-p pass-through] [-s string] dburl [command]
CSV par_sqlandworker_linebuffer_tag Usage:
CSV par_sqlandworker_linebuffer_tag sql [-hnr] [--table-size] [--db-size] [-p pass-through] [-s string] dburl [sqlcommand]
CSV par_sqlandworker_linebuffer_tag sql [-hnr] [--table-size] [--db-size] [-p pass-through] [-s string] dburl < sql_command_file
CSV par_sqlandworker_linebuffer_tag
CSV par_sqlandworker_linebuffer_tag See 'man sql' for the options
CSV par_sqlandworker_lo p_wrapper par_sqlandworker_lo $CSV
CSV par_sqlandworker_lo Exit=0
CSV par_sqlandworker_lo Exit=0
CSV par_sqlandworker_lo Error:
CSV par_sqlandworker_lo csv:///%2Frun%2Fshm is not a valid DBURL
CSV par_sqlandworker_lo sql: Error: csv:///%2Frun%2Fshm is not a valid DBURL
CSV par_sqlandworker_lo
CSV par_sqlandworker_lo sql [-hnr] [--table-size] [--db-size] [-p pass-through] [-s string] dburl [command]
CSV par_sqlandworker_lo Usage:
CSV par_sqlandworker_lo sql [-hnr] [--table-size] [--db-size] [-p pass-through] [-s string] dburl [sqlcommand]
CSV par_sqlandworker_lo sql [-hnr] [--table-size] [--db-size] [-p pass-through] [-s string] dburl < sql_command_file
CSV par_sqlandworker_lo
CSV par_sqlandworker_lo See 'man sql' for the options
CSV par_sqlandworker_results p_wrapper par_sqlandworker_results $CSV
CSV par_sqlandworker_results Exit=0
CSV par_sqlandworker_results Exit=0
CSV par_sqlandworker_results Error:
CSV par_sqlandworker_results csv:///%2Frun%2Fshm is not a valid DBURL
CSV par_sqlandworker_results sql: Error: csv:///%2Frun%2Fshm is not a valid DBURL
CSV par_sqlandworker_results
CSV par_sqlandworker_results sql [-hnr] [--table-size] [--db-size] [-p pass-through] [-s string] dburl [command]
CSV par_sqlandworker_results Usage:
CSV par_sqlandworker_results sql [-hnr] [--table-size] [--db-size] [-p pass-through] [-s string] dburl [sqlcommand]
CSV par_sqlandworker_results sql [-hnr] [--table-size] [--db-size] [-p pass-through] [-s string] dburl < sql_command_file
CSV par_sqlandworker_results
CSV par_sqlandworker_results See 'man sql' for the options
CSV par_sqlandworker_tag p_wrapper par_sqlandworker_tag $CSV
CSV par_sqlandworker_tag Exit=0
CSV par_sqlandworker_tag Exit=0
CSV par_sqlandworker_tag Error:
CSV par_sqlandworker_tag csv:///%2Frun%2Fshm is not a valid DBURL
CSV par_sqlandworker_tag sql: Error: csv:///%2Frun%2Fshm is not a valid DBURL
CSV par_sqlandworker_tag
CSV par_sqlandworker_tag sql [-hnr] [--table-size] [--db-size] [-p pass-through] [-s string] dburl [command]
CSV par_sqlandworker_tag Usage:
CSV par_sqlandworker_tag sql [-hnr] [--table-size] [--db-size] [-p pass-through] [-s string] dburl [sqlcommand]
CSV par_sqlandworker_tag sql [-hnr] [--table-size] [--db-size] [-p pass-through] [-s string] dburl < sql_command_file
CSV par_sqlandworker_tag
CSV par_sqlandworker_tag See 'man sql' for the options
CSV par_sqlandworker_total_jobs p_wrapper par_sqlandworker_total_jobs $CSV
CSV par_sqlandworker_total_jobs Exit=0
CSV par_sqlandworker_total_jobs Exit=0
CSV par_sqlandworker_total_jobs Error:
CSV par_sqlandworker_total_jobs csv:///%2Frun%2Fshm is not a valid DBURL
CSV par_sqlandworker_total_jobs sql: Error: csv:///%2Frun%2Fshm is not a valid DBURL
CSV par_sqlandworker_total_jobs
CSV par_sqlandworker_total_jobs sql [-hnr] [--table-size] [--db-size] [-p pass-through] [-s string] dburl [command]
CSV par_sqlandworker_total_jobs Usage:
CSV par_sqlandworker_total_jobs sql [-hnr] [--table-size] [--db-size] [-p pass-through] [-s string] dburl [sqlcommand]
CSV par_sqlandworker_total_jobs sql [-hnr] [--table-size] [--db-size] [-p pass-through] [-s string] dburl < sql_command_file
CSV par_sqlandworker_total_jobs
CSV par_sqlandworker_total_jobs See 'man sql' for the options
CSV par_sqlandworker_unbuffer p_wrapper par_sqlandworker_unbuffer $CSV
CSV par_sqlandworker_unbuffer Exit=0
CSV par_sqlandworker_unbuffer Exit=0
CSV par_sqlandworker_unbuffer Error:
CSV par_sqlandworker_unbuffer csv:///%2Frun%2Fshm is not a valid DBURL
CSV par_sqlandworker_unbuffer sql: Error: csv:///%2Frun%2Fshm is not a valid DBURL
CSV par_sqlandworker_unbuffer
CSV par_sqlandworker_unbuffer sql [-hnr] [--table-size] [--db-size] [-p pass-through] [-s string] dburl [command]
CSV par_sqlandworker_unbuffer Usage:
CSV par_sqlandworker_unbuffer sql [-hnr] [--table-size] [--db-size] [-p pass-through] [-s string] dburl [sqlcommand]
CSV par_sqlandworker_unbuffer sql [-hnr] [--table-size] [--db-size] [-p pass-through] [-s string] dburl < sql_command_file
CSV par_sqlandworker_unbuffer
CSV par_sqlandworker_unbuffer See 'man sql' for the options
INFLUX do_dburl INFLUX
INFLUX par_append p_wrapper par_append $INFLUX
INFLUX par_append Exit=255

View file

@ -1,9 +1,12 @@
par_few_duplicate_run $CSV par_few_duplicate_run $CSV
par_few_duplicate_run $CSV ### With many workers there will be some duplicates
par_few_duplicate_run $CSV Error:
par_few_duplicate_run $CSV csv:///%2Frun%2Fshm%2Fcsv is not a valid DBURL
par_few_duplicate_run $CSV sql: Error: csv:///%2Frun%2Fshm%2Fcsv is not a valid DBURL
par_few_duplicate_run $CSV
par_few_duplicate_run $CSV sql [-hnr] [--table-size] [--db-size] [-p pass-through] [-s string] dburl [command]
par_few_duplicate_run $CSV Usage:
par_few_duplicate_run $CSV sql [-hnr] [--table-size] [--db-size] [-p pass-through] [-s string] dburl [sqlcommand]
par_few_duplicate_run $CSV sql [-hnr] [--table-size] [--db-size] [-p pass-through] [-s string] dburl < sql_command_file
par_few_duplicate_run $CSV
par_few_duplicate_run $CSV See 'man sql' for the options
par_few_duplicate_run $CSV OK
par_few_duplicate_run $MYSQL par_few_duplicate_run $MYSQL
par_few_duplicate_run $MYSQL ### With many workers there will be some duplicates

View file

@ -75,15 +75,17 @@ par__sshpass_with_password parallel: Warning: Using password or SSHPASS with --(
par__sshpass_with_password parallel: Warning: on the command line, making it visible to local users via `ps`.
par__sshpass_with_password OK
par__sshpass_with_password ### Crazy passwords: `date>>/tmp/trap`;(|<*&)'
par__sshpass_with_password # These fail. The important part is that /tmp/trap is empty
par__sshpass_with_password parallel: Warning: Using password or SSHPASS with --(n)onall exposes the password
par__sshpass_with_password parallel: Warning: on the command line, making it visible to local users via `ps`.
par__sshpass_with_password ssh: Could not resolve hostname host:
par__sshpass_with_password Permission denied, please try again.
par__sshpass_with_password
par__sshpass_with_password parallel: Warning: Using password or SSHPASS with --(n)onall exposes the password
par__sshpass_with_password parallel: Warning: on the command line, making it visible to local users via `ps`.
par__sshpass_with_password ssh: Could not resolve hostname host:
par__sshpass_with_password Permission denied, please try again.
par__sshpass_with_password
par__sshpass_with_password This must stay empty:
par__sshpass_with_password OK
par_csh_variable_newline ### Can csh propagate a variable containing \n
par_csh_variable_newline 1
par_csh_variable_newline 2

View file

@ -160,7 +160,8 @@ par_--nonall_results /TMP/nonall/slash/sh@lo/1
par_--nonall_results /TMP/nonall/slash/sh@lo/1/seq
par_--nonall_results /TMP/nonall/slash/sh@lo/1/stderr
par_--nonall_results /TMP/nonall/slash/sh@lo/1/stdout
par_--tmux_length ### works
par_--tmux_length ### tmux examples that earlier blocked
par_--tmux_length Runtime 14 seconds on non-loaded machine
par_--tmux_length See output with: tmux -S /TMP/tmsXXXXX attach
par_--tmux_length See output with: tmux -S /TMP/tmsXXXXX attach
par_--tmux_length ### These blocked due to length

View file

@ -69,43 +69,6 @@ par_--env_underscore_dash /bin/dash: 1: myecho: not found
par_--env_underscore_dash OK if no myecho ^^^^^^^^^^^^^^^^^
par_--env_underscore_dash script: 2: myecho: not found
par_--env_underscore_dash OK if no myecho ^^^^^^^^^^^^^^^^^
par_--env_underscore_fish ### fish
par_--env_underscore_fish Fish is broken
par_--env_underscore_fish ### Testing of --env _
par_--env_underscore_fish Test copying
par_--env_underscore_fish variables in aliases and arrays in functions work
par_--env_underscore_fish variables in aliases and arrays in functions work
par_--env_underscore_fish variables in aliases and arrays in functions work
par_--env_underscore_fish variables in aliases and arrays in functions work
par_--env_underscore_fish variables in aliases and arrays in functions work
par_--env_underscore_fish variables in aliases and arrays in functions work
par_--env_underscore_fish Test ignoring
par_--env_underscore_fish script (line 99):
par_--env_underscore_fish not_copied_alias 'error=OK'
par_--env_underscore_fish script (line 99):
par_--env_underscore_fish not_copied_func 'error=OK'
par_--env_underscore_fish error=OK
par_--env_underscore_fish error=OK
par_--env_underscore_fish Test single ignoring
par_--env_underscore_fish aliases and arrays in functions work
par_--env_underscore_fish aliases and arrays in functions work
par_--env_underscore_fish aliases functions work
par_--env_underscore_fish aliases functions work
par_--env_underscore_fish myecho $myarray functions $argv
par_--env_underscore_fish
par_--env_underscore_fish in function 'myfunc' with arguments 'work'
par_--env_underscore_fish OK if ^^^^^^^^^^^^^^^^^ no myecho
par_--env_underscore_fish script (line 4):
par_--env_underscore_fish myecho $myarray functions $argv
par_--env_underscore_fish
par_--env_underscore_fish in function 'myfunc' with arguments 'work'
par_--env_underscore_fish called on line 99 of file script
par_--env_underscore_fish OK if ^^^^^^^^^^^^^^^^^ no myecho
par_--env_underscore_fish myfunc work
par_--env_underscore_fish OK if ^^^^^^^^^^^^^^^^^ no myfunc
par_--env_underscore_fish script (line 6):
par_--env_underscore_fish myfunc work
par_--env_underscore_fish OK if ^^^^^^^^^^^^^^^^^ no myfunc
par_--env_underscore_ksh ### ksh
par_--env_underscore_ksh ### Testing of --env _
par_--env_underscore_ksh variables in aliases in and arrays in functions work
@ -425,56 +388,6 @@ par__man_dash variables with = & " ! ' work
par__man_dash exit value 2 should be 2
par__man_dash Unknown option: no-such-option
par__man_dash exit value 255 should be 255
par__man_fish ### fish
par__man_fish ### From man env_parallel
par__man_fish aliases with = & " ! ' work
par__man_fish aliases with = & " ! ' work
par__man_fish aliases with = & " ! ' work
par__man_fish aliases with = & " ! ' work
par__man_fish aliases with = & " ! ' work
par__man_fish functions with = & " ! ' work
par__man_fish functions with = & " ! ' work
par__man_fish functions with = & " ! ' work
par__man_fish functions with = & " ! ' work
par__man_fish functions with = & " ! ' work
par__man_fish variables with = & " ! ' work
par__man_fish variables with = & " ! ' work
par__man_fish variables with = & " ! ' work
par__man_fish variables with = & " ! ' work
par__man_fish variables with = & " ! ' work
par__man_fish multiline
par__man_fish variables with = & " ! ' work
par__man_fish multiline
par__man_fish variables with = & " ! ' work
par__man_fish multiline
par__man_fish variables with = & " ! ' work
par__man_fish multiline
par__man_fish variables with = & " ! ' work
par__man_fish multiline
par__man_fish variables with = & " ! ' work
par__man_fish arrays with = & " ! ' work, too
par__man_fish
par__man_fish work,
par__man_fish too
par__man_fish
par__man_fish arrays
par__man_fish with = & " ! '
par__man_fish work,
par__man_fish too
par__man_fish arrays
par__man_fish with = & " ! '
par__man_fish work,
par__man_fish too
par__man_fish arrays
par__man_fish with = & " ! '
par__man_fish work,
par__man_fish too
par__man_fish multi
par__man_fish level
par__man_fish env_parallel
par__man_fish exit value 2 should be 2
par__man_fish Unknown option: no-such-option
par__man_fish exit value 255 should be 255 `sleep 1`
par__man_ksh ### ksh
par__man_ksh ### From man env_parallel
par__man_ksh aliases with = & " ! ' work
@ -1104,35 +1017,6 @@ par_env_parallel_--session_dash after aliasafter_OK
par_env_parallel_--session_dash after aliasafter_OK
par_env_parallel_--session_dash after varafter_OK
par_env_parallel_--session_dash after varafter_OK
par_env_parallel_--session_fish ### Test env_parallel --session
par_env_parallel_--session_fish fish: Unknown command: aliasbefore
par_env_parallel_--session_fish fish:
par_env_parallel_--session_fish aliasbefore must_fail
par_env_parallel_--session_fish
par_env_parallel_--session_fish fish: Unknown command: aliasbefore
par_env_parallel_--session_fish script (line 6):
par_env_parallel_--session_fish aliasbefore must_fail
par_env_parallel_--session_fish
par_env_parallel_--session_fish fish: Unknown command: funcbefore
par_env_parallel_--session_fish fish:
par_env_parallel_--session_fish funcbefore must_fail
par_env_parallel_--session_fish
par_env_parallel_--session_fish fish: Unknown command: funcbefore
par_env_parallel_--session_fish script (line 6):
par_env_parallel_--session_fish funcbefore must_fail
par_env_parallel_--session_fish
par_env_parallel_--session_fish no_before
par_env_parallel_--session_fish no_before
par_env_parallel_--session_fish no_before
par_env_parallel_--session_fish no_before
par_env_parallel_--session_fish after aliasafter_OK
par_env_parallel_--session_fish after aliasafter_OK
par_env_parallel_--session_fish after funcafter_OK
par_env_parallel_--session_fish after funcafter_OK
par_env_parallel_--session_fish after varafter_OK
par_env_parallel_--session_fish after varafter_OK
par_env_parallel_--session_fish array after arrayafter_OK
par_env_parallel_--session_fish array after arrayafter_OK
par_env_parallel_--session_ksh ### Test env_parallel --session
par_env_parallel_--session_ksh ### level0 should be hidden, level1 should be transferred
par_env_parallel_--session_ksh
@ -1631,17 +1515,6 @@ par_env_parallel_dash bug #50435: Remote fifo broke in 20150522
par_env_parallel_dash bug #52534: Tail of multiline alias is ignored
par_env_parallel_dash data from stdin
par_env_parallel_dash data from stdin
par_env_parallel_fish bug #50435: Remote fifo broke in 20150522
par_env_parallel_fish data from stdin
par_env_parallel_fish OK
par_env_parallel_fish data from stdin
par_env_parallel_fish OK
par_env_parallel_fish OK: 0==0
par_env_parallel_fish ### Test failing command with --cat
par_env_parallel_fish data from stdin
par_env_parallel_fish OK: 1==1
par_env_parallel_fish data from stdin
par_env_parallel_fish OK: 1==1
par_env_parallel_ksh OK
par_env_parallel_ksh OK
par_env_parallel_ksh alias line 1
@ -1754,7 +1627,6 @@ par_environment_too_big_bash parallel: Error: Command line too long (999 >= 999)
par_environment_too_big_bash parallel: Error: Command line too long (999 >= 999) at input 0: fail_bigfunc_quote_remote
par_environment_too_big_csh Not implemented
par_environment_too_big_dash moved to hwdep1.sh
par_environment_too_big_fish Not implemented
par_environment_too_big_ksh bug #50815: env_parallel should warn if the environment is too big
par_environment_too_big_ksh OK_bigvar
par_environment_too_big_ksh OK_bigvar_remote
@ -1855,38 +1727,6 @@ par_funky_dash ' '
par_funky_dash ' par_funky_dash  !"#$%&'"'"'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~<7F>ƒ„…†‡ˆ‰ŠŒ<E280B9>Ž<EFBFBD><C5BD>“”•˜™šœ<E280BA>žŸ ¡¢£¤¥¦§¨©ª«¬­®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ'
par_funky_dash 3 arg alias_works
par_funky_dash 3 arg alias_works_over_ssh
par_funky_fish env_parallel: Warning: ASCII value 1 in variables is not supported
par_funky_fish 3 arg alias_works
par_funky_fish env_parallel: Warning: ASCII value 1 in variables is not supported
par_funky_fish function_works
par_funky_fish myvar works
par_funky_fish myenvvar works
par_funky_fish space 6
par_funky_fish
par_funky_fish
par_funky_fish
par_funky_fish Funky- par_funky_fish  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~€亗儎厗噲墛媽崕彁憭摂晼棙櫄洔潪煚、¥ウЖ┆<D096><E29486><EFBFBD>辈炒刀犯购患骄坷谅媚牌侨墒颂臀闲岩釉罩棕仝圮蒉哙徕沅彐玷殛腱眍镳耱篝貊鼬<E8B28A><E9BCAC><EFBFBD><EFBFBD>-funky
par_funky_fish Funkyenv- par_funky_fish  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~€亗儎厗噲墛媽崕彁憭摂晼棙櫄洔潪煚、¥ウЖ┆<D096><E29486><EFBFBD>辈炒刀犯购患骄坷谅媚牌侨墒颂臀闲岩釉罩棕仝圮蒉哙徕沅彐玷殛腱眍镳耱篝貊鼬<E8B28A><E9BCAC><EFBFBD><EFBFBD>-funkyenv
par_funky_fish
par_funky_fish
par_funky_fish
par_funky_fish env_parallel: Warning: ASCII value 1 in variables is not supported
par_funky_fish 3 arg alias_works_over_ssh
par_funky_fish env_parallel: Warning: ASCII value 1 in variables is not supported
par_funky_fish function_works_over_ssh
par_funky_fish myvar works
par_funky_fish myenvvar works
par_funky_fish space 6
par_funky_fish
par_funky_fish
par_funky_fish
par_funky_fish Funky- par_funky_fish  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~€亗儎厗噲墛媽崕彁憭摂晼棙櫄洔潪煚、¥ウЖ┆<D096><E29486><EFBFBD>辈炒刀犯购患骄坷谅媚牌侨墒颂臀闲岩釉罩棕仝圮蒉哙徕沅彐玷殛腱眍镳耱篝貊鼬<E8B28A><E9BCAC><EFBFBD><EFBFBD>-funky
par_funky_fish Funkyenv- par_funky_fish  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~€亗儎厗噲墛媽崕彁憭摂晼棙櫄洔潪煚、¥ウЖ┆<D096><E29486><EFBFBD>辈炒刀犯购患骄坷谅媚牌侨墒颂臀闲岩釉罩棕仝圮蒉哙徕沅彐玷殛腱眍镳耱篝貊鼬<E8B28A><E9BCAC><EFBFBD><EFBFBD>-funkyenv
par_funky_fish
par_funky_fish
par_funky_fish
par_funky_fish
par_funky_fish ' par_funky_fish  !"#$%&'"'"'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~€亗儎厗噲墛媽崕彁憭摂晼棙櫄洔潪煚、¥ウЖ┆<D096><E29486><EFBFBD>辈炒刀犯购患骄坷谅媚牌侨墒颂臀闲岩釉罩棕仝圮蒉哙徕沅彐玷殛腱眍镳耱篝貊鼬<E8B28A><E9BCAC><EFBFBD><EFBFBD>'
par_funky_ksh
par_funky_ksh par_funky_ksh  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~<7F>ƒ„…†‡ˆ‰ŠŒ<E280B9>Ž<EFBFBD><C5BD>“”•˜™šœ<E280BA>žŸ ¡¢£¤¥¦§¨©ª«¬­®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ-funky
par_funky_ksh par_funky_ksh  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~<7F>ƒ„…†‡ˆ‰ŠŒ<E280B9>Ž<EFBFBD><C5BD>“”•˜™šœ<E280BA>žŸ ¡¢£¤¥¦§¨©ª«¬­®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ-funky
@ -2051,7 +1891,6 @@ par_parset_dash 2
par_parset_dash 3
par_parset_dash Exit value 2 = 2
par_parset_dash Exit value 2 = 2
par_parset_fish Not implemented
par_parset_ksh parset
par_parset_ksh ### parset into array
par_parset_ksh foo bar baz
@ -2213,3 +2052,160 @@ par_parset_zsh myecho myvar myarr 0 myfun foo myecho myvar myarr 0 myfun ba
par_parset_zsh myecho myvar myarr 0 myfun foo myecho myvar myarr 0 myfun bar myecho myvar myarr 0 myfun baz
par_parset_zsh Exit value 2 = 2
par_parset_zsh Exit value 2 = 2
par_--env_underscore_fish ### fish
par_--env_underscore_fish Fish is broken
par_--env_underscore_fish ### Testing of --env _
par_--env_underscore_fish Test copying
par_--env_underscore_fish *** Moved to parallel-ssh-fish.sh ***
par_--env_underscore_fish Test ignoring
par_--env_underscore_fish script (line 99):
par_--env_underscore_fish not_copied_alias 'error=OK'
par_--env_underscore_fish script (line 99):
par_--env_underscore_fish not_copied_func 'error=OK'
par_--env_underscore_fish error=OK
par_--env_underscore_fish error=OK
par_--env_underscore_fish Test single ignoring
par_--env_underscore_fish aliases and arrays in functions work
par_--env_underscore_fish aliases and arrays in functions work
par_--env_underscore_fish aliases functions work
par_--env_underscore_fish aliases functions work
par_--env_underscore_fish myecho $myarray functions $argv
par_--env_underscore_fish
par_--env_underscore_fish in function 'myfunc' with arguments 'work'
par_--env_underscore_fish OK if ^^^^^^^^^^^^^^^^^ no myecho
par_--env_underscore_fish script (line 4):
par_--env_underscore_fish myecho $myarray functions $argv
par_--env_underscore_fish
par_--env_underscore_fish in function 'myfunc' with arguments 'work'
par_--env_underscore_fish called on line 99 of file script
par_--env_underscore_fish OK if ^^^^^^^^^^^^^^^^^ no myecho
par_--env_underscore_fish myfunc work
par_--env_underscore_fish OK if ^^^^^^^^^^^^^^^^^ no myfunc
par_--env_underscore_fish script (line 6):
par_--env_underscore_fish myfunc work
par_--env_underscore_fish OK if ^^^^^^^^^^^^^^^^^ no myfunc
par__man_fish ### fish
par__man_fish ### From man env_parallel
par__man_fish aliases with = & " ! ' work
par__man_fish aliases with = & " ! ' work
par__man_fish aliases with = & " ! ' work
par__man_fish aliases with = & " ! ' work
par__man_fish aliases with = & " ! ' work
par__man_fish functions with = & " ! ' work
par__man_fish functions with = & " ! ' work
par__man_fish functions with = & " ! ' work
par__man_fish functions with = & " ! ' work
par__man_fish functions with = & " ! ' work
par__man_fish variables with = & " ! ' work
par__man_fish variables with = & " ! ' work
par__man_fish variables with = & " ! ' work
par__man_fish variables with = & " ! ' work
par__man_fish variables with = & " ! ' work
par__man_fish multiline
par__man_fish variables with = & " ! ' work
par__man_fish multiline
par__man_fish variables with = & " ! ' work
par__man_fish multiline
par__man_fish variables with = & " ! ' work
par__man_fish multiline
par__man_fish variables with = & " ! ' work
par__man_fish multiline
par__man_fish variables with = & " ! ' work
par__man_fish arrays with = & " ! ' work, too
par__man_fish # these 4 fail often. Race condition?
par__man_fish arrays
par__man_fish with = & " ! '
par__man_fish work,
par__man_fish too
par__man_fish arrays
par__man_fish with = & " ! '
par__man_fish work,
par__man_fish too
par__man_fish arrays
par__man_fish with = & " ! '
par__man_fish work,
par__man_fish too
par__man_fish arrays
par__man_fish with = & " ! '
par__man_fish work,
par__man_fish too
par__man_fish multi
par__man_fish level
par__man_fish env_parallel
par__man_fish exit value 2 should be 2
par__man_fish Unknown option: no-such-option
par__man_fish exit value 255 should be 255 `sleep 1`
par_env_parallel_--session_fish ### Test env_parallel --session
par_env_parallel_--session_fish fish: Unknown command: aliasbefore
par_env_parallel_--session_fish fish:
par_env_parallel_--session_fish aliasbefore must_fail
par_env_parallel_--session_fish
par_env_parallel_--session_fish fish: Unknown command: aliasbefore
par_env_parallel_--session_fish script (line 6):
par_env_parallel_--session_fish aliasbefore must_fail
par_env_parallel_--session_fish
par_env_parallel_--session_fish fish: Unknown command: funcbefore
par_env_parallel_--session_fish fish:
par_env_parallel_--session_fish funcbefore must_fail
par_env_parallel_--session_fish
par_env_parallel_--session_fish fish: Unknown command: funcbefore
par_env_parallel_--session_fish script (line 6):
par_env_parallel_--session_fish funcbefore must_fail
par_env_parallel_--session_fish
par_env_parallel_--session_fish no_before
par_env_parallel_--session_fish no_before
par_env_parallel_--session_fish no_before
par_env_parallel_--session_fish no_before
par_env_parallel_--session_fish after aliasafter_OK
par_env_parallel_--session_fish after aliasafter_OK
par_env_parallel_--session_fish after funcafter_OK
par_env_parallel_--session_fish after funcafter_OK
par_env_parallel_--session_fish after varafter_OK
par_env_parallel_--session_fish after varafter_OK
par_env_parallel_--session_fish array after arrayafter_OK
par_env_parallel_--session_fish array after arrayafter_OK
par_env_parallel_fish bug #50435: Remote fifo broke in 20150522
par_env_parallel_fish data from stdin
par_env_parallel_fish OK
par_env_parallel_fish data from stdin
par_env_parallel_fish OK
par_env_parallel_fish OK: 0==0
par_env_parallel_fish ### Test failing command with --cat
par_env_parallel_fish data from stdin
par_env_parallel_fish OK: 1==1
par_env_parallel_fish data from stdin
par_env_parallel_fish OK: 1==1
par_environment_too_big_fish Not implemented
par_funky_fish env_parallel: Warning: ASCII value 1 in variables is not supported
par_funky_fish 3 arg alias_works
par_funky_fish env_parallel: Warning: ASCII value 1 in variables is not supported
par_funky_fish function_works
par_funky_fish myvar works
par_funky_fish myenvvar works
par_funky_fish space 6
par_funky_fish
par_funky_fish
par_funky_fish
par_funky_fish Funky- par_funky_fish  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~€亗儎厗噲墛媽崕彁憭摂晼棙櫄洔潪煚、¥ウЖ┆<D096><E29486><EFBFBD>辈炒刀犯购患骄坷谅媚牌侨墒颂臀闲岩釉罩棕仝圮蒉哙徕沅彐玷殛腱眍镳耱篝貊鼬<E8B28A><E9BCAC><EFBFBD><EFBFBD>-funky
par_funky_fish Funkyenv- par_funky_fish  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~€亗儎厗噲墛媽崕彁憭摂晼棙櫄洔潪煚、¥ウЖ┆<D096><E29486><EFBFBD>辈炒刀犯购患骄坷谅媚牌侨墒颂臀闲岩釉罩棕仝圮蒉哙徕沅彐玷殛腱眍镳耱篝貊鼬<E8B28A><E9BCAC><EFBFBD><EFBFBD>-funkyenv
par_funky_fish
par_funky_fish
par_funky_fish
par_funky_fish env_parallel: Warning: ASCII value 1 in variables is not supported
par_funky_fish 3 arg alias_works_over_ssh
par_funky_fish env_parallel: Warning: ASCII value 1 in variables is not supported
par_funky_fish function_works_over_ssh
par_funky_fish myvar works
par_funky_fish myenvvar works
par_funky_fish space 6
par_funky_fish
par_funky_fish
par_funky_fish
par_funky_fish Funky- par_funky_fish  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~€亗儎厗噲墛媽崕彁憭摂晼棙櫄洔潪煚、¥ウЖ┆<D096><E29486><EFBFBD>辈炒刀犯购患骄坷谅媚牌侨墒颂臀闲岩釉罩棕仝圮蒉哙徕沅彐玷殛腱眍镳耱篝貊鼬<E8B28A><E9BCAC><EFBFBD><EFBFBD>-funky
par_funky_fish Funkyenv- par_funky_fish  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~€亗儎厗噲墛媽崕彁憭摂晼棙櫄洔潪煚、¥ウЖ┆<D096><E29486><EFBFBD>辈炒刀犯购患骄坷谅媚牌侨墒颂臀闲岩釉罩棕仝圮蒉哙徕沅彐玷殛腱眍镳耱篝貊鼬<E8B28A><E9BCAC><EFBFBD><EFBFBD>-funkyenv
par_funky_fish
par_funky_fish
par_funky_fish
par_funky_fish
par_funky_fish ' par_funky_fish  !"#$%&'"'"'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~€亗儎厗噲墛媽崕彁憭摂晼棙櫄洔潪煚、¥ウЖ┆<D096><E29486><EFBFBD>辈炒刀犯购患骄坷谅媚牌侨墒颂臀闲岩釉罩棕仝圮蒉哙徕沅彐玷殛腱眍镳耱篝貊鼬<E8B28A><E9BCAC><EFBFBD><EFBFBD>'
par_parset_fish Not implemented

View file

@ -34,7 +34,8 @@ par_path_remote_csh StArT
par_path_remote_csh CSH Path before: /bin:/usr/bin with no parallel
par_path_remote_csh parallel: Command not found.
par_path_remote_csh ^^^^^^^^ Not found is OK
par_path_remote_csh /bin:/usr/bin:/tmp OK
par_path_remote_csh parallel: Warning: Could not figure out number of cpus on lo (). Using 1.
par_path_remote_csh OK: /bin:/usr/bin:/tmp
par_path_remote_csh Done
par_retries_1 ### Test of --retries - it should run 13 jobs in total
par_retries_1 OK

View file

@ -976,9 +976,11 @@ foo quuz
bar baz
bar quuz
sql $DBURL 'SELECT * FROM mytable ORDER BY Seq;'
Error:
SELECT * FROM mytable ORDER BY Seq; is not a valid DBURL
sql [-hnr] [--table-size] [--db-size] [-p pass-through] [-s string] dburl [command]
sql: Error: SELECT * FROM mytable ORDER BY Seq; is not a valid DBURL
Usage:
sql [-hnr] [--table-size] [--db-size] [-p pass-through] [-s string] dburl [sqlcommand]
sql [-hnr] [--table-size] [--db-size] [-p pass-through] [-s string] dburl < sql_command_file
See 'man sql' for the options
parallel --sqlmaster $DBURLTABLE echo ::: foo bar ::: baz quuz
parallel: Error: echo is not a valid DBURL
parallel --sqlworker $DBURLTABLE echo ::: foo bar ::: baz quuz

View file

@ -1,78 +1,78 @@
par_--debug ### Test --debug
par_--debug dburl mysql://tange:tange@/
par_--debug databasedriver mysql user tange password tange host port database tange query
par_--debug [ | ((sleep 1; rm /TMP/tmpfile') & mysql --defaults-extra-file=/TMP/tmpfile' --user=tange tange)]
par_--debug Test if --debug works
par_--debug Yes it does
par_--help ### Test --help -h
par_--help Usage:
par_--help sql [options] dburl [sqlcommand]
par_--help sql [options] dburl < sql_command_file
par_--help
par_--help See 'man sql' for the options
par_--help Usage:
par_--help sql [options] dburl [sqlcommand]
par_--help sql [options] dburl < sql_command_file
par_--help
par_--help See 'man sql' for the options
par_--html ### Test --html
par_--html <TABLE BORDER=1><TR><TH>id</TH><TH>data</TH></TR><TR><TD>1</TD><TD>abc</TD></TR><TR><TD>3</TD><TD>def</TD></TR></TABLE>
par_--passthrough ### Test --passthrough -p
par_--passthrough <TABLE BORDER=1><TR><TH>id</TH><TH>data</TH></TR><TR><TD>1</TD><TD>abc</TD></TR><TR><TD>3</TD><TD>def</TD></TR></TABLE>
par_--passthrough <TABLE BORDER=1><TR><TH>id</TH><TH>data</TH></TR><TR><TD>1</TD><TD>abc</TD></TR><TR><TD>3</TD><TD>def</TD></TR></TABLE>
par_--retries ### Test --retries=s
par_--retries dburl pg://nongood@127.0.0.3:2227/
par_--retries databasedriver pg user nongood password host 127.0.0.3 port 2227 database nongood query
par_--retries [ | psql -h 127.0.0.3 -U nongood -p 2227 -d nongood]
par_--retries psql: error: connection to server at "127.0.0.3", port 2227 failed: Connection refused
par_--retries Is the server running on that host and accepting TCP/IP connections?
par_--retries [ | psql -h 127.0.0.3 -U nongood -p 2227 -d nongood]
par_--retries psql: error: connection to server at "127.0.0.3", port 2227 failed: Connection refused
par_--retries Is the server running on that host and accepting TCP/IP connections?
par_--retries [ | psql -h 127.0.0.3 -U nongood -p 2227 -d nongood]
par_--retries psql: error: connection to server at "127.0.0.3", port 2227 failed: Connection refused
par_--retries Is the server running on that host and accepting TCP/IP connections?
par_--retries [ | psql -h 127.0.0.3 -U nongood -p 2227 -d nongood]
par_--retries psql: error: connection to server at "127.0.0.3", port 2227 failed: Connection refused
par_--retries Is the server running on that host and accepting TCP/IP connections?
par_--sep ### Test --sep -s
par_--sep 2 1
par_--sep 2 1
par_-_version ### Test --version -V
par_-_version 13 74 535
par_-_version 13 74 535
par_-r ### Test -r - retry 3 times
par_-r dburl pg://nongood@127.0.0.3:2227/
par_-r databasedriver pg user nongood password host 127.0.0.3 port 2227 database nongood query
par_-r [ | psql -h 127.0.0.3 -U nongood -p 2227 -d nongood]
par_-r psql: error: connection to server at "127.0.0.3", port 2227 failed: Connection refused
par_-r Is the server running on that host and accepting TCP/IP connections?
par_-r [ | psql -h 127.0.0.3 -U nongood -p 2227 -d nongood]
par_-r psql: error: connection to server at "127.0.0.3", port 2227 failed: Connection refused
par_-r Is the server running on that host and accepting TCP/IP connections?
par_-r [ | psql -h 127.0.0.3 -U nongood -p 2227 -d nongood]
par_-r psql: error: connection to server at "127.0.0.3", port 2227 failed: Connection refused
par_-r Is the server running on that host and accepting TCP/IP connections?
par_dbsize ### Test --db-size --dbsize
par_dbsize 6
par_dbsize 6
par__dbsize ### Test --db-size --dbsize
par__dbsize 6
par__dbsize 6
par__listproc ### Test --show-processlist|proclist|listproc
par__listproc 2 17
par__listproc 2 17
par__listproc 2 17
par__noheaders ### Test --noheaders --no-headers -n
par__noheaders abc 1
par__noheaders def 3
par__noheaders abc 1
par__noheaders def 3
par__noheaders abc 1
par__noheaders def 3
par__tablesize ### Test --table-size --tablesize
par__tablesize 93
par__tablesize 93
par_dburl_user_password_host_port ### Test dburl with username password host port
par_dburl_user_password_host_port Test dburl with username password host port
par_dburl_user_password_host_port OK
par_listproc ### Test --show-processlist|proclist|listproc
par_listproc 2 17
par_listproc 2 17
par_listproc 2 17
par_noheaders ### Test --noheaders --no-headers -n
par_noheaders abc 1
par_noheaders def 3
par_noheaders abc 1
par_noheaders def 3
par_noheaders abc 1
par_noheaders def 3
par_debug ### Test --debug
par_debug dburl mysql://tange:tange@/
par_debug databasedriver mysql user tange password tange host port database tange query
par_debug [ | ((sleep 1; rm /TMP/tmpfile') & mysql --defaults-extra-file=/TMP/tmpfile' --user=tange tange)]
par_debug Test if --debug works
par_debug Yes it does
par_help ### Test --help -h
par_help Usage:
par_help sql [-hnr] [--table-size] [--db-size] [-p pass-through] [-s string] dburl [sqlcommand]
par_help sql [-hnr] [--table-size] [--db-size] [-p pass-through] [-s string] dburl < sql_command_file
par_help
par_help See 'man sql' for the options
par_help Usage:
par_help sql [-hnr] [--table-size] [--db-size] [-p pass-through] [-s string] dburl [sqlcommand]
par_help sql [-hnr] [--table-size] [--db-size] [-p pass-through] [-s string] dburl < sql_command_file
par_help
par_help See 'man sql' for the options
par_html ### Test --html
par_html <TABLE BORDER=1><TR><TH>id</TH><TH>data</TH></TR><TR><TD>1</TD><TD>abc</TD></TR><TR><TD>3</TD><TD>def</TD></TR></TABLE>
par_passthrough ### Test --passthrough -p
par_passthrough <TABLE BORDER=1><TR><TH>id</TH><TH>data</TH></TR><TR><TD>1</TD><TD>abc</TD></TR><TR><TD>3</TD><TD>def</TD></TR></TABLE>
par_passthrough <TABLE BORDER=1><TR><TH>id</TH><TH>data</TH></TR><TR><TD>1</TD><TD>abc</TD></TR><TR><TD>3</TD><TD>def</TD></TR></TABLE>
par_read_sql_from_file ### Test reading sql from file
par_read_sql_from_file Test reading SQL from file works
par_read_sql_from_file Yes it does
par_retry ### Test -r - retry 3 times
par_retry dburl pg://nongood@127.0.0.3:2227/
par_retry databasedriver pg user nongood password host 127.0.0.3 port 2227 database nongood query
par_retry [ | psql -h 127.0.0.3 -U nongood -p 2227 -d nongood]
par_retry psql: error: connection to server at "127.0.0.3", port 2227 failed: Connection refused
par_retry Is the server running on that host and accepting TCP/IP connections?
par_retry [ | psql -h 127.0.0.3 -U nongood -p 2227 -d nongood]
par_retry psql: error: connection to server at "127.0.0.3", port 2227 failed: Connection refused
par_retry Is the server running on that host and accepting TCP/IP connections?
par_retry [ | psql -h 127.0.0.3 -U nongood -p 2227 -d nongood]
par_retry psql: error: connection to server at "127.0.0.3", port 2227 failed: Connection refused
par_retry Is the server running on that host and accepting TCP/IP connections?
par_retry ### Test --retries=s
par_retry dburl pg://nongood@127.0.0.3:2227/
par_retry databasedriver pg user nongood password host 127.0.0.3 port 2227 database nongood query
par_retry [ | psql -h 127.0.0.3 -U nongood -p 2227 -d nongood]
par_retry psql: error: connection to server at "127.0.0.3", port 2227 failed: Connection refused
par_retry Is the server running on that host and accepting TCP/IP connections?
par_retry [ | psql -h 127.0.0.3 -U nongood -p 2227 -d nongood]
par_retry psql: error: connection to server at "127.0.0.3", port 2227 failed: Connection refused
par_retry Is the server running on that host and accepting TCP/IP connections?
par_retry [ | psql -h 127.0.0.3 -U nongood -p 2227 -d nongood]
par_retry psql: error: connection to server at "127.0.0.3", port 2227 failed: Connection refused
par_retry Is the server running on that host and accepting TCP/IP connections?
par_retry [ | psql -h 127.0.0.3 -U nongood -p 2227 -d nongood]
par_retry psql: error: connection to server at "127.0.0.3", port 2227 failed: Connection refused
par_retry Is the server running on that host and accepting TCP/IP connections?
par_sep ### Test --sep -s
par_sep 2 1
par_sep 2 1
par_shebang-Y ### Test of #! -Y with file as input
par_shebang-Y Testing if -Y works
par_shebang-Y Yes it does
@ -88,6 +88,6 @@ par_sql_aliases Yes it works
par_sql_on_cmdline ### Test reading sql on command line
par_sql_on_cmdline Test reading SQL from command line
par_sql_on_cmdline Yes it does
par_tablesize ### Test --table-size --tablesize
par_tablesize 93
par_tablesize 93
par_version ### Test --version -V
par_version 13 74 535
par_version 13 74 535

View file

@ -1,12 +1,11 @@
par_listproc ### Test --listproc
par_listproc SELECT CPU_TIME/100000, SYS.V_$SQL.SQL_TEXT, USERNAME FROM SYS.V_$SQL, SYS.V_$SESSION WHERE SYS.V_$SQL.SQL_ID = SYS.V_$SESSION.SQL_ID(+) AND username IS NOT NULL ORDER BY CPU_TIME DESC
par_listproc *
par_listproc ERROR at line 1:
par_listproc ORA-00942: table or view does not exist
par_listproc
par_listproc CPU_TIME/100000 SQL_TEXT USERNAME
par_listproc --------------- ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- --------------------------------------------------------------------------------------------------------------------------------
par_listproc 1.99999 SELECT CPU_TIME/100000, SYS.V_$SQL.SQL_TEXT, USERNAME FROM SYS.V_$SQL, SYS.V_$SESSION WHERE SYS.V_$SQL.SQL_ID = SYS.V_$SESSION.SQL_ID(+) AND username IS NOT NULL ORDER BY CPU_TIME DESC SYSTEM
par_listproc
par_listproc Id User Host db Command Time State Info
par_listproc XXX sqlunittest localhost sqlunittest Query 0 starting show processlist
par_listproc XXX sqlunittest localhost sqlunittest Query 0 init show processlist
par_multiarg_on_command_line ### Test oracle with multiple arguments on the command line
par_multiarg_on_command_line
par_multiarg_on_command_line 'ARG
@ -36,28 +35,52 @@ par_newline_on_commandline 3
par_newline_on_commandline
par_showdatabases ### Test --show-databases
par_showdatabases
par_showdatabases TABLESPACE_NAME BLOCK_SIZE INITIAL_EXTENT NEXT_EXTENT MIN_EXTENTS MAX_EXTENTS MAX_SIZE PCT_INCREASE MIN_EXTLEN STATUS CONTENTS LOGGING FOR EXTENT_MAN ALLOCATIO SEGMEN DEF_TAB_ RETENTION BIG PREDICA ENC COMPRESS_FOR
par_showdatabases ------------------------------ ---------- -------------- ----------- ----------- ----------- ---------- ------------ ---------- --------- --------- --------- --- ---------- --------- ------ -------- ----------- --- ------- --- ------------
par_showdatabases SYSTEM 8192 65536 1 2147483645 2147483645 65536 ONLINE PERMANENT LOGGING NO LOCAL SYSTEM MANUAL DISABLED NOT APPLY NO HOST NO
par_showdatabases SYSAUX 8192 65536 1 2147483645 2147483645 65536 ONLINE PERMANENT LOGGING NO LOCAL SYSTEM AUTO DISABLED NOT APPLY NO HOST NO
par_showdatabases UNDOTBS1 8192 65536 1 2147483645 2147483645 65536 ONLINE UNDO LOGGING NO LOCAL SYSTEM MANUAL DISABLED NOGUARANTEE NO HOST NO
par_showdatabases TEMP 8192 1048576 1048576 1 2147483645 0 1048576 ONLINE TEMPORARY NOLOGGING NO LOCAL UNIFORM MANUAL DISABLED NOT APPLY NO HOST NO
par_showdatabases USERS 8192 65536 1 2147483645 2147483645 65536 ONLINE PERMANENT LOGGING NO LOCAL SYSTEM AUTO DISABLED NOT APPLY NO HOST NO
par_showdatabases TABLESPACE_NAME BLOCK_SIZE INITIAL_EXTENT NEXT_EXTENT MIN_EXTENTS MAX_EXTENTS MAX_SIZE PCT_INCREASE MIN_EXTLEN STATUS CONTENTS LOGGING FOR EXTENT_MAN ALLOCATIO SEGMEN DEF_TAB_ RETENTION BIG PREDICA ENC COMPRESS_FOR DEF_INME DEF_INME DEF_INMEMORY_DI DEF_INMEMORY_COMP DEF_INMEMORY_ SHARED DEF_INDE INDEX_COMPRES DEF_CELLMEMORY DEF_INMEMORY DEF_INMEMORY_SERVICE_NAME LOST_WR C
par_showdatabases ------------------------------ ---------- -------------- ----------- ----------- ----------- ---------- ------------ ---------- --------- --------------------- --------- --- ---------- --------- ------ -------- ----------- --- ------- --- ------------------------------ -------- -------- --------------- ----------------- ------------- ------------- -------- ------------- ---------------- ------------ ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- ------- -
par_showdatabases SYSTEM 8192 65536 1 2147483645 2147483645 65536 ONLINE PERMANENT LOGGING YES LOCAL SYSTEM MANUAL DISABLED NOT APPLY YES HOST NO DISABLED SHARED DISABLED OFF N
par_showdatabases SYSAUX 8192 65536 1 2147483645 2147483645 65536 ONLINE PERMANENT LOGGING YES LOCAL SYSTEM AUTO DISABLED NOT APPLY YES HOST NO DISABLED SHARED DISABLED OFF N
par_showdatabases UNDOTBS1 8192 65536 1 2147483645 2147483645 65536 ONLINE UNDO LOGGING NO LOCAL SYSTEM MANUAL DISABLED NOGUARANTEE YES HOST NO DISABLED SHARED DISABLED OFF N
par_showdatabases TEMP 8192 1048576 1048576 1 2147483645 0 1048576 ONLINE TEMPORARY NOLOGGING NO LOCAL UNIFORM MANUAL DISABLED NOT APPLY NO HOST NO DISABLED SHARED DISABLED OFF N
par_showdatabases USERS 8192 65536 1 2147483645 2147483645 65536 ONLINE PERMANENT LOGGING NO LOCAL SYSTEM AUTO DISABLED NOT APPLY YES HOST NO DISABLED SHARED DISABLED OFF N
par_showdatabases
par_showtables ### Test --show-tables
par_showtables
par_showtables
par_showtables
par_showtables --------------------------------------------------------------------------------------------------------------------------------
par_showtables 7 rows selected.
par_showtables COUNTRIES
par_showtables DEPARTMENTS
par_showtables EMPLOYEES
par_showtables JOBS
par_showtables JOB_HISTORY
par_showtables LOCATIONS
par_showtables 31 rows selected.
par_showtables AQ$_SCHEDULES
par_showtables HELP
par_showtables MVIEW$_ADV_AJG
par_showtables MVIEW$_ADV_BASETABLE
par_showtables MVIEW$_ADV_CLIQUE
par_showtables MVIEW$_ADV_ELIGIBLE
par_showtables MVIEW$_ADV_EXCEPTIONS
par_showtables MVIEW$_ADV_FILTER
par_showtables MVIEW$_ADV_FILTERINSTANCE
par_showtables MVIEW$_ADV_FJG
par_showtables MVIEW$_ADV_GC
par_showtables MVIEW$_ADV_INFO
par_showtables MVIEW$_ADV_JOURNAL
par_showtables MVIEW$_ADV_LEVEL
par_showtables MVIEW$_ADV_LOG
par_showtables MVIEW$_ADV_OUTPUT
par_showtables MVIEW$_ADV_PARAMETERS
par_showtables MVIEW$_ADV_PLAN
par_showtables MVIEW$_ADV_PRETTY
par_showtables MVIEW$_ADV_ROLLUP
par_showtables MVIEW$_ADV_SQLDEPEND
par_showtables MVIEW$_ADV_TEMP
par_showtables MVIEW$_ADV_WORKLOAD
par_showtables OBJECT_NAME
par_showtables REGIONS
par_showtables OL$
par_showtables OL$HINTS
par_showtables OL$NODES
par_showtables REDO_DB
par_showtables REDO_LOG
par_showtables SCHEDULER_JOB_ARGS_TBL
par_showtables SCHEDULER_PROGRAM_ARGS_TBL
par_showtables SQLPLUS_PRODUCT_PROFILE
par_sql_from_url ### Test reading sql from url command line
par_sql_from_url Test reading SQL from command line
par_sql_from_url Yes it works
@ -100,12 +123,18 @@ par_test_alias_with_statement Query from stdin
par_test_cyclic ### Test cyclic alias .sql/aliases
par_test_cyclic :cyclic3 is a cyclic alias
par_test_dburl_colon ### Test dburl :
par_test_dburl_colon Error:
par_test_dburl_colon : is not defined in ~/.sql/aliases ~/.dburl.aliases /etc/sql/aliases /usr/local/bin/dburl.aliases /usr/local/bin/dburl.aliases.dist
par_test_dburl_colon sql: Error: : is not defined in ~/.sql/aliases ~/.dburl.aliases /etc/sql/aliases /usr/local/bin/dburl.aliases /usr/local/bin/dburl.aliases.dist
par_test_dburl_colon
par_test_dburl_colon sql [-hnr] [--table-size] [--db-size] [-p pass-through] [-s string] dburl [command]
par_test_dburl_colon Usage:
par_test_dburl_colon sql [-hnr] [--table-size] [--db-size] [-p pass-through] [-s string] dburl [sqlcommand]
par_test_dburl_colon sql [-hnr] [--table-size] [--db-size] [-p pass-through] [-s string] dburl < sql_command_file
par_test_dburl_colon
par_test_dburl_colon See 'man sql' for the options
par_test_empty_dburl ### Test empty dburl
par_test_empty_dburl Error:
par_test_empty_dburl is not a valid DBURL
par_test_empty_dburl sql: Error: is not a valid DBURL
par_test_empty_dburl
par_test_empty_dburl sql [-hnr] [--table-size] [--db-size] [-p pass-through] [-s string] dburl [command]
par_test_empty_dburl Usage:
par_test_empty_dburl sql [-hnr] [--table-size] [--db-size] [-p pass-through] [-s string] dburl [sqlcommand]
par_test_empty_dburl sql [-hnr] [--table-size] [--db-size] [-p pass-through] [-s string] dburl < sql_command_file
par_test_empty_dburl
par_test_empty_dburl See 'man sql' for the options