mirror of
https://git.savannah.gnu.org/git/parallel.git
synced 2024-11-22 14:07:55 +00:00
Fixed bug #46520: --basefile cleans up without --cleanup.
qqx() is qx{} with stderr ignored. {= $_ = total_jobs() =} can now be used.
This commit is contained in:
parent
1625b42946
commit
b14ca07563
2
NEWS
2
NEWS
|
@ -12,8 +12,6 @@
|
||||||
|
|
||||||
* GNU Parallel was cited in: A Detailed Characterization of Errors in Logic Circuits due to Single-Event Transients http://ieeexplore.ieee.org/xpl/articleDetails.jsp?tp=&arnumber=7302348&url=http%3A%2F%2Fieeexplore.ieee.org%2Fxpls%2Fabs_all.jsp%3Farnumber%3D7302348
|
* GNU Parallel was cited in: A Detailed Characterization of Errors in Logic Circuits due to Single-Event Transients http://ieeexplore.ieee.org/xpl/articleDetails.jsp?tp=&arnumber=7302348&url=http%3A%2F%2Fieeexplore.ieee.org%2Fxpls%2Fabs_all.jsp%3Farnumber%3D7302348
|
||||||
|
|
||||||
* GNU Parallel was cited in: Exploiting Multiple Levels of Parallelism in Sparse Matrix-Matrix Multiplication http://arxiv.org/pdf/1510.00844.pdf
|
|
||||||
|
|
||||||
* GNU Parallel was cited in: Arabic Speaker Emotion Classification Using Rhythm Metrics and Neural Networks http://www.eurasip.org/Proceedings/Eusipco/Eusipco2015/papers/1570104855.pdf
|
* GNU Parallel was cited in: Arabic Speaker Emotion Classification Using Rhythm Metrics and Neural Networks http://www.eurasip.org/Proceedings/Eusipco/Eusipco2015/papers/1570104855.pdf
|
||||||
|
|
||||||
* GNU Parallel was cited in: Stride Search: a general algorithm for storm detection in high resolution climate data http://www.geosci-model-dev-discuss.net/8/7727/2015/gmdd-8-7727-2015.pdf
|
* GNU Parallel was cited in: Stride Search: a general algorithm for storm detection in high resolution climate data http://www.geosci-model-dev-discuss.net/8/7727/2015/gmdd-8-7727-2015.pdf
|
||||||
|
|
|
@ -4,7 +4,7 @@
|
||||||
|
|
||||||
Check that documentation is updated (compare to web):
|
Check that documentation is updated (compare to web):
|
||||||
|
|
||||||
Fixet for 20151022
|
Fixet for 20151122
|
||||||
git diff last-release-commit
|
git diff last-release-commit
|
||||||
Unmodified beta since last version => production
|
Unmodified beta since last version => production
|
||||||
Unmodified alpha since last version => beta
|
Unmodified alpha since last version => beta
|
||||||
|
@ -212,9 +212,9 @@ cc:Tim Cuthbertson <tim3d.junk@gmail.com>,
|
||||||
Ryoichiro Suzuki <ryoichiro.suzuki@gmail.com>,
|
Ryoichiro Suzuki <ryoichiro.suzuki@gmail.com>,
|
||||||
Jesse Alama <jesse.alama@gmail.com>
|
Jesse Alama <jesse.alama@gmail.com>
|
||||||
|
|
||||||
Subject: GNU Parallel 20151122 ('Kronan/Sharm el-Sheik/Bataclan') released <<[stable]>>
|
Subject: GNU Parallel 20151222 ('') released <<[stable]>>
|
||||||
|
|
||||||
GNU Parallel 20151122 ('Kronan/Sharm el-Sheik/Bataclan') <<[stable]>> has been released. It is available for download at: http://ftp.gnu.org/gnu/parallel/
|
GNU Parallel 20151222 ('') <<[stable]>> has been released. It is available for download at: http://ftp.gnu.org/gnu/parallel/
|
||||||
|
|
||||||
<<No new functionality was introduced so this is a good candidate for a stable release.>>
|
<<No new functionality was introduced so this is a good candidate for a stable release.>>
|
||||||
|
|
||||||
|
@ -236,34 +236,9 @@ http://www.researchgate.net/profile/Christoph_Junghans/publication/276178326_TAD
|
||||||
|
|
||||||
* << Update forventet juni Rachel har lige svaret >> GNU Parallel was used in: SISRS: Site Identification from Short Read Sequences https://github.com/rachelss/SISRS/
|
* << Update forventet juni Rachel har lige svaret >> GNU Parallel was used in: SISRS: Site Identification from Short Read Sequences https://github.com/rachelss/SISRS/
|
||||||
|
|
||||||
* GNU Parallel packaged for CERN CentOS: http://linuxsoft.cern.ch/cern/centos/7/cern/x86_64/repoview/parallel.html
|
* GNU Parallel was cited in: Achieving Consistent Doppler Measurements from SDO/HMI Vector Field Inversions http://arxiv.org/pdf/1511.06500.pdf
|
||||||
|
|
||||||
* GNU Parallel was cited in: The Outer Solar System Origins Survey: I. Design and First-Quarter Discoveries http://arxiv.org/pdf/1511.02895.pdf
|
|
||||||
|
|
||||||
* GNU Parallel was cited in: Contrasting genetic architectures of schizophrenia and other complex diseases using fast variance-components analysis http://www.nature.com/ng/journal/vaop/ncurrent/full/ng.3431.html
|
|
||||||
|
|
||||||
* GNU Parallel was cited in: Named-Entity Chunking for Norwegian Text using Support Vector Machines http://ojs.bibsys.no/index.php/NIK/article/viewFile/248/211
|
|
||||||
|
|
||||||
* GNU Parallel was cited in: Multiscale Estimation of Binding Kinetics Using Brownian Dynamics, Molecular Dynamics and Milestoning http://journals.plos.org/ploscompbiol/article?id=10.1371/journal.pcbi.1004381#pcbi.1004381.ref072
|
|
||||||
|
|
||||||
* GNU Parallel was cited in: A Detailed Characterization of Errors in Logic Circuits due to Single-Event Transients http://ieeexplore.ieee.org/xpl/articleDetails.jsp?tp=&arnumber=7302348&url=http%3A%2F%2Fieeexplore.ieee.org%2Fxpls%2Fabs_all.jsp%3Farnumber%3D7302348
|
|
||||||
|
|
||||||
* GNU Parallel was cited in: Exploiting Multiple Levels of Parallelism in Sparse Matrix-Matrix Multiplication http://arxiv.org/pdf/1510.00844.pdf
|
|
||||||
|
|
||||||
* GNU Parallel was cited in: Arabic Speaker Emotion Classification Using Rhythm Metrics and Neural Networks http://www.eurasip.org/Proceedings/Eusipco/Eusipco2015/papers/1570104855.pdf
|
|
||||||
|
|
||||||
* GNU Parallel was cited in: Stride Search: a general algorithm for storm detection in high resolution climate data http://www.geosci-model-dev-discuss.net/8/7727/2015/gmdd-8-7727-2015.pdf
|
|
||||||
|
|
||||||
* GNU Parallel was cited in: Decomposing Digital Paintings into Layers via RGB-space Geometry http://arxiv.org/pdf/1509.03335.pdf
|
|
||||||
|
|
||||||
* GNU Parallel was cited in: Structure and evolutionary history of a large family of NLR proteins in the zebrafish http://www.biorxiv.org/content/biorxiv/early/2015/09/18/027151.full.pdf
|
|
||||||
|
|
||||||
* Automating large numbers of tasks https://rcc.uchicago.edu/docs/tutorials/kicp-tutorials/running-jobs.html
|
|
||||||
|
|
||||||
* Max out your IOPs with GNU Parallel http://blog.bitratchet.com/2015/11/11/max-out-your-iops-with-gnu-parallel/
|
|
||||||
|
|
||||||
* GNU Parallel was cited in: Evolution of movement strategies under competitive interactions http://digital.csic.es/bitstream/10261/115973/1/evolution_movement_strategies_Kiziridis.pdf
|
|
||||||
|
|
||||||
|
* 使用 GNU parallel 來平行運算http://mutolisp.logdown.com/posts/316959-using-gnu-parallel-to-parallel-computing
|
||||||
|
|
||||||
* Bug fixes and man page updates.
|
* Bug fixes and man page updates.
|
||||||
|
|
||||||
|
|
115
src/parallel
115
src/parallel
|
@ -1118,7 +1118,7 @@ sub check_invalid_option_combinations {
|
||||||
|
|
||||||
sub init_globals {
|
sub init_globals {
|
||||||
# Defaults:
|
# Defaults:
|
||||||
$Global::version = 20151122;
|
$Global::version = 20151123;
|
||||||
$Global::progname = 'parallel';
|
$Global::progname = 'parallel';
|
||||||
$Global::infinity = 2**31;
|
$Global::infinity = 2**31;
|
||||||
$Global::debug = 0;
|
$Global::debug = 0;
|
||||||
|
@ -1150,7 +1150,7 @@ sub init_globals {
|
||||||
'{/..}' => 's:.*/::; s:\.[^/.]+$::; s:\.[^/.]+$::',
|
'{/..}' => 's:.*/::; s:\.[^/.]+$::; s:\.[^/.]+$::',
|
||||||
'{/...}' => 's:.*/::; s:\.[^/.]+$::; s:\.[^/.]+$::; s:\.[^/.]+$::',
|
'{/...}' => 's:.*/::; s:\.[^/.]+$::; s:\.[^/.]+$::; s:\.[^/.]+$::',
|
||||||
# {##} = number of jobs
|
# {##} = number of jobs
|
||||||
'{##}' => '$_=$Global::JobQueue->total_jobs()',
|
'{##}' => '$_=total_jobs()',
|
||||||
);
|
);
|
||||||
# Modifiable copy of %Global::replace
|
# Modifiable copy of %Global::replace
|
||||||
%Global::rpl = %Global::replace;
|
%Global::rpl = %Global::replace;
|
||||||
|
@ -1682,7 +1682,7 @@ sub cleanup {
|
||||||
# Returns: N/A
|
# Returns: N/A
|
||||||
unlink keys %Global::unlink;
|
unlink keys %Global::unlink;
|
||||||
map { rmdir $_ } keys %Global::unlink;
|
map { rmdir $_ } keys %Global::unlink;
|
||||||
if(@opt::basefile) { cleanup_basefile(); }
|
if(@opt::basefile and $opt::cleanup) { cleanup_basefile(); }
|
||||||
}
|
}
|
||||||
|
|
||||||
sub __QUOTING_ARGUMENTS_FOR_SHELL__ {}
|
sub __QUOTING_ARGUMENTS_FOR_SHELL__ {}
|
||||||
|
@ -2508,7 +2508,7 @@ sub progress {
|
||||||
$last_column_time = time;
|
$last_column_time = time;
|
||||||
$columns = $ENV{'COLUMNS'};
|
$columns = $ENV{'COLUMNS'};
|
||||||
if(not $columns) {
|
if(not $columns) {
|
||||||
my $stty = qx{ stty -a </dev/tty };
|
my $stty = ::qqx("stty -a </dev/tty");
|
||||||
# FreeBSD/OpenBSD/NetBSD/Dragonfly/MirOS
|
# FreeBSD/OpenBSD/NetBSD/Dragonfly/MirOS
|
||||||
# MacOSX/IRIX/AIX/Tru64
|
# MacOSX/IRIX/AIX/Tru64
|
||||||
$stty =~ /(\d+) columns/ and do { $columns = $1; };
|
$stty =~ /(\d+) columns/ and do { $columns = $1; };
|
||||||
|
@ -2520,7 +2520,7 @@ sub progress {
|
||||||
$stty =~ /rows=\d+,(\d+)/ and do { $columns = $1; };
|
$stty =~ /rows=\d+,(\d+)/ and do { $columns = $1; };
|
||||||
}
|
}
|
||||||
if(not $columns) {
|
if(not $columns) {
|
||||||
my $resize = qx{ sh -c 'resize 2>/dev/null' };
|
my $resize = ::qqx("resize");
|
||||||
$resize =~ /COLUMNS=(\d+);/ and do { $columns = $1; };
|
$resize =~ /COLUMNS=(\d+);/ and do { $columns = $1; };
|
||||||
}
|
}
|
||||||
$columns ||= 80;
|
$columns ||= 80;
|
||||||
|
@ -3116,7 +3116,7 @@ sub onall {
|
||||||
close $parallel_fh;
|
close $parallel_fh;
|
||||||
$Global::exitstatus = $? >> 8;
|
$Global::exitstatus = $? >> 8;
|
||||||
debug("init", "--onall exitvalue ", $?);
|
debug("init", "--onall exitvalue ", $?);
|
||||||
if(@opt::basefile) { cleanup_basefile(); }
|
if(@opt::basefile and $opt::cleanup) { cleanup_basefile(); }
|
||||||
$Global::debug or unlink(@argfiles);
|
$Global::debug or unlink(@argfiles);
|
||||||
my %seen;
|
my %seen;
|
||||||
for my $joblog (@joblogs) {
|
for my $joblog (@joblogs) {
|
||||||
|
@ -3150,11 +3150,11 @@ sub save_original_signal_handler {
|
||||||
# %Global::original_sig
|
# %Global::original_sig
|
||||||
# Returns: N/A
|
# Returns: N/A
|
||||||
$SIG{INT} = sub {
|
$SIG{INT} = sub {
|
||||||
if($opt::tmux) { qx { tmux kill-session -t p$$ }; }
|
if($opt::tmux) { ::qqx("tmux kill-session -t p$$"); }
|
||||||
wait_and_exit(255);
|
wait_and_exit(255);
|
||||||
};
|
};
|
||||||
$SIG{TERM} = sub {
|
$SIG{TERM} = sub {
|
||||||
if($opt::tmux) { qx { tmux kill-session -t p$$ }; }
|
if($opt::tmux) { ::qqx("tmux kill-session -t p$$"); }
|
||||||
wait_and_exit(255);
|
wait_and_exit(255);
|
||||||
};
|
};
|
||||||
%Global::original_sig = %SIG;
|
%Global::original_sig = %SIG;
|
||||||
|
@ -3399,7 +3399,7 @@ sub usage {
|
||||||
" O. Tange (2011): GNU Parallel - The Command-Line Power Tool,",
|
" O. Tange (2011): GNU Parallel - The Command-Line Power Tool,",
|
||||||
" ;login: The USENIX Magazine, February 2011:42-47.",
|
" ;login: The USENIX Magazine, February 2011:42-47.",
|
||||||
"",
|
"",
|
||||||
"This helps funding further development; and it won't cost you a cent.",
|
"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.\n",
|
"If you pay 10000 EUR you should feel free to use GNU Parallel without citing.\n",
|
||||||
"");
|
"");
|
||||||
}
|
}
|
||||||
|
@ -3427,7 +3427,7 @@ sub citation_notice {
|
||||||
" O. Tange (2011): GNU Parallel - The Command-Line Power Tool,\n",
|
" O. Tange (2011): GNU Parallel - The Command-Line Power Tool,\n",
|
||||||
" ;login: The USENIX Magazine, February 2011:42-47.\n",
|
" ;login: The USENIX Magazine, February 2011:42-47.\n",
|
||||||
"\n",
|
"\n",
|
||||||
"This helps funding further development; and it won't cost you a cent.\n",
|
"This helps funding further development; AND IT WON'T COST YOU A CENT.\n",
|
||||||
"If you pay 10000 EUR you should feel free to use GNU Parallel without citing.\n",
|
"If you pay 10000 EUR you should feel free to use GNU Parallel without citing.\n",
|
||||||
"\n",
|
"\n",
|
||||||
"To silence the citation notice: run 'parallel --bibtex'.\n\n",
|
"To silence the citation notice: run 'parallel --bibtex'.\n\n",
|
||||||
|
@ -3507,7 +3507,7 @@ sub bibtex {
|
||||||
"",
|
"",
|
||||||
"(Feel free to use \\nocite{Tange2011a})",
|
"(Feel free to use \\nocite{Tange2011a})",
|
||||||
"",
|
"",
|
||||||
"This helps funding further development; and it won't cost you a cent.",
|
"This helps funding further development; AND IT WON'T COST YOU A CENT.",
|
||||||
"If you pay 10000 EUR you should feel free to use GNU Parallel without citing.",
|
"If you pay 10000 EUR you should feel free to use GNU Parallel without citing.",
|
||||||
"",
|
"",
|
||||||
"If you send a copy of your published article to tange\@gnu.org, it will be",
|
"If you send a copy of your published article to tange\@gnu.org, it will be",
|
||||||
|
@ -3600,6 +3600,19 @@ sub tmpfifo {
|
||||||
return $tmpfifo;
|
return $tmpfifo;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
sub qqx {
|
||||||
|
# Like qx but with clean environment (except for $PATH)
|
||||||
|
# and STDERR ignored
|
||||||
|
# This is needed if the environment contains functions
|
||||||
|
# that /bin/sh does not understand
|
||||||
|
my $devnull = $Global::debug ? "" : "exec 2>/dev/null;";
|
||||||
|
return qx{ $devnull @_ };
|
||||||
|
my $PATH = $ENV{'PATH'};
|
||||||
|
local(%ENV);
|
||||||
|
$ENV{'PATH'} = $PATH;
|
||||||
|
return qx{ ( @_ ) 2>/dev/null };
|
||||||
|
}
|
||||||
|
|
||||||
sub uniq {
|
sub uniq {
|
||||||
# Remove duplicates and return unique values
|
# Remove duplicates and return unique values
|
||||||
return keys %{{ map { $_ => 1 } @_ }};
|
return keys %{{ map { $_ => 1 } @_ }};
|
||||||
|
@ -4247,8 +4260,8 @@ sub memfree_recompute {
|
||||||
my $script = memfreescript();
|
my $script = memfreescript();
|
||||||
|
|
||||||
# TODO add sshlogin and backgrounding
|
# TODO add sshlogin and backgrounding
|
||||||
# Run it twice if it gives 0
|
# Run the script twice if it gives 0 (typically intermittent error)
|
||||||
$self->{'memfree'} = qx{ $script } || qx{ $script };
|
$self->{'memfree'} = ::qqx($script) || ::qqx($script);
|
||||||
if(not $self->{'memfree'}) {
|
if(not $self->{'memfree'}) {
|
||||||
::die_bug("Less than 1 byte free");
|
::die_bug("Less than 1 byte free");
|
||||||
}
|
}
|
||||||
|
@ -4366,7 +4379,7 @@ sub swap_activity {
|
||||||
my $file = $self->{'swap_activity_file'};
|
my $file = $self->{'swap_activity_file'};
|
||||||
my ($dummy_fh, $tmpfile) = ::tmpfile(SUFFIX => ".swp");
|
my ($dummy_fh, $tmpfile) = ::tmpfile(SUFFIX => ".swp");
|
||||||
::debug("swap", "\n", $swap_activity, "\n");
|
::debug("swap", "\n", $swap_activity, "\n");
|
||||||
qx{ ($swap_activity > $tmpfile && mv $tmpfile $file || rm $tmpfile) & };
|
::qqx("($swap_activity > $tmpfile && mv $tmpfile $file || rm $tmpfile) &");
|
||||||
}
|
}
|
||||||
return $self->{'swap_activity'};
|
return $self->{'swap_activity'};
|
||||||
}
|
}
|
||||||
|
@ -4664,7 +4677,7 @@ sub loadavg {
|
||||||
::debug("load", "Cmd: ", $cmd);
|
::debug("load", "Cmd: ", $cmd);
|
||||||
my $file = $self->{'loadavg_file'};
|
my $file = $self->{'loadavg_file'};
|
||||||
my ($dummy_fh, $tmpfile) = ::tmpfile(SUFFIX => ".loa");
|
my ($dummy_fh, $tmpfile) = ::tmpfile(SUFFIX => ".loa");
|
||||||
qx{ ($cmd > $tmpfile && mv $tmpfile $file || rm $tmpfile) & };
|
::qqx(" ($cmd > $tmpfile && mv $tmpfile $file || rm $tmpfile) & ");
|
||||||
}
|
}
|
||||||
return $self->{'loadavg'};
|
return $self->{'loadavg'};
|
||||||
}
|
}
|
||||||
|
@ -5096,10 +5109,10 @@ sub ncpus {
|
||||||
my $ncpu;
|
my $ncpu;
|
||||||
my $sqe = ::shell_quote_scalar($Global::envvar);
|
my $sqe = ::shell_quote_scalar($Global::envvar);
|
||||||
if($opt::use_cpus_instead_of_cores) {
|
if($opt::use_cpus_instead_of_cores) {
|
||||||
$ncpu = qx(echo|$sshcmd $serverlogin -- $sqe parallel --number-of-cpus);
|
$ncpu = ::qqx("echo|$sshcmd $serverlogin -- $sqe parallel --number-of-cpus");
|
||||||
} else {
|
} else {
|
||||||
::debug("init",qq(echo|$sshcmd $serverlogin -- $sqe parallel --number-of-cores\n));
|
::debug("init",qq(echo|$sshcmd $serverlogin -- $sqe parallel --number-of-cores\n));
|
||||||
$ncpu = qx(echo|$sshcmd $serverlogin -- $sqe parallel --number-of-cores);
|
$ncpu = ::qqx("echo|$sshcmd $serverlogin -- $sqe parallel --number-of-cores");
|
||||||
}
|
}
|
||||||
chomp $ncpu;
|
chomp $ncpu;
|
||||||
if($ncpu =~ /^\s*[0-9]+\s*$/s) {
|
if($ncpu =~ /^\s*[0-9]+\s*$/s) {
|
||||||
|
@ -5232,7 +5245,7 @@ sub no_of_cores {
|
||||||
sub nproc {
|
sub nproc {
|
||||||
# Returns:
|
# Returns:
|
||||||
# Number of cores using `nproc`
|
# Number of cores using `nproc`
|
||||||
my $no_of_cores = qx{ sh -c 'nproc 2>/dev/null' };
|
my $no_of_cores = ::qqx("nproc");
|
||||||
return $no_of_cores;
|
return $no_of_cores;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -5308,9 +5321,9 @@ sub no_of_cpus_freebsd {
|
||||||
# Number of physical CPUs on FreeBSD
|
# Number of physical CPUs on FreeBSD
|
||||||
# undef if not FreeBSD
|
# undef if not FreeBSD
|
||||||
my $no_of_cpus =
|
my $no_of_cpus =
|
||||||
(qx{ sh -c 'sysctl -a dev.cpu 2>/dev/null' | grep \%parent | awk '{ print \$2 }' | uniq | wc -l | awk '{ print \$1 }' }
|
(::qqx(qq{ sysctl -a dev.cpu | grep \%parent | awk '{ print \$2 }' | uniq | wc -l | awk '{ print \$1 }' })
|
||||||
or
|
or
|
||||||
qx{ sh -c 'sysctl hw.ncpu 2>/dev/null' | awk '{ print \$2 }' });
|
::qqx(qq{ sysctl hw.ncpu | awk '{ print \$2 }' }));
|
||||||
chomp $no_of_cpus;
|
chomp $no_of_cpus;
|
||||||
return $no_of_cpus;
|
return $no_of_cpus;
|
||||||
}
|
}
|
||||||
|
@ -5320,9 +5333,9 @@ sub no_of_cores_freebsd {
|
||||||
# Number of CPU cores on FreeBSD
|
# Number of CPU cores on FreeBSD
|
||||||
# undef if not FreeBSD
|
# undef if not FreeBSD
|
||||||
my $no_of_cores =
|
my $no_of_cores =
|
||||||
(qx{ sh -c 'sysctl hw.ncpu 2>/dev/null' | awk '{ print \$2 }' }
|
(::qqx(qq{ sysctl hw.ncpu | awk '{ print \$2 }' })
|
||||||
or
|
or
|
||||||
qx{ sh -c 'sysctl -a hw 2>/dev/null' | grep [^a-z]logicalcpu[^a-z] | awk '{ print \$2 }' });
|
::qqx(qq{ sysctl -a dev.cpu | grep \%parent | awk '{ print \$2 }' | uniq | wc -l | awk '{ print \$1 }' }));
|
||||||
chomp $no_of_cores;
|
chomp $no_of_cores;
|
||||||
return $no_of_cores;
|
return $no_of_cores;
|
||||||
}
|
}
|
||||||
|
@ -5331,7 +5344,7 @@ sub no_of_cpus_netbsd {
|
||||||
# Returns:
|
# Returns:
|
||||||
# Number of physical CPUs on NetBSD
|
# Number of physical CPUs on NetBSD
|
||||||
# undef if not NetBSD
|
# undef if not NetBSD
|
||||||
my $no_of_cpus = qx{ sh -c 'sysctl -n hw.ncpu 2>/dev/null' };
|
my $no_of_cpus = ::qqx("sysctl -n hw.ncpu");
|
||||||
chomp $no_of_cpus;
|
chomp $no_of_cpus;
|
||||||
return $no_of_cpus;
|
return $no_of_cpus;
|
||||||
}
|
}
|
||||||
|
@ -5340,7 +5353,7 @@ sub no_of_cores_netbsd {
|
||||||
# Returns:
|
# Returns:
|
||||||
# Number of CPU cores on NetBSD
|
# Number of CPU cores on NetBSD
|
||||||
# undef if not NetBSD
|
# undef if not NetBSD
|
||||||
my $no_of_cores = qx{ sh -c 'sysctl -n hw.ncpu 2>/dev/null' };
|
my $no_of_cores = ::qqx("sysctl -n hw.ncpu");
|
||||||
chomp $no_of_cores;
|
chomp $no_of_cores;
|
||||||
return $no_of_cores;
|
return $no_of_cores;
|
||||||
}
|
}
|
||||||
|
@ -5349,7 +5362,7 @@ sub no_of_cpus_openbsd {
|
||||||
# Returns:
|
# Returns:
|
||||||
# Number of physical CPUs on OpenBSD
|
# Number of physical CPUs on OpenBSD
|
||||||
# undef if not OpenBSD
|
# undef if not OpenBSD
|
||||||
my $no_of_cpus = qx{ sh -c 'sysctl -n hw.ncpu 2>/dev/null' };
|
my $no_of_cpus = ::qqx('sysctl -n hw.ncpu');
|
||||||
chomp $no_of_cpus;
|
chomp $no_of_cpus;
|
||||||
return $no_of_cpus;
|
return $no_of_cpus;
|
||||||
}
|
}
|
||||||
|
@ -5358,7 +5371,7 @@ sub no_of_cores_openbsd {
|
||||||
# Returns:
|
# Returns:
|
||||||
# Number of CPU cores on OpenBSD
|
# Number of CPU cores on OpenBSD
|
||||||
# undef if not OpenBSD
|
# undef if not OpenBSD
|
||||||
my $no_of_cores = qx{ sh -c 'sysctl -n hw.ncpu 2>/dev/null' };
|
my $no_of_cores = ::qqx('sysctl -n hw.ncpu');
|
||||||
chomp $no_of_cores;
|
chomp $no_of_cores;
|
||||||
return $no_of_cores;
|
return $no_of_cores;
|
||||||
}
|
}
|
||||||
|
@ -5367,7 +5380,7 @@ sub no_of_cpus_hurd {
|
||||||
# Returns:
|
# Returns:
|
||||||
# Number of physical CPUs on HURD
|
# Number of physical CPUs on HURD
|
||||||
# undef if not HURD
|
# undef if not HURD
|
||||||
my $no_of_cpus = qx{ nproc };
|
my $no_of_cpus = ::qqx("nproc");
|
||||||
chomp $no_of_cpus;
|
chomp $no_of_cpus;
|
||||||
return $no_of_cpus;
|
return $no_of_cpus;
|
||||||
}
|
}
|
||||||
|
@ -5376,19 +5389,19 @@ sub no_of_cores_hurd {
|
||||||
# Returns:
|
# Returns:
|
||||||
# Number of physical CPUs on HURD
|
# Number of physical CPUs on HURD
|
||||||
# undef if not HURD
|
# undef if not HURD
|
||||||
my $no_of_cores = `nproc`;
|
my $no_of_cores = ::qqx("nproc");
|
||||||
chomp $no_of_cores;
|
chomp $no_of_cores;
|
||||||
return $no_of_cores;
|
return $no_of_cores;
|
||||||
}
|
}
|
||||||
|
|
||||||
sub no_of_cpus_darwin {
|
sub no_of_cpus_darwin {
|
||||||
# Returns:
|
# Returns:
|
||||||
# Number of physical CPUs on Mac Darwin
|
# Number of physical CPUs on MacOSX Darwin
|
||||||
# undef if not Mac Darwin
|
# undef if not MacOSX Darwin
|
||||||
my $no_of_cpus =
|
my $no_of_cpus =
|
||||||
(qx{ sh -c 'sysctl -n hw.physicalcpu 2>/dev/null' }
|
(::qqx('sysctl -n hw.physicalcpu')
|
||||||
or
|
or
|
||||||
qx{ sh -c 'sysctl -a hw 2>/dev/null' | grep [^a-z]physicalcpu[^a-z] | awk '{ print \$2 }' });
|
::qqx(qq{ sysctl -a hw | grep [^a-z]physicalcpu[^a-z] | awk '{ print \$2 }' }));
|
||||||
return $no_of_cpus;
|
return $no_of_cpus;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -5397,9 +5410,9 @@ sub no_of_cores_darwin {
|
||||||
# Number of CPU cores on Mac Darwin
|
# Number of CPU cores on Mac Darwin
|
||||||
# undef if not Mac Darwin
|
# undef if not Mac Darwin
|
||||||
my $no_of_cores =
|
my $no_of_cores =
|
||||||
(qx{ sh -c 'sysctl -n hw.logicalcpu 2>/dev/null' }
|
(::qqx('sysctl -n hw.logicalcpu')
|
||||||
or
|
or
|
||||||
qx{ sh -c 'sysctl -a hw 2>/dev/null' | grep [^a-z]logicalcpu[^a-z] | awk '{ print \$2 }' });
|
::qqx(qq{ sysctl -a hw | grep [^a-z]logicalcpu[^a-z] | awk '{ print \$2 }' }));
|
||||||
return $no_of_cores;
|
return $no_of_cores;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -5408,13 +5421,13 @@ sub no_of_cpus_solaris {
|
||||||
# Number of physical CPUs on Solaris
|
# Number of physical CPUs on Solaris
|
||||||
# undef if not Solaris
|
# undef if not Solaris
|
||||||
if(-x "/usr/sbin/psrinfo") {
|
if(-x "/usr/sbin/psrinfo") {
|
||||||
my @psrinfo = `/usr/sbin/psrinfo`;
|
my @psrinfo = ::qqx("/usr/sbin/psrinfo");
|
||||||
if($#psrinfo >= 0) {
|
if($#psrinfo >= 0) {
|
||||||
return $#psrinfo +1;
|
return $#psrinfo +1;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if(-x "/usr/sbin/prtconf") {
|
if(-x "/usr/sbin/prtconf") {
|
||||||
my @prtconf = qx{ /usr/sbin/prtconf | grep cpu..instance };
|
my @prtconf = ::qqx("/usr/sbin/prtconf | grep cpu..instance");
|
||||||
if($#prtconf >= 0) {
|
if($#prtconf >= 0) {
|
||||||
return $#prtconf +1;
|
return $#prtconf +1;
|
||||||
}
|
}
|
||||||
|
@ -5427,13 +5440,13 @@ sub no_of_cores_solaris {
|
||||||
# Number of CPU cores on Solaris
|
# Number of CPU cores on Solaris
|
||||||
# undef if not Solaris
|
# undef if not Solaris
|
||||||
if(-x "/usr/sbin/psrinfo") {
|
if(-x "/usr/sbin/psrinfo") {
|
||||||
my @psrinfo = `/usr/sbin/psrinfo`;
|
my @psrinfo = ::qqx("/usr/sbin/psrinfo");
|
||||||
if($#psrinfo >= 0) {
|
if($#psrinfo >= 0) {
|
||||||
return $#psrinfo +1;
|
return $#psrinfo +1;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if(-x "/usr/sbin/prtconf") {
|
if(-x "/usr/sbin/prtconf") {
|
||||||
my @prtconf = qx{ /usr/sbin/prtconf | grep cpu..instance };
|
my @prtconf = ::qqx("/usr/sbin/prtconf | grep cpu..instance");
|
||||||
if($#prtconf >= 0) {
|
if($#prtconf >= 0) {
|
||||||
return $#prtconf +1;
|
return $#prtconf +1;
|
||||||
}
|
}
|
||||||
|
@ -5476,7 +5489,7 @@ sub no_of_cpus_hpux {
|
||||||
# Number of physical CPUs on HP-UX
|
# Number of physical CPUs on HP-UX
|
||||||
# undef if not HP-UX
|
# undef if not HP-UX
|
||||||
my $no_of_cpus =
|
my $no_of_cpus =
|
||||||
qx{ sh -c '/usr/bin/mpsched -s 2>&1' | grep 'Locality Domain Count' | awk '{ print \$4 }'};
|
::qqx(qq{ /usr/bin/mpsched -s 2>&1 | grep 'Locality Domain Count' | awk '{ print \$4 }'});
|
||||||
return $no_of_cpus;
|
return $no_of_cpus;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -5485,7 +5498,7 @@ sub no_of_cores_hpux {
|
||||||
# Number of CPU cores on HP-UX
|
# Number of CPU cores on HP-UX
|
||||||
# undef if not HP-UX
|
# undef if not HP-UX
|
||||||
my $no_of_cores =
|
my $no_of_cores =
|
||||||
qx{ sh -c '/usr/bin/mpsched -s 2>&1' | perl -ne '/Processor Count\\D+(\\d+)/ and print "\$1\n"'};
|
::qqx(qq{ /usr/bin/mpsched -s 2>&1 | perl -ne '/Processor Count\\D+(\\d+)/ and print "\$1\n"'});
|
||||||
return $no_of_cores;
|
return $no_of_cores;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -5513,7 +5526,7 @@ sub no_of_cpus_openserver {
|
||||||
# undef if not SCO OpenServer
|
# undef if not SCO OpenServer
|
||||||
my $no_of_cpus = 0;
|
my $no_of_cpus = 0;
|
||||||
if(-x "/usr/sbin/psrinfo") {
|
if(-x "/usr/sbin/psrinfo") {
|
||||||
my @psrinfo = `/usr/sbin/psrinfo`;
|
my @psrinfo = ::qqx("/usr/sbin/psrinfo");
|
||||||
if($#psrinfo >= 0) {
|
if($#psrinfo >= 0) {
|
||||||
return $#psrinfo +1;
|
return $#psrinfo +1;
|
||||||
}
|
}
|
||||||
|
@ -5527,7 +5540,7 @@ sub no_of_cores_openserver {
|
||||||
# undef if not SCO OpenServer
|
# undef if not SCO OpenServer
|
||||||
my $no_of_cores = 0;
|
my $no_of_cores = 0;
|
||||||
if(-x "/usr/sbin/psrinfo") {
|
if(-x "/usr/sbin/psrinfo") {
|
||||||
my @psrinfo = `/usr/sbin/psrinfo`;
|
my @psrinfo = ::qqx("/usr/sbin/psrinfo");
|
||||||
if($#psrinfo >= 0) {
|
if($#psrinfo >= 0) {
|
||||||
return $#psrinfo +1;
|
return $#psrinfo +1;
|
||||||
}
|
}
|
||||||
|
@ -5539,7 +5552,7 @@ sub no_of_cpus_irix {
|
||||||
# Returns:
|
# Returns:
|
||||||
# Number of physical CPUs on IRIX
|
# Number of physical CPUs on IRIX
|
||||||
# undef if not IRIX
|
# undef if not IRIX
|
||||||
my $no_of_cpus = `hinv | grep HZ | grep Processor | awk '{print \$1}'`;
|
my $no_of_cpus = ::qqx(qq{ hinv | grep HZ | grep Processor | awk '{print \$1}' });
|
||||||
return $no_of_cpus;
|
return $no_of_cpus;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -5547,7 +5560,7 @@ sub no_of_cores_irix {
|
||||||
# Returns:
|
# Returns:
|
||||||
# Number of CPU cores on IRIX
|
# Number of CPU cores on IRIX
|
||||||
# undef if not IRIX
|
# undef if not IRIX
|
||||||
my $no_of_cores = `hinv | grep HZ | grep Processor | awk '{print \$1}'`;
|
my $no_of_cores = ::qqx(qq{ hinv | grep HZ | grep Processor | awk '{print \$1}' });
|
||||||
return $no_of_cores;
|
return $no_of_cores;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -5555,7 +5568,7 @@ sub no_of_cpus_tru64 {
|
||||||
# Returns:
|
# Returns:
|
||||||
# Number of physical CPUs on Tru64
|
# Number of physical CPUs on Tru64
|
||||||
# undef if not Tru64
|
# undef if not Tru64
|
||||||
my $no_of_cpus = `sizer -pr`;
|
my $no_of_cpus = ::qqx("sizer -pr");
|
||||||
return $no_of_cpus;
|
return $no_of_cpus;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -5563,7 +5576,7 @@ sub no_of_cores_tru64 {
|
||||||
# Returns:
|
# Returns:
|
||||||
# Number of CPU cores on Tru64
|
# Number of CPU cores on Tru64
|
||||||
# undef if not Tru64
|
# undef if not Tru64
|
||||||
my $no_of_cores = `sizer -pr`;
|
my $no_of_cores = ::qqx("sizer -pr");
|
||||||
return $no_of_cores;
|
return $no_of_cores;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -8777,9 +8790,9 @@ sub tmux_length {
|
||||||
my @out;
|
my @out;
|
||||||
for my $l (1, 2020, 16320, 100000, $len) {
|
for my $l (1, 2020, 16320, 100000, $len) {
|
||||||
my $tmpfile = ::tmpname("tms");
|
my $tmpfile = ::tmpname("tms");
|
||||||
my $tmuxcmd = "sh -c '".$ENV{'TMUX'}." -S $tmpfile new-session -d -n echo $l".
|
my $tmuxcmd = $ENV{'TMUX'}." -S $tmpfile new-session -d -n echo $l".
|
||||||
("x"x$l). " 2>/dev/null' && echo $l; rm -f $tmpfile";
|
("x"x$l). " && echo $l; rm -f $tmpfile";
|
||||||
push @out, qx{ $tmuxcmd };
|
push @out, ::qqx($tmuxcmd);
|
||||||
unlink $tmpfile;
|
unlink $tmpfile;
|
||||||
}
|
}
|
||||||
::debug("tmux","tmux-length ",@out);
|
::debug("tmux","tmux-length ",@out);
|
||||||
|
@ -9191,6 +9204,10 @@ sub Q {
|
||||||
return $a;
|
return $a;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
sub total_jobs {
|
||||||
|
return $Global::JobQueue->total_jobs()
|
||||||
|
}
|
||||||
|
|
||||||
{
|
{
|
||||||
my %perleval;
|
my %perleval;
|
||||||
|
|
||||||
|
|
|
@ -426,7 +426,7 @@ string that is not in the command line.
|
||||||
See also: B<:::>.
|
See also: B<:::>.
|
||||||
|
|
||||||
|
|
||||||
=item B<--bar> (beta testing)
|
=item B<--bar>
|
||||||
|
|
||||||
Show progress as a progress bar. In the bar is shown: % of jobs
|
Show progress as a progress bar. In the bar is shown: % of jobs
|
||||||
completed, estimated seconds left, and number of jobs started.
|
completed, estimated seconds left, and number of jobs started.
|
||||||
|
@ -513,7 +513,7 @@ I<size> defaults to 1M.
|
||||||
See B<--pipe> and B<--pipepart> for use of this.
|
See B<--pipe> and B<--pipepart> for use of this.
|
||||||
|
|
||||||
|
|
||||||
=item B<--cat> (beta testing)
|
=item B<--cat>
|
||||||
|
|
||||||
Create a temporary file with content. Normally B<--pipe>/B<--pipepart>
|
Create a temporary file with content. Normally B<--pipe>/B<--pipepart>
|
||||||
will give data to the program on stdin (standard input). With B<--cat>
|
will give data to the program on stdin (standard input). With B<--cat>
|
||||||
|
@ -613,7 +613,7 @@ I<secs> seconds after starting each job. I<secs> can be less than 1
|
||||||
second.
|
second.
|
||||||
|
|
||||||
|
|
||||||
=item B<--dry-run> (beta testing)
|
=item B<--dry-run>
|
||||||
|
|
||||||
Print the job to run on stdout (standard output), but do not run the
|
Print the job to run on stdout (standard output), but do not run the
|
||||||
job. Use B<-v -v> to include the wrapping that GNU Parallel generates
|
job. Use B<-v -v> to include the wrapping that GNU Parallel generates
|
||||||
|
@ -672,7 +672,7 @@ and functions) use env_parallel as described under the option I<command>.
|
||||||
See also: B<--record-env>.
|
See also: B<--record-env>.
|
||||||
|
|
||||||
|
|
||||||
=item B<--eta> (beta testing)
|
=item B<--eta>
|
||||||
|
|
||||||
Show the estimated number of seconds before finishing. This forces GNU
|
Show the estimated number of seconds before finishing. This forces GNU
|
||||||
B<parallel> to read all jobs before starting to find the number of
|
B<parallel> to read all jobs before starting to find the number of
|
||||||
|
@ -693,7 +693,7 @@ Implies B<--semaphore>.
|
||||||
See also B<--bg>, B<man sem>.
|
See also B<--bg>, B<man sem>.
|
||||||
|
|
||||||
|
|
||||||
=item B<--fifo> (beta testing)
|
=item B<--fifo>
|
||||||
|
|
||||||
Create a temporary fifo with content. Normally B<--pipe> and
|
Create a temporary fifo with content. Normally B<--pipe> and
|
||||||
B<--pipepart> will give data to the program on stdin (standard
|
B<--pipepart> will give data to the program on stdin (standard
|
||||||
|
@ -725,7 +725,7 @@ over B<--tollef>. The B<--tollef> option is now retired, and therefore
|
||||||
may not be used. B<--gnu> is kept for compatibility.
|
may not be used. B<--gnu> is kept for compatibility.
|
||||||
|
|
||||||
|
|
||||||
=item B<--group> (beta testing)
|
=item B<--group>
|
||||||
|
|
||||||
Group output. Output from each jobs is grouped together and is only
|
Group output. Output from each jobs is grouped together and is only
|
||||||
printed when the command is finished. stderr (standard error) first
|
printed when the command is finished. stderr (standard error) first
|
||||||
|
@ -747,9 +747,9 @@ See also: B<--line-buffer> B<--ungroup>
|
||||||
Print a summary of the options to GNU B<parallel> and exit.
|
Print a summary of the options to GNU B<parallel> and exit.
|
||||||
|
|
||||||
|
|
||||||
=item B<--halt-on-error> I<val> (beta testing)
|
=item B<--halt-on-error> I<val>
|
||||||
|
|
||||||
=item B<--halt> I<val> (beta testing)
|
=item B<--halt> I<val>
|
||||||
|
|
||||||
When should GNU B<parallel> terminate? In some situations it makes no
|
When should GNU B<parallel> terminate? In some situations it makes no
|
||||||
sense to run all jobs. GNU B<parallel> should simply give up as soon
|
sense to run all jobs. GNU B<parallel> should simply give up as soon
|
||||||
|
@ -1172,7 +1172,7 @@ performance is important use B<--pipepart>.
|
||||||
See also: B<--recstart>, B<--recend>, B<--fifo>, B<--cat>, B<--pipepart>.
|
See also: B<--recstart>, B<--recend>, B<--fifo>, B<--cat>, B<--pipepart>.
|
||||||
|
|
||||||
|
|
||||||
=item B<--pipepart> (beta testing)
|
=item B<--pipepart>
|
||||||
|
|
||||||
Pipe parts of a physical file. B<--pipepart> works similar to
|
Pipe parts of a physical file. B<--pipepart> works similar to
|
||||||
B<--pipe>, but is much faster. It has a few limitations:
|
B<--pipe>, but is much faster. It has a few limitations:
|
||||||
|
@ -1198,7 +1198,7 @@ control on the command line (used by GNU B<parallel> internally when
|
||||||
called with B<--sshlogin>).
|
called with B<--sshlogin>).
|
||||||
|
|
||||||
|
|
||||||
=item B<--plus> (beta testing)
|
=item B<--plus>
|
||||||
|
|
||||||
Activate additional replacement strings: {+/} {+.} {+..} {+...} {..}
|
Activate additional replacement strings: {+/} {+.} {+..} {+...} {..}
|
||||||
{...} {/..} {/...} {##}. The idea being that '{+foo}' matches the opposite of
|
{...} {/..} {/...} {##}. The idea being that '{+foo}' matches the opposite of
|
||||||
|
@ -1288,7 +1288,7 @@ Overrides an earlier B<--keep-order> (e.g. if set in
|
||||||
B<~/.parallel/config>).
|
B<~/.parallel/config>).
|
||||||
|
|
||||||
|
|
||||||
=item B<--nice> I<niceness> (beta testing)
|
=item B<--nice> I<niceness>
|
||||||
|
|
||||||
Run the command at this niceness. For simple commands you can just add
|
Run the command at this niceness. For simple commands you can just add
|
||||||
B<nice> in front of the command. But if the command consists of more
|
B<nice> in front of the command. But if the command consists of more
|
||||||
|
@ -1576,6 +1576,19 @@ it possible to define your own replacement strings. GNU B<parallel>'s
|
||||||
--rpl '{/.} s:.*/::; s:\.[^/.]+$::;'
|
--rpl '{/.} s:.*/::; s:\.[^/.]+$::;'
|
||||||
--rpl '{.} s:\.[^/.]+$::'
|
--rpl '{.} s:\.[^/.]+$::'
|
||||||
|
|
||||||
|
The <--plus> replacement strings are implemented as:
|
||||||
|
|
||||||
|
--rpl '{+/} s:/[^/]*$::'
|
||||||
|
--rpl '{+.} s:.*\.::'
|
||||||
|
--rpl '{+..} s:.*\.([^.]*\.):$1:'
|
||||||
|
--rpl '{+...} s:.*\.([^.]*\.[^.]*\.):$1:'
|
||||||
|
--rpl '{..} s:\.[^/.]+$::; s:\.[^/.]+$::'
|
||||||
|
--rpl '{...} s:\.[^/.]+$::; s:\.[^/.]+$::; s:\.[^/.]+$::'
|
||||||
|
--rpl '{/..} s:.*/::; s:\.[^/.]+$::; s:\.[^/.]+$::'
|
||||||
|
--rpl '{/...} s:.*/::; s:\.[^/.]+$::; s:\.[^/.]+$::; s:\.[^/.]+$::'
|
||||||
|
--rpl '{##} $_=total_jobs()'
|
||||||
|
|
||||||
|
|
||||||
If the user defined replacement string starts with '{' it can also be
|
If the user defined replacement string starts with '{' it can also be
|
||||||
used as a positional replacement string (like B<{2.}>).
|
used as a positional replacement string (like B<{2.}>).
|
||||||
|
|
||||||
|
@ -1737,7 +1750,7 @@ Does not run the command but quotes it. Useful for making quoted
|
||||||
composed commands for GNU B<parallel>.
|
composed commands for GNU B<parallel>.
|
||||||
|
|
||||||
|
|
||||||
=item B<--shuf> (beta testing)
|
=item B<--shuf>
|
||||||
|
|
||||||
Shuffle jobs. When having multiple input sources it is hard to
|
Shuffle jobs. When having multiple input sources it is hard to
|
||||||
randomize jobs. --shuf will generate all jobs, and shuffle them before
|
randomize jobs. --shuf will generate all jobs, and shuffle them before
|
||||||
|
@ -1765,13 +1778,13 @@ I<secs> seconds after starting each ssh. I<secs> can be less than 1
|
||||||
seconds.
|
seconds.
|
||||||
|
|
||||||
|
|
||||||
=item B<-S> I<[@hostgroups/][ncpu/]sshlogin[,[@hostgroups/][ncpu/]sshlogin[,...]]> (beta testing)
|
=item B<-S> I<[@hostgroups/][ncpu/]sshlogin[,[@hostgroups/][ncpu/]sshlogin[,...]]>
|
||||||
|
|
||||||
=item B<-S> I<@hostgroup> (beta testing)
|
=item B<-S> I<@hostgroup>
|
||||||
|
|
||||||
=item B<--sshlogin> I<[@hostgroups/][ncpu/]sshlogin[,[@hostgroups/][ncpu/]sshlogin[,...]]> (beta testing)
|
=item B<--sshlogin> I<[@hostgroups/][ncpu/]sshlogin[,[@hostgroups/][ncpu/]sshlogin[,...]]>
|
||||||
|
|
||||||
=item B<--sshlogin> I<@hostgroup> (beta testing)
|
=item B<--sshlogin> I<@hostgroup>
|
||||||
|
|
||||||
Distribute jobs to remote computers. The jobs will be run on a list of
|
Distribute jobs to remote computers. The jobs will be run on a list of
|
||||||
remote computers.
|
remote computers.
|
||||||
|
@ -2088,9 +2101,9 @@ Use B<-v> B<-v> to print the wrapping ssh command when running remotely.
|
||||||
Print the version GNU B<parallel> and exit.
|
Print the version GNU B<parallel> and exit.
|
||||||
|
|
||||||
|
|
||||||
=item B<--workdir> I<mydir> (beta testing)
|
=item B<--workdir> I<mydir>
|
||||||
|
|
||||||
=item B<--wd> I<mydir> (beta testing)
|
=item B<--wd> I<mydir>
|
||||||
|
|
||||||
Files transferred using B<--transfer> and B<--return> will be relative
|
Files transferred using B<--transfer> and B<--return> will be relative
|
||||||
to I<mydir> on remote computers, and the command will be executed in
|
to I<mydir> on remote computers, and the command will be executed in
|
||||||
|
|
|
@ -36,7 +36,7 @@ echo 'bug #40134: FreeBSD: --shebang not working'
|
||||||
|
|
||||||
echo 'bug #40134: FreeBSD: --shebang(-wrap) not working'
|
echo 'bug #40134: FreeBSD: --shebang(-wrap) not working'
|
||||||
(echo '#!/usr/bin/env -S parallel --shebang-wrap /usr/bin/perl :::'; echo 'print @ARGV,"\n";') > shebang-wrap;
|
(echo '#!/usr/bin/env -S parallel --shebang-wrap /usr/bin/perl :::'; echo 'print @ARGV,"\n";') > shebang-wrap;
|
||||||
chmod 755 ./shebang-wrap; ./shebang-wrap wrap works
|
chmod 755 ./shebang-wrap; ./shebang-wrap wrap works | sort -r
|
||||||
|
|
||||||
echo 'bug #40134: FreeBSD: --shebang(-wrap) with options not working'
|
echo 'bug #40134: FreeBSD: --shebang(-wrap) with options not working'
|
||||||
(echo '#!/usr/bin/env -S parallel --shebang-wrap -v -k -j 0 /usr/bin/perl -w :::'; echo 'print @ARGV,"\n";') > shebang-wrap-opt;
|
(echo '#!/usr/bin/env -S parallel --shebang-wrap -v -k -j 0 /usr/bin/perl -w :::'; echo 'print @ARGV,"\n";') > shebang-wrap-opt;
|
||||||
|
|
|
@ -249,11 +249,11 @@ echo '**'
|
||||||
|
|
||||||
echo '{##} bug #45841: Replacement string for total no of jobs'
|
echo '{##} bug #45841: Replacement string for total no of jobs'
|
||||||
|
|
||||||
parallel --plus echo {##} ::: {a..j};
|
parallel -k --plus echo {##} ::: {a..j};
|
||||||
parallel -k 'echo {= $::G++ > 3 and ($_=$Global::JobQueue->total_jobs());=}' ::: {1..10}
|
parallel -k 'echo {= $::G++ > 3 and ($_=$Global::JobQueue->total_jobs());=}' ::: {1..10}
|
||||||
parallel -N7 --plus echo {#} {##} ::: {1..14}
|
parallel -k -N7 --plus echo {#} {##} ::: {1..14}
|
||||||
parallel -N7 --plus echo {#} {##} ::: {1..15}
|
parallel -k -N7 --plus echo {#} {##} ::: {1..15}
|
||||||
parallel -X --plus echo {#} {##} ::: {1..15}
|
parallel -k -X --plus echo {#} {##} ::: {1..15}
|
||||||
|
|
||||||
echo '**'
|
echo '**'
|
||||||
|
|
||||||
|
|
71
testsuite/tests-to-run/parallel-local-ssh6.sh
Normal file
71
testsuite/tests-to-run/parallel-local-ssh6.sh
Normal file
|
@ -0,0 +1,71 @@
|
||||||
|
#!/bin/bash
|
||||||
|
|
||||||
|
SSHLOGIN1=parallel@lo
|
||||||
|
SSHLOGIN2=csh@lo
|
||||||
|
mkdir -p tmp
|
||||||
|
|
||||||
|
# -L1 will join lines ending in ' '
|
||||||
|
cat <<'EOF' | sed -e s/\$SERVER1/$SERVER1/\;s/\$SERVER2/$SERVER2/\;s/\$SSHLOGIN1/$SSHLOGIN1/\;s/\$SSHLOGIN2/$SSHLOGIN2/ | parallel -vj5 -k --joblog /tmp/jl-`basename $0` -L1
|
||||||
|
echo '### Test --onall';
|
||||||
|
parallel --onall --tag -k -S $SSHLOGIN1,$SSHLOGIN2 '(echo {1} {2}) | awk \{print\ \$2}' ::: a b c ::: 1 2
|
||||||
|
|
||||||
|
echo '### Test | --onall';
|
||||||
|
seq 3 | parallel --onall --tag -k -S $SSHLOGIN1,$SSHLOGIN2 '(echo {1} {2}) | awk \{print\ \$2}' ::: a b c :::: -
|
||||||
|
|
||||||
|
echo '### Test --onall -u';
|
||||||
|
parallel --onall -S $SSHLOGIN1,$SSHLOGIN2 -u '(echo {1} {2}) | awk \{print\ \$2}' ::: a b c ::: 1 2 3 | sort
|
||||||
|
|
||||||
|
echo '### Test --nonall';
|
||||||
|
parallel --nonall -k -S $SSHLOGIN1,$SSHLOGIN2 pwd | sort
|
||||||
|
|
||||||
|
echo '### Test --nonall -u - should be interleaved x y x y';
|
||||||
|
parallel --nonall -S $SSHLOGIN1,$SSHLOGIN2 -u 'pwd|grep -q csh && sleep 3; pwd;sleep 12;pwd;'
|
||||||
|
|
||||||
|
echo '### Test read sshloginfile from STDIN';
|
||||||
|
echo $SSHLOGIN1,$SSHLOGIN2 | parallel -S - -k --nonall pwd;
|
||||||
|
echo $SSHLOGIN1,$SSHLOGIN2 | parallel --sshloginfile - -k --onall pwd\; echo ::: foo
|
||||||
|
|
||||||
|
echo '**'
|
||||||
|
|
||||||
|
echo '### Test --nonall --basefile';
|
||||||
|
touch tmp/nonall--basefile;
|
||||||
|
stdout parallel --nonall --basefile tmp/nonall--basefile -S $SSHLOGIN1,$SSHLOGIN2 ls tmp/nonall--basefile;
|
||||||
|
stdout parallel --nonall -S $SSHLOGIN1,$SSHLOGIN2 rm tmp/nonall--basefile;
|
||||||
|
stdout rm tmp/nonall--basefile
|
||||||
|
|
||||||
|
echo '**'
|
||||||
|
|
||||||
|
echo '### Test --onall --basefile';
|
||||||
|
touch tmp/onall--basefile;
|
||||||
|
stdout parallel --onall --basefile tmp/onall--basefile -S $SSHLOGIN1,$SSHLOGIN2 ls {} ::: tmp/onall--basefile;
|
||||||
|
stdout parallel --onall -S $SSHLOGIN1,$SSHLOGIN2 rm {} ::: tmp/onall--basefile;
|
||||||
|
stdout rm tmp/onall--basefile
|
||||||
|
|
||||||
|
echo '**'
|
||||||
|
|
||||||
|
echo '### Test --nonall --basefile --cleanup (rm should fail)';
|
||||||
|
touch tmp/nonall--basefile--clean;
|
||||||
|
stdout parallel --nonall --basefile tmp/nonall--basefile--clean --cleanup -S $SSHLOGIN1,$SSHLOGIN2 ls tmp/nonall--basefile--clean;
|
||||||
|
stdout parallel --nonall -S $SSHLOGIN1,$SSHLOGIN2 rm tmp/nonall--basefile--clean;
|
||||||
|
stdout rm tmp/nonall--basefile--clean
|
||||||
|
|
||||||
|
echo '**'
|
||||||
|
|
||||||
|
echo '### Test --onall --basefile --cleanup (rm should fail)';
|
||||||
|
touch tmp/onall--basefile--clean;
|
||||||
|
stdout parallel --onall --basefile tmp/onall--basefile--clean --cleanup -S $SSHLOGIN1,$SSHLOGIN2 ls {} ::: tmp/onall--basefile--clean;
|
||||||
|
stdout parallel --onall -S $SSHLOGIN1,$SSHLOGIN2 rm {} ::: tmp/onall--basefile--clean;
|
||||||
|
stdout rm tmp/onall--basefile--clean
|
||||||
|
|
||||||
|
echo '**'
|
||||||
|
|
||||||
|
echo '### Test --workdir .';
|
||||||
|
ssh $SSHLOGIN1 mkdir -p mydir;
|
||||||
|
mkdir -p $HOME/mydir; cd $HOME/mydir;
|
||||||
|
parallel --workdir . -S $SSHLOGIN1 ::: pwd
|
||||||
|
|
||||||
|
echo '### Test --wd .';
|
||||||
|
ssh $SSHLOGIN2 mkdir -p mydir;
|
||||||
|
mkdir -p $HOME/mydir; cd $HOME/mydir;
|
||||||
|
parallel --workdir . -S $SSHLOGIN2 ::: pwd
|
||||||
|
EOF
|
|
@ -44,7 +44,7 @@ It
|
||||||
worked
|
worked
|
||||||
echo 'bug #40134: FreeBSD: --shebang(-wrap) not working'
|
echo 'bug #40134: FreeBSD: --shebang(-wrap) not working'
|
||||||
bug #40134: FreeBSD: --shebang(-wrap) not working
|
bug #40134: FreeBSD: --shebang(-wrap) not working
|
||||||
(echo '#!/usr/bin/env -S parallel --shebang-wrap /usr/bin/perl :::'; echo 'print @ARGV,"\n";') > shebang-wrap; chmod 755 ./shebang-wrap; ./shebang-wrap wrap works
|
(echo '#!/usr/bin/env -S parallel --shebang-wrap /usr/bin/perl :::'; echo 'print @ARGV,"\n";') > shebang-wrap; chmod 755 ./shebang-wrap; ./shebang-wrap wrap works | sort -r
|
||||||
wrap
|
wrap
|
||||||
works
|
works
|
||||||
echo 'bug #40134: FreeBSD: --shebang(-wrap) with options not working'
|
echo 'bug #40134: FreeBSD: --shebang(-wrap) with options not working'
|
||||||
|
|
|
@ -521,7 +521,7 @@ echo '**'
|
||||||
**
|
**
|
||||||
echo '{##} bug #45841: Replacement string for total no of jobs'
|
echo '{##} bug #45841: Replacement string for total no of jobs'
|
||||||
{##} bug #45841: Replacement string for total no of jobs
|
{##} bug #45841: Replacement string for total no of jobs
|
||||||
parallel --plus echo {##} ::: {a..j}; parallel -k 'echo {= $::G++ > 3 and ($_=$Global::JobQueue->total_jobs());=}' ::: {1..10}
|
parallel -k --plus echo {##} ::: {a..j}; parallel -k 'echo {= $::G++ > 3 and ($_=$Global::JobQueue->total_jobs());=}' ::: {1..10}
|
||||||
10
|
10
|
||||||
10
|
10
|
||||||
10
|
10
|
||||||
|
@ -542,14 +542,14 @@ echo '{##} bug #45841: Replacement string for total no of jobs'
|
||||||
10
|
10
|
||||||
10
|
10
|
||||||
10
|
10
|
||||||
parallel -N7 --plus echo {#} {##} ::: {1..14}
|
parallel -k -N7 --plus echo {#} {##} ::: {1..14}
|
||||||
1 2 2 2 2 2 2 2
|
1 2 2 2 2 2 2 2
|
||||||
2 2 2 2 2 2 2 2
|
2 2 2 2 2 2 2 2
|
||||||
parallel -N7 --plus echo {#} {##} ::: {1..15}
|
parallel -k -N7 --plus echo {#} {##} ::: {1..15}
|
||||||
1 3 3 3 3 3 3 3
|
1 3 3 3 3 3 3 3
|
||||||
2 3 3 3 3 3 3 3
|
2 3 3 3 3 3 3 3
|
||||||
3 3
|
3 3
|
||||||
parallel -X --plus echo {#} {##} ::: {1..15}
|
parallel -k -X --plus echo {#} {##} ::: {1..15}
|
||||||
1 15 15
|
1 15 15
|
||||||
2 15 15
|
2 15 15
|
||||||
3 15 15
|
3 15 15
|
||||||
|
|
|
@ -6,7 +6,7 @@ please cite:
|
||||||
O. Tange (2011): GNU Parallel - The Command-Line Power Tool,
|
O. Tange (2011): GNU Parallel - The Command-Line Power Tool,
|
||||||
;login: The USENIX Magazine, February 2011:42-47.
|
;login: The USENIX Magazine, February 2011:42-47.
|
||||||
|
|
||||||
This helps funding further development; and it won't cost you a cent.
|
This helps funding further development; AND IT WON'T COST YOU A CENT.
|
||||||
If you pay 10000 EUR you should feel free to use GNU Parallel without citing.
|
If you pay 10000 EUR you should feel free to use GNU Parallel without citing.
|
||||||
|
|
||||||
To silence the citation notice: run 'parallel --bibtex'.
|
To silence the citation notice: run 'parallel --bibtex'.
|
||||||
|
@ -27,7 +27,7 @@ please cite:
|
||||||
O. Tange (2011): GNU Parallel - The Command-Line Power Tool,
|
O. Tange (2011): GNU Parallel - The Command-Line Power Tool,
|
||||||
;login: The USENIX Magazine, February 2011:42-47.
|
;login: The USENIX Magazine, February 2011:42-47.
|
||||||
|
|
||||||
This helps funding further development; and it won't cost you a cent.
|
This helps funding further development; AND IT WON'T COST YOU A CENT.
|
||||||
If you pay 10000 EUR you should feel free to use GNU Parallel without citing.
|
If you pay 10000 EUR you should feel free to use GNU Parallel without citing.
|
||||||
|
|
||||||
To silence the citation notice: run 'parallel --bibtex'.
|
To silence the citation notice: run 'parallel --bibtex'.
|
||||||
|
|
|
@ -176,7 +176,7 @@ please cite:
|
||||||
O. Tange (2011): GNU Parallel - The Command-Line Power Tool,
|
O. Tange (2011): GNU Parallel - The Command-Line Power Tool,
|
||||||
;login: The USENIX Magazine, February 2011:42-47.
|
;login: The USENIX Magazine, February 2011:42-47.
|
||||||
|
|
||||||
This helps funding further development; and it won't cost you a cent.
|
This helps funding further development; AND IT WON'T COST YOU A CENT.
|
||||||
If you pay 10000 EUR you should feel free to use GNU Parallel without citing.
|
If you pay 10000 EUR you should feel free to use GNU Parallel without citing.
|
||||||
|
|
||||||
echo '### Test of -j filename'; echo 3 >/tmp/jobs_to_run1; parallel -j /tmp/jobs_to_run1 -v sleep {} ::: 10 8 6 5 4; # Should give 6 8 10 5 4
|
echo '### Test of -j filename'; echo 3 >/tmp/jobs_to_run1; parallel -j /tmp/jobs_to_run1 -v sleep {} ::: 10 8 6 5 4; # Should give 6 8 10 5 4
|
||||||
|
|
|
@ -980,7 +980,7 @@ please cite:
|
||||||
O. Tange (2011): GNU Parallel - The Command-Line Power Tool,
|
O. Tange (2011): GNU Parallel - The Command-Line Power Tool,
|
||||||
;login: The USENIX Magazine, February 2011:42-47.
|
;login: The USENIX Magazine, February 2011:42-47.
|
||||||
|
|
||||||
This helps funding further development; and it won't cost you a cent.
|
This helps funding further development; AND IT WON'T COST YOU A CENT.
|
||||||
If you pay 10000 EUR you should feel free to use GNU Parallel without citing.
|
If you pay 10000 EUR you should feel free to use GNU Parallel without citing.
|
||||||
|
|
||||||
parallel --version
|
parallel --version
|
||||||
|
@ -1019,7 +1019,7 @@ please cite:
|
||||||
|
|
||||||
(Feel free to use \nocite{Tange2011a})
|
(Feel free to use \nocite{Tange2011a})
|
||||||
|
|
||||||
This helps funding further development; and it won't cost you a cent.
|
This helps funding further development; AND IT WON'T COST YOU A CENT.
|
||||||
If you pay 10000 EUR you should feel free to use GNU Parallel without citing.
|
If you pay 10000 EUR you should feel free to use GNU Parallel without citing.
|
||||||
|
|
||||||
If you send a copy of your published article to tange@gnu.org, it will be
|
If you send a copy of your published article to tange@gnu.org, it will be
|
||||||
|
|
Loading…
Reference in a new issue