parallel: --onall now supports sshpass - user:pass@host.

This commit is contained in:
Ole Tange 2024-05-05 23:17:00 +02:00
parent 78d14e0e40
commit 510dcb7fa1
11 changed files with 1319 additions and 931 deletions

View file

@ -19,7 +19,7 @@ torresults:
torsync: torsync:
torsocks rsync -Hazv --progress --exclude authorized_keys --exclude .vagrant/ ./ tortest:privat/parallel/ torsocks rsync -Hazv --progress --exclude authorized_keys --exclude .vagrant/ --exclude actual-results --delete ./ tortest:privat/parallel/
make tortest make tortest
web: web:

View file

@ -787,7 +787,7 @@ torresults:
torsocks rsync -Hazv --progress --exclude authorized_keys --exclude .vagrant/ tortest:privat/parallel/testsuite/actual-results/ testsuite/actual-results/ torsocks rsync -Hazv --progress --exclude authorized_keys --exclude .vagrant/ tortest:privat/parallel/testsuite/actual-results/ testsuite/actual-results/
torsync: torsync:
torsocks rsync -Hazv --progress --exclude authorized_keys --exclude .vagrant/ ./ tortest:privat/parallel/ torsocks rsync -Hazv --progress --exclude authorized_keys --exclude .vagrant/ --exclude actual-results --delete ./ tortest:privat/parallel/
make tortest make tortest
web: web:

14
README
View file

@ -40,13 +40,13 @@ installation.
$ (wget -O - pi.dk/3 || lynx -source pi.dk/3 || curl pi.dk/3/ || \ $ (wget -O - pi.dk/3 || lynx -source pi.dk/3 || curl pi.dk/3/ || \
fetch -o - http://pi.dk/3 ) > install.sh fetch -o - http://pi.dk/3 ) > install.sh
$ sha1sum install.sh | grep 883c667e01eed62f975ad28b6d50e22a $ sha1sum install.sh | grep 51621b7f1ee103c00783aae4ef9889f8
12345678 883c667e 01eed62f 975ad28b 6d50e22a 12345678 51621b7f 1ee103c0 0783aae4 ef9889f8
$ md5sum install.sh | grep cc21b4c943fd03e93ae1ae49e28573c0 $ md5sum install.sh | grep 62eada78703b5500241b8e50baf62758
cc21b4c9 43fd03e9 3ae1ae49 e28573c0 62eada78 703b5500 241b8e50 baf62758
$ sha512sum install.sh | grep da012ec113b49a54e705f86d51e784ebced224fdf $ sha512sum install.sh | grep c0206a65dc86f2bb6bbdf1a2bc96bc6d067
79945d9d 250b42a4 2067bb00 99da012e c113b49a 54e705f8 6d51e784 ebced224 160d3159 9480cf5c a101512f 150b7ac0 206a65dc 86f2bb6b bdf1a2bc 96bc6d06
fdff3f52 ca588d64 e75f6033 61bd543f d631f592 2f87ceb2 ab034149 6df84a35 7f8237c2 0964b67f bccf8a93 332528fa 11e5ab43 2a6226a6 ceb197ab 7f03c061
$ bash install.sh $ bash install.sh
This will literally install faster than reading the rest of this This will literally install faster than reading the rest of this

View file

@ -5458,6 +5458,13 @@ sub onall($@) {
for my $host (sort keys %Global::host) { for my $host (sort keys %Global::host) {
my $sshlogin = $Global::host{$host}; my $sshlogin = $Global::host{$host};
my $qsshlogin = Q($sshlogin->string()); my $qsshlogin = Q($sshlogin->string());
my $qsshloginpw = Q($sshlogin->pwstring());
if($qsshloginpw ne $qsshlogin) {
::warning_once("Using password or SSHPASS with --(n)onall ".
"exposes the password",
"on the command line, ".
"making it visible to local users via `ps`.");
}
my $joblog = tmp_joblog($opt::joblog); my $joblog = tmp_joblog($opt::joblog);
if($joblog) { if($joblog) {
push @joblogs, $joblog; push @joblogs, $joblog;
@ -5466,8 +5473,7 @@ sub onall($@) {
my $quad = $opt::arg_file_sep || "::::"; my $quad = $opt::arg_file_sep || "::::";
# If PARALLEL_ENV is set: Pass it on # If PARALLEL_ENV is set: Pass it on
my $penv=$Global::parallel_env ? my $penv=$Global::parallel_env ?
"PARALLEL_ENV=".Q($Global::parallel_env) : "PARALLEL_ENV=".Q($Global::parallel_env) : '';
'';
my $results; my $results;
if(defined $opt::results) { if(defined $opt::results) {
$results = Q($opt::results) . $qsshlogin; $results = Q($opt::results) . $qsshlogin;
@ -5475,12 +5481,12 @@ sub onall($@) {
::debug("init", "$penv $0 $suboptions -j1 $joblog ", ::debug("init", "$penv $0 $suboptions -j1 $joblog ",
((defined $opt::tag) ? "--tagstring ".$qsshlogin : ""), ((defined $opt::tag) ? "--tagstring ".$qsshlogin : ""),
((defined $opt::results) ? "--results ".$results : ""), ((defined $opt::results) ? "--results ".$results : ""),
" -S $qsshlogin ", " -S $qsshloginpw ",
join(" ",shell_quote(@command,$quad,@argfiles)),"\n"); join(" ",shell_quote(@command,$quad,@argfiles)),"\n");
print $parallel_fh "$penv $0 $suboptions -j1 $joblog ", print $parallel_fh "$penv $0 $suboptions -j1 $joblog ",
((defined $opt::tag) ? "--tagstring ".$qsshlogin : ""), ((defined $opt::tag) ? "--tagstring ".$qsshlogin : ""),
((defined $opt::results) ? "--results ".$results : ""), ((defined $opt::results) ? "--results ".$results : ""),
" -S $qsshlogin ", " -S $qsshloginpw ",
join(" ",shell_quote(@command,$quad,@argfiles)),"\0"; join(" ",shell_quote(@command,$quad,@argfiles)),"\0";
} }
close $parallel_fh; close $parallel_fh;
@ -7295,11 +7301,20 @@ sub new($$) {
# [ncpu/]/usr/bin/ssh user:pass@server:port # [ncpu/]/usr/bin/ssh user:pass@server:port
if ($s =~ s:^(\d+)/::) { $ncpus = $1; } if ($s =~ s:^(\d+)/::) { $ncpus = $1; }
# Why disallow space in password?
# Example:
# C:/bin/ssh user:C:/bin/ssh@host
# Should this parse as:
# user 'C' with password '/bin/ssh user:C:/bin/ssh'
# or
# cmd 'C:/bin/ssh' user 'user' with password 'C:/bin/ssh'
# This is impossible to determine.
# With space forbidden in password it uniquely parses as the 2nd.
# [/usr/bin/ssh ]user:pass@server:port # [/usr/bin/ssh ]user:pass@server:port
if($s =~ s/^(.*) //) { $sshcommand = $1; } if($s =~ s/^(.*) //) { $sshcommand = $1; }
# [user:pass@]server:port # [user:pass@]server:port
if($s =~ s/^([^@]+)@//) { if($s =~ s/^(.+)@//) {
my $userpw = $1; my $userpw = $1;
# user[:pass] # user[:pass]
if($userpw =~ s/:(.*)//) { if($userpw =~ s/:(.*)//) {
@ -7356,6 +7371,12 @@ sub new($$) {
($user && $user."@"). ($user && $user."@").
($host && $host). ($host && $host).
($port && ":$port"); ($port && ":$port");
my $pwstring =
# Only include the sshcommand in $string if it is set by user
($sshcommand && $sshcommand." ").
($user && $user. ($password && ":".$password)."@").
($host && $host).
($port && ":$port");
if($host eq ':') { if($host eq ':') {
$local = 1; $local = 1;
$string = ":"; $string = ":";
@ -7370,6 +7391,7 @@ sub new($$) {
$no_slash_string =~ s/[^-a-z0-9:]/_/gi; $no_slash_string =~ s/[^-a-z0-9:]/_/gi;
return bless { return bless {
'string' => $string, 'string' => $string,
'pwstring' => $pwstring,
'jobs_running' => 0, 'jobs_running' => 0,
'jobs_completed' => 0, 'jobs_completed' => 0,
'maxlength' => undef, 'maxlength' => undef,
@ -7409,6 +7431,11 @@ sub string($) {
return $self->{'string'}; return $self->{'string'};
} }
sub pwstring($) {
my $self = shift;
return $self->{'pwstring'};
}
sub host($) { sub host($) {
my $self = shift; my $self = shift;
return $self->{'host'}; return $self->{'host'};
@ -7456,7 +7483,6 @@ sub sshcmd($) {
} }
push @local, "-S", ::Q($control_path); push @local, "-S", ::Q($control_path);
} }
return "@local"; return "@local";
} }

View file

@ -255,11 +255,12 @@ Argument from input source I<n> or the I<n>'th argument.
This positional replacement string will be replaced by the input from This positional replacement string will be replaced by the input from
input source I<n> (when used with B<--arg-file> or B<::::>) or with the input source I<n> (when used with B<--arg-file> or B<::::>) or with the
I<n>'th argument (when used with B<-N>). If I<n> is negative it refers I<n>'th argument (when used with B<-N> or B<--colsep>).
to the I<n>'th last argument.
If I<n> is negative it refers to the I<n>'th last argument.
See also: B<{}> B<{>I<n>.B<}> B<{>I<n>/B<}> B<{>I<n>//B<}> See also: B<{}> B<{>I<n>.B<}> B<{>I<n>/B<}> B<{>I<n>//B<}>
B<{>I<n>/.B<}> B<{>I<n>/.B<}> B<--colsep>
=item B<{>I<n>.B<}> =item B<{>I<n>.B<}>
@ -827,7 +828,8 @@ columns. The n'th column can be accessed using B<{>I<n>B<}> or
B<{>I<n>.B<}>. E.g. B<{3}> is the 3rd column. B<{>I<n>.B<}>. E.g. B<{3}> is the 3rd column.
If there are more input sources, each input source will be separated, If there are more input sources, each input source will be separated,
but the columns from each input source will be linked. but the columns from each input source will be linked. Here {4} refers
to column 2 in input source 2:
parallel --colsep '-' echo {4} {3} {2} {1} \ parallel --colsep '-' echo {4} {3} {2} {1} \
::: A-B C-D ::: e-f g-h ::: A-B C-D ::: e-f g-h
@ -1773,7 +1775,7 @@ If in doubt use B<-X> as that will most likely do what is needed.
See also: B<-X> B<--xargs> See also: B<-X> B<--xargs>
=item B<--memfree> I<size> =item B<--memfree> I<size> (alpha testing)
Minimum memory free when starting another job. Minimum memory free when starting another job.
@ -1785,10 +1787,7 @@ are free, no more jobs will be started. If less than 50% I<size> bytes
are free, the youngest job will be killed (as per B<--term-seq>), and are free, the youngest job will be killed (as per B<--term-seq>), and
put back on the queue to be run later. put back on the queue to be run later.
B<--retries> must be set to determine how many times GNU B<parallel> See also: UNIT PREFIX B<--term-seq> B<--memsuspend>
should retry a given job.
See also: UNIT PREFIX B<--term-seq> B<--retries> B<--memsuspend>
=item B<--memsuspend> I<size> =item B<--memsuspend> I<size>
@ -1880,7 +1879,7 @@ is somewhat slower than B<--block>.
See also: UNIT PREFIX B<--pipe> B<--block> B<-m> B<-X> B<--max-args> See also: UNIT PREFIX B<--pipe> B<--block> B<-m> B<-X> B<--max-args>
=item B<--nonall> =item B<--nonall> (alpha testing)
B<--onall> with no arguments. B<--onall> with no arguments.
@ -1895,7 +1894,7 @@ servers.
See also: B<--onall> B<--sshlogin> See also: B<--onall> B<--sshlogin>
=item B<--onall> =item B<--onall> (alpha testing)
Run all the jobs on all computers given with B<--sshlogin>. Run all the jobs on all computers given with B<--sshlogin>.
@ -3115,11 +3114,11 @@ I<duration> is in seconds, but can be postfixed with s, m, h, or d.
See also: TIME POSTFIXES B<--sshlogin> B<--delay> See also: TIME POSTFIXES B<--sshlogin> B<--delay>
=item B<--sshlogin> I<[@hostgroups/][ncpus/]sshlogin[,[@hostgroups/][ncpus/]sshlogin[,...]]> =item B<--sshlogin> I<[@hostgroups/][ncpus/][[user][:[password]]@]host[:port][,...]>
=item B<--sshlogin> I<@hostgroup> =item B<--sshlogin> I<@hostgroup>
=item B<-S> I<[@hostgroups/][ncpus/]sshlogin[,[@hostgroups/][ncpus/]sshlogin[,...]]> =item B<-S> I<[@hostgroups/][ncpus/][ssh command][[user][:[password]]@]host[:port][,...]>
=item B<-S> I<@hostgroup> =item B<-S> I<@hostgroup>
@ -3127,46 +3126,103 @@ Distribute jobs to remote computers.
The jobs will be run on a list of remote computers. The jobs will be run on a list of remote computers.
If I<hostgroups> is given, the I<sshlogin> will be added to that =over 15
hostgroup. Multiple hostgroups are separated by '+'. The I<sshlogin>
=item Z<> @I<hostgroups>/
One or more groups this sshlogin belongs to (See
B<--hostgroup>). Multiple groups are separated by '+'. The I<sshlogin>
will always be added to a hostgroup named the same as I<sshlogin>. will always be added to a hostgroup named the same as I<sshlogin>.
If only the I<@hostgroup> is given, only the sshlogins in that If only the I<@hostgroup> is given, only the sshlogins in that
hostgroup will be used. Multiple I<@hostgroup> can be given. hostgroup will be used. Multiple I<@hostgroup> can be given.
Examples: B<@prod/>, B<@dev+remote/>
=item Z<> I<ncpus>/
Force number of CPU threads.
GNU B<parallel> will determine the number of CPUs on the remote GNU B<parallel> will determine the number of CPUs on the remote
computers and run the number of jobs as specified by B<-j>. If the computers and run the number of jobs as specified by B<-j>. If the
number I<ncpus> is given GNU B<parallel> will use this number for number I<ncpus> is given GNU B<parallel> will use this number for
number of CPUs on the host. Normally I<ncpus> will not be number of CPU threads on the host. Normally I<ncpus> will not be
needed. needed.
An I<sshlogin> is of the form: Examples: B<4/>, B<12/>
[sshcommand [options]] [username[:password]@]hostname
If I<password> is given, B<sshpass> will be used. Otherwise the =item Z<> I<ssh command>
sshlogin must not require a password (B<ssh-agent> and B<ssh-copy-id>
may help with that).
If the hostname is an IPv6 address, the port can be given separated The I<ssh command> to use. The I<ssh command> must be followed by a space.
with p or #. If the address is enclosed in [] you can also use :.
E.g. ::1p2222 ::1#2222 [::1]:2222
Ranges of hostnames can be given in [] like this: server[1,3,8-10] Example: B</usr/bin/lsh -z >, B<autossh -C >
(for server1, server3, server8, server9, server10) or
server[001,003,008-010] (for server001, server003, server008,
server009, server010). With Bash's brace expansion you can do:
-S{dev,prod}[001-100] to get -Sdev[001-100] -Sprod[001-100]
More [] are allowed: server[1-10].cluster[1-5].example.net
The sshlogin ':' is special, it means 'no ssh' and will therefore run
on the local computer.
The sshlogin '..' is special, it read sshlogins from ~/.parallel/sshloginfile or =item Z<> I<user>
$XDG_CONFIG_HOME/parallel/sshloginfile
The sshlogin '-' is special, too, it read sshlogins from stdin User name to log in as. Defaults to the current user name.
(standard input).
Examples: B<alice>, B<bob>
=item Z<> :I<password>
Use I<password> for authentication (using B<sshpass>). B<password>
cannot contain space. If I<password> is omitted use B<$SSHPASS>. If
B<:> is omitted use B<ssh>'s default authentication. In this case
login must not require a password (B<ssh-agent> and B<ssh-copy-id> may
help with that).
Examples: B<:mypassword>, B<:>
=item Z<> I<host>
Hostname or IP address of server.
Examples: B<server01>, B<10.1.2.3>, B<[2001:470:142:4::a]>,
B<2001:470:142:5::116>.
Ranges of hostnames can be given in [] like this: B<server[1,3,8-10]>
(for B<server1, server3, server8, server9, server10>) or
B<server[001,003,008-010]> (for B<server001, server003, server008,
server009, server010>). With Bash's brace expansion you can do:
B<-S{dev,prod}[001-100]> to get B<-Sdev[001-100] -Sprod[001-100]> More
[]'s are allowed: B<server[01-10].cluster[1-5].example.net>
=item Z<> :I<port>
Port number to connect to.
Examples: B<:22>, B<:2222>.
For IPv6 you can use B<p> or B<#> instead of B<:>.
Examples: B<[2001:470:142:4::a]:2222>, B<2001:470:142:5::116p2222>,
B<2001:470:142:5::116#22222>
=back
There are 3 names with special meaning:
=over 4
=item Z<> I<:>
Means 'no ssh' and will therefore run on the local computer.
=item Z<> I<..>
Read sshlogins from B<~/.parallel/sshloginfile> or
B<$XDG_CONFIG_HOME/parallel/sshloginfile>
=item Z<> I<->
Read sshlogins from stdin (standard input).
=back
To specify more sshlogins separate the sshlogins by comma, newline (in To specify more sshlogins separate the sshlogins by comma, newline (in
the same string), or repeat the options multiple times. the same string), or repeat the options multiple times.
@ -3174,7 +3230,7 @@ the same string), or repeat the options multiple times.
GNU B<parallel> splits on , (comma) so if your sshlogin contains , GNU B<parallel> splits on , (comma) so if your sshlogin contains ,
(comma) you need to replace it with \, or ,, (comma) you need to replace it with \, or ,,
For examples: see B<--sshloginfile>. See B<--sshloginfile> for complete examples.
The remote host must have GNU B<parallel> installed. The remote host must have GNU B<parallel> installed.
@ -3196,8 +3252,9 @@ lines. Empty lines and lines starting with '#' are ignored. Example:
username@server2.example.com username@server2.example.com
8/my-8-cpu-server.example.com 8/my-8-cpu-server.example.com
2/my_other_username@my-dualcore.example.net 2/my_other_username@my-dualcore.example.net
# This server has SSH running on port 2222 # These servers have SSH running on port 2222
ssh -p 2222 server.example.net ssh -p 2222 server.example.net
server01.example.net:2222
4/ssh -p 2222 quadserver.example.net 4/ssh -p 2222 quadserver.example.net
# Use a different ssh program # Use a different ssh program
myssh -p 2222 -l myusername hexacpu.example.net myssh -p 2222 -l myusername hexacpu.example.net
@ -3207,12 +3264,23 @@ lines. Empty lines and lines starting with '#' are ignored. Example:
6//usr/local/bin/myssh -p 2222 -l myusername hexacpu 6//usr/local/bin/myssh -p 2222 -l myusername hexacpu
# Assume 16 CPUs on the local computer # Assume 16 CPUs on the local computer
16/: 16/:
# Use password for authentication
user:password@host
# Use $SSHPASS for authentication
user:@host
# Use $SSHPASS for authentication and current username
:@host
# Use password for authentication and current username
:password@host
# Login in as bob with :p@ss:w0rd@ as password
bob::p@ss:w0rd@@host
# Put server1 in hostgroup1 # Put server1 in hostgroup1
@hostgroup1/server1 @hostgroup1/server1
# Put myusername@server2 in hostgroup1+hostgroup2 # Put myusername@server2 in hostgroup1+hostgroup2
@hostgroup1+hostgroup2/myusername@server2 @hostgroup1+hostgroup2/myusername@server2
# Force 4 CPUs and put 'ssh -p 2222 server3' in hostgroup1 # Force 4 CPUs and put 'ssh -p 2222 server3' in hostgroup1
@hostgroup1/4/ssh -p 2222 server3 @hostgroup1/4/ssh -p 2222 server3
# TODO example with ,,
When using a different ssh program the last argument must be the hostname. When using a different ssh program the last argument must be the hostname.
@ -3221,14 +3289,23 @@ Multiple B<--sshloginfile> are allowed.
GNU B<parallel> will first look for the file in current dir; if that GNU B<parallel> will first look for the file in current dir; if that
fails it look for the file in ~/.parallel. fails it look for the file in ~/.parallel.
The sshloginfile '..' is special, it read sshlogins from There are 3 names with special meaning:
~/.parallel/sshloginfile
The sshloginfile '.' is special, it read sshlogins from =over 4
/etc/parallel/sshloginfile
The sshloginfile '-' is special, too, it read sshlogins from stdin =item Z<> I<..>
(standard input).
Read sshlogins from B<~/.parallel/sshloginfile>
=item Z<> I<.>
Read sshlogins from B</etc/parallel/sshloginfile>
=item Z<> I<->
Read sshlogins from stdin (standard input).
=back
If the sshloginfile is changed it will be re-read when a job finishes If the sshloginfile is changed it will be re-read when a job finishes
though at most once per second. This makes it possible to add and though at most once per second. This makes it possible to add and
@ -3820,7 +3897,7 @@ characters that have special meaning in shell:
and depending on context these needs to be quoted, too: and depending on context these needs to be quoted, too:
~ & # ! ? space * { ~ & ! ? space * { #
Therefore most people will never need more quoting than putting '\' Therefore most people will never need more quoting than putting '\'
in front of the special characters. in front of the special characters.

View file

@ -219,7 +219,7 @@ par__environment_too_big_zsh() {
bigfunc() { true; } bigfunc() { true; }
_EOF _EOF
) )
ssh zsh@lo "$myscript" stdout ssh zsh@lo "$myscript" | perl -pe 's/(\d)\d\d\d\d/${1}XXXX/g'
} }
par_progress() { par_progress() {

View file

@ -309,6 +309,308 @@ par__test_cpu_detection_topology() {
QESAkg8EKmp0oA== QESAkg8EKmp0oA==
' '
} }
cpu20() {
echo '1-16-24-16 8*2 thread + 8*1 threads Intel Core i7-13700HX'
echo '
KLUv/QRovBQA1tU+IGBJ2wa2Edh2H/3+WsW1pqAixNFSp4VaZLdSOgQfA5ACMwA1ADcATO1J
9EsI6f//P65ZU+hjFfNJ/bjGHYG/E5T1fjgw67nF/3R4Jh4lRFYqGeWTyiMq/BEIRzMLcSll
MmYi/f8fDUCTQkVJskcZ+lAaslKJEP8prdALhBKrIvJPI2wxTemkKk5olUpnsQSNKZxbBkJh
uGYt4OqXlUDMvEYrDVOaaUTBDHBAs6G5oxuiKQesjP////97aV5qAGri/s+1xDAC660CxMVF
RCZAxJsKsasKF3U1AHd1d3kHEGpyrx3TCImFwklRtNces5ZkseYaZGFFzWsK7a2AmKiRPXJO
KqlbDfEpEZFQJLhbB8IghCFwEAKFQCGQCBCChOCEgCGAWAIGQUgs0UnQHvkF5I1sAHsvTJ7A
AGRPNiCSBWsM52rDCQxIqCQbkNApE44xYKA197ncgKvAutKr/B+IPpINEElNJ5AiG4Cclou5
8J8AS4lsQB6JPgIHDWpmA0Sk5AT+ZAM2sSATlH8C5POxTJkTGJFsgFuWjvf1b2BPZANSrfcJ
GDLN0pjgfzgWrI4mgKNsgDRVa3zkGkDKApR/Jhk4O2DxmQUk0WP/1lM2AMmLMQRKwEYoBQb8
KbIBEcYCxmL4P2B9DY1mA4QQtuQHEKeFfwABJRuwTEilSAhuFLDAkdb+AZLHVgxx6dWa/Qtk
N0Y3mtsO/BuQ+8jCuw2QSNOLVv/7MTot86SAE4hp/wQyGVt5GJAxJ3Akc2qA+k8QU6DHG5A1
b4A9E8wAadiAgPRfBgvqw1NEHw+Rd7niiOh9A1BDgeeUD5Up9DA1OE294FobkNYD33PioHh/
2pMD5A+IqxLZIL/q7PSBufVmTvj9NesBVBkAFhZGIyBt9QdgK3tKd0V32uDanf4OMNiSD7xk
5IbsZFOFhgAErNEWPgBCADYAEA2SBUVArGq6ssayWDSABD5u7RvZFZA8KmhKEgmDsMs1xw2T
KNgLlT0i2HXo7u7m2pFZ2AXxdLd3NzMzR+fx4XPXFIUVRrIyDJIm5ilzdCEQaGIFRgmGEWDM
Z2BaAwKFda9rRQQQGoUHwT58zTwHdS7MDEECg4GxUDDA3v6l6AbN2SnjP9fcnne7a8Vp6JTP
NTvxcXUaW+mU8eFzJ22VrznK+PB543citHS6a5VOGd81t9PYSmX+7WFUcXfj1yBVUX9fEgU9
OKBIX1TDuo7nlgnqPm7kYgrHVjr9NdO9UthTxn8K9dj/HLrW7Da+u4ECqEFliaQgSQrLATEe
EQlEZKKZIR7ymA1CgDAERFghwolwQoQRZIgACYgWkFE9/QM2CGQDOsiJnANr7g5ovHPAgNeM
yAbcqxcMZEA7swQGrPnKBnhIOC9iGEtKYMDGvmxAPskwjn+NThPZsvDvv0OSDCdHAygb+XPA
gI5ykbXY38YAKgQxIEs3YADOg9kApc+GAZU8SADc2X/mRn1K1htQSN6AYuUPG3A4wgHZfmTV
xJfQnkS4NyiAc8RyXRdcg1R8rgA7cEN2KL3NHx35SpPlfRx/fC56N4jc0HL6q7AmXUp4g7Cs
52wbH9HIHRuVG1pyXEDU6I7TUM8PAdtJoFW/k+UQqPzYKRtASqMG5NaiAQNl+tv27Is9QmWY
A8gyvO86Z2PbC+ny4ueA2+9/QO7Pw2OmxPsXEBjJBpQTpWXgxMYaAXebDbANhjOA7HoMyCbe
f4ExImUDJPMoAzQr5eRFHlCb3IBPGnUDhjmgu2wABK3uEzBeNuDnqZ6RYPoHoEFfNkCLUYEJ
AHM2QExancC2sgFsVMFaAkQrG6AdUQPI3q518k8QqF1+b5ABFnACAJENCL5AJxBWNsDHUsoJ
SCEbcFPFOgHrsgFSpWwAJA6w0VuZdgIDyFFlA3y9ik4goGzAL6cYnMAAspuyAdqjVicQmtkA
qYl1AqHIBmzUamODwD8AUm7ZAK0zNfCEQiILdCUAFmFfHnCneWH/aQdtNzCN2HS1uy0AYvIk
0ZZEfjHP/68gAlUAVgBYAK8qyWkpIVx+rMdkmNFolV9nw3V4LumX3qA5T1PJolzYvimq8l0y
RvS2pyV3tt22e5pxDkCM9bTinLXWVQndAkG8GekQOWhdqTCSSgpKlVZaCrp2wwdOaQTGZ+f1
nvLd0EsviIPXZs0KqfP1DjrrmCrRMmeV3/S0ZZ9tirMHEjpPT5+3RYlUTjNuPDitUIr/mz35
8FS6PY3gHeOSoBtPQ+bBOAyQ9rkqE4UOAUjiJZUxOoRw9LUmK/F29kvXKNpU6K6fFgxZzMG4
iPG2CQO6TxkJyN4bXGwdtwKlXQyo9KSx4blXODz3tzCZFhHrBAhQP+d/Wjr6uqTbHxUMEDAG
JUwcIRG8GDNGEhds8HFwwcyKmTFjDiBwwQbzwQlZvBZDbCDaI1MoJR0p3a/KLVjXOKUxIAdT
c7lLMhmEaAKqLBKt8p+zsz4CchQOAquRyqWS13/9DQt24eIIgTSowUE0o0mSDAehHKFFiCk1
wcxM8RJZCsJojMUIiCFEGCECJihGGCFESASECLAJXKIH/YUqGwCaaA/c/wLuNxvw3Xwmo2eA
zLIBs3F/YAFNfsuAAU3KLhtQmaTony9gDCj07Ro8ZwALywY46Pw0Z2SA2LIB0vk3gFwIDoCP
31HDDLgo2QDB3DROygCJZQMIWkmTU2aAUNkAxxw6iFyogEuZmA0QjKZp0gyQUDYgprFoIqCJ
ehkwoEmdsgGN7cdUQBOlZsCAdJplA2bsfoEFNGlHsE7/BQSajLM8YOffxAPGgMJEGwNCSIKA
Jo9uKv8FQFEpG+Cg4RMPwACBmg0obtiaTR84oLfwCQZmgKBmAwYyPqDJbwU06U5gsMEBviSA
p13AuLYOcKJKwAEVdGl1gIrkgGkLPB+shSG9b1VrLDrX4kr4h1FzugTt44wvWYTNg8g2zkNc
fhx9k5QeLOoReNSCZSgi3H4a9uuauA5P0+GZy32dy+wbaiX4IDt64wGNr5KDPHQfTixDq2D9
l7tKKjszNfjOtW4fEThRwqhL29XQijxBLkr3MqAMgLo//Sxev6BUWNqODBkqlrf3v4dGl2FF
Uhudv0TuCaQ+qDsKIeP0CldnytmhiLeK+uMwjp0RGe3aCG7PtuzqtyyeVEWpO/Nc6h0/fCvp
5PKlNYrnOzwPQj7UVuQJQ8u6rGz8ycJuAuFioG9Awz9p/1z43YIDoRKufttsF8b4bi1cME7J
vbpp3JPotCqwgfroGGli3KUtyxzB8ir1CqUKUI8hkKjCTdxSRtpRNqU0GijChJSoafhtPdDk
TEwNUZq3e9Fn7ZheVqroWorQ23S2yUe5f24v0bqK6fegbZ2+301SAxSNmO1xBEn9ipH5yh2B
jYv+HdH6BhD51xkQpFzf3zSj4rC1DphWIDsGKJBuQAIzXpkgyv//EXuyAWn0lqse8LP1vauL
HDCAmI5sQBR6AhJAjlCBAd+8kQ0I4HZu/gNGvsG//9hFZAOshfFIDEj0/ydTlMAAgUfZgJ/p
MAFY+B5AouaAAZR5ygZse3nNA6KKAwa8+lo2oJTuBXAU+CnZHH6za3wKADQCOTk5OTA5NjY5
MDEwMDAwMDAwMDExMTExMTExMTExMTExOTFtqHB9wbH4kSJzeiIQCAIrOAT/IoIThKAhmGUL
QEVgfP2HygbYUgUZGYCXDZBsd0CTrAQ0qeC4b4ApJlYITLMBU9kACGChCfyyAb/qyt5T/QPQ
QJUN0OJyE1jNBshSwwRg2QC2a/XzDAAtG6D1SyybAQOavLIBw46lTCDKBnTnK0xglA3wsReb
wCsbgM6saQLhsgFSWW0t4gAbAvvRBAaQpGyAryw2gbVswE8sTRMYQF6zAcRDRROIzQbIUdIE
PNmA9bBZywCgsgFaWeIFGTCgyVs2IE5cQhMYgMxmAwap0iYQyQbEzLAB5EMwIOLzv142AN31
u0imxhgwZ3FcYblvgFfSlZQBjmQDpO+pkQG/bACYFtWdGQCUDXBkCFFfBjizAbKujOnOABJY
TAwA0kQKC7ClOYCkkd0mTnJyu6HdsDECG3Z3ZVfB7m4MRQiJzaTJnrQ3BTMx0SJ5qDDR4YEx
EV5BZsp6QggoCBAE/zqChCJwCFYInKaAMxof/WGzAesprGQAuGyAcH9tBuBlAzqoxQVdAKTZ
ALHZmgHHbEA4yNoZQCYbIHhdkAF8sgEEuvVghwIgIhuQnpsZcFc2AIrcXc+AAVe9bACDtDsZ
AMsGRB+4iIADZM53ZYBaNiDAv/gf6AsBBzTzEw94RK2u88HXTDJgmA1Iub8BTVQtoImMDRhA
miIbkAgaUIkyBQb8BtmAgAVOBlgNJjf8+w8dswHodd4CmpyRwABhzQYQubKWgCbzDRhAoSsb
sJ0kNgFNUBsw4JWybEBpWFI2AMYANNN5wCnY2+XBfwGeY/MAAjKKJGCibICHiCmgyVkSGLCs
sgHv4AQrgTGggOraPQPUsgHYSpeuGOA1G6BkT02gBQfc3vctGcBZNoCUeS2Qi4CAXov8wdcU
0GSVAQOayJINKJUfwDqhIQJydAgAaDE2NDE2MjM3MTYxNjRxuPA5kgl+heD/f0QBZ0CID/2D
ywZoZyFkgJ9sgFvaKE5gAOkuGzBT7EYG5GUDfGihn8AAcpQNYCC7yoBM2QCJkPXEATa1hRmQ
KRvgYytmQFg24Oe2zgCxbIBWLK0TGIAkmw0Q1c0ZwJoNmFRtyoBUNkDL1mQZgMoGmPiSO4EB
yC8bELR2ugwAlQ14qEm9KDAgaTYAH8WdDCDKBuT/XQtwQEW6zzMAzQasp+qlDLCyAcJuRRmQ
yHwZM+BiNkC2QhkgMWQDlnZwBnA5D6ChczgD8kM2AJBlyIBsTzYgYZNkAFjZAChmP2QALRvA
YNYpA7KyAZLja0qAA/SavM4yBG0s7AkApAIxNjYyMTYzMDE2MTYxNjU0a2VybmVsX21heDI1
NTEyMTIxMjEyMTIxMjZuuJBX2wFCCX6E4BGCE4ITgp9QgBoQ4gPRAQAKDEjhO92Puo/dj3c/
0/0B2ra8T67/AsrMBsiDNxgwNvqSbxemDNiYDVCgVlUOGECgsgEV0z4zA0DkAdekms6AbLIB
Np25EhggjLIBv60hBwyg6LIB24WV2YABrzMbULpaFSDAGNDFt7ocMABWZQMGrHWSAWXZAA8t
8QzIlw3ItSPJAG42wFGqwzOAXzaAnLYjGJCbDVCCXixwQEzGjQzAmA144rdrLmIscPpXG+AM
2DIboE7r5wxIZQNsyDozIFw2QKJ+9YEDVgx7kQHpsgEQtjEzIJUN+GHrnAFh2QCtWvpPYADp
zQaIrv8MAJcNYMvl9QQQBgKkBACUAzEyLTExMjEyMTIwMDMxMjEyMTIxMjEyMTIxMjEyMTIx
MjEyMTIxMjEyMTIxMjEyMTIxMjEyMTIxMiWokILukbd/NhH8/zsE/9OEyg/T4QT2bT/uh+/h
J6Dv30PiBAYg+W4/3mc/7of7YT/sB/thP+wH+7Ef7Uf22Q/7YT+oBdT3/Xg/+P0wJmhD/gnk
L9pL4faE/AQAdAMxMjEyMTIxMjEyMTIxMjEyMTIxMjEyMTIxMjEyMTIxMjEyMTBjMTIxMjEy
MTIxMjEyMTIxMjEyK+ih53epAxH8/+8Q/A0BKTDGD9UDSmCAhHeDAwZQhnc4wG/0I5ADBrz6
Zj/eD/vxftyP7NsPuBy9WPfvh/1wP7pvP9wPv8dOgG/7YT/0PXwC+P49OE5gAEvf7Mf77Qfe
o3SCDgoBzAcAyDEyMTIyMzMyMzIzMTIyYzMzMzMzMzMzMzNWqKA9gVkSO9HIzLQdMgi8jcMZ
gv+fggimCEhD6gf8BMJ0AWjA0rV07wPIs6s1AJKGZO5hiQZg6TprgCQNztzD5ciAARx5poGc
wACSpBHLGTCAKmnD7uGS9fwXUF4afgxIwfz/R7i0/YDM/caXAQOeNekH97AGq/D/H0yD95sB
A3BW6QX38LDOgAGNUJqGJgMGeENaBfZv/wRglnbgHrpmQKAs/wn8SUeaDHDp7QGv7gOKF0gG
EJUNIOpd+cABrghiKB7wmxsAEvXsDhDiX4PwST+wHDCAHL+TPQgVBbIQ5AYAdAIzMzAzMzMw
MzMzMzMxMzEzMzMxMzMzMzMzMzYwMzUwNzMzMzIzMzNTuEB9EvjJBP/fEPxMAWho/GUDct2s
AcSyASCAdzSAWDZg1/grGxgDDtBe+MAB35JxNABnNiAMi1VdJOPeLWB+SwOysgF7eK5rALTZ
ABCE/RpAWDbAce5CAwfUQ8anAZAO5Hv41wAoDZwAkab6PeIyAEzH1AAvjU6AkubVe1icwADy
pXE1oEl//x5EA1j6Gu+xIwNoGjgBQprF99jQAJLOqQFeGp0JDEDGtMrvMf7RMG+DAXwKAEQC
MzMzMzMyMDAwMDA1MDAwMDAwMDAwMDAyNDcwMjUwNTAwMDAwY/giEAQeghAoBAjBRwQjBCME
qwpAQ+YD/QeUDXiW8WcAubIBXbo2AwhmA9bEuzOA2GyAqHShAhyga4wHaGRnAOCyAYYm1UIJ
GFVVHmTAAGyTywYsutcA91OoEfwTEEjNIGc2QP7tDNDKBuyaWGUAuWwAPYiPDCDPA5Ig1mUL
+U+A2GU2oEIwMwCusgGxcOdeAf/+oWmzARbodgZgzQMGM0MggAPo7DhlANZsQD3XR+CAixBD
GDiAAhUP0Mjm9foPQdkAnFTdgIRc7o8wPr8gXQjGgOerauWAASRWNmAYdIcGEMoGZC13aAC5
bICeqEFaAgNkUzbgi8XMAQMoUmYDCqYKlQMGvCTLBpSCmxmAYTaAQa0sBwx4dZsNMDbb1gCs
sgHeXtKAMAYDJAkAFAIwMDAwMDA0MDUwMDAwMDAwMDA0MDUwNTAwMDAwMDA0MDVb+BL4TxD4
EQQUBH5dAWpI/P0AZQMg8G0GYCkb8MPrGUBYNkBLJm8CA0heZgNkbmeA1rIBbIAzA/DLBmiF
ZQaQygaYCZNjAgNI/rIBCgVzBsCWDfDhS7sJDCBPswGKXHdkAGE2QFSDr4gDbHBcGYAtG+CD
1zOApGzAj67NAFLZAC0yWRMYgOw1GyDrPgM0ZQOg8rEyAKJsgDZjZwB02QAzYoBNYACyb9mA
F8CZAXizAT24G+bANP//ZW82QF99NwOoZgNqoK9G4ADVBZ8MICwbIBu90IExAD7aPQMQZQPY
smMzAJbZANnXKxgDJHFcZAC0bEDkIV4GIM8DkrBNAEyDEjwKAMQCMDAwMTA1MzAwMjAwMDAw
MDcwMDMwMDA1MDEwMDAwMDEwMTAtMDAwMTBjMTBkqFB5A+G1QOIkFBkasQNCCLyMACFQCF4h
QAgSgh9QABsqP/xj+qZ/BcD+0qm9e/xNAy4NQA14abvrEAr9G7Dk0j6w3EN5GBv2H4DckNax
BjDpFWGAuQ/AJgc0YFo2QJCvRnDAKOTXInCA3cVlALk7ICLpGzCAEMoG9IDHTIEx4AmHEwNG
swHsuk4jEhggqdmAo29LtQEDKOWyAdv20mzAgFfpsgGl4FoGCMMDfj4CJSQwYDOzAUB69zNg
I2UDvGghA7RlA7LHjQGx2YALP+YMkDcbsIu+iAGk2QClHisLHLCtcpsBu9kAxz2v0jUA27ZA
sf0VyL6FDAiWDYBE48qAfdkA27oaNmDA9pUNkPw2ExyApFvf8EkLAYQHAHgwMDAwMDAwMDAw
MDAzMDBWqMAPwcl4JJoJpDYdEmAwCJ4CIgn+/w8TYAbG+AH9HUDuzQak4LWoAWfZAB+1MJ3A
AHIvG2Cu71oDMrMBUOA3UeIAm+SyBpyyAb7HhQZsswHkK1ppAC8boP2WeAIDkGezAZJhhcEY
0I6NRQNYswESXFk1gOE8gBQpuhMYgIyXDWia32rAqmzATrIIJzAAeSwbcIZL2jEGzMOcmd+A
GPL7GgBJQ3MPEdcAKk0gGkCla9zD3WaAn3ZaDbDS9qYBLt3ygIh7RFIDKK0yNECkWzZAdwaq
AUB6iHsgGpBDBrysBoQKAGQCMDAwMDAwMDAwMDUxMDExYTEwMDEwMDAxMDAwMDAwMDY4ODg4
ODhmqHB7Aar4ExkqogciCLyFICFACBSEQCF4hOAtBbyECPzT0ywDbjoS431AGrM4A4yyASbC
kJu1AegnMC5wQLFo8IA9VMABU9u3NYDMBmTlr2o4YACZzAaszLHWgKhswOlzLwO22QBs66a+
BAYI3mxArFBxOWAAhS4bsG1acAMGTFjNBpTaew3YwwNKKqcwDhjw+poHVK2hNWBTNsBTVzWg
QB7AA4YgEBgD5IzbGlDKBviWXGbAYTZAqdQFCBzAOO5qQKFsACmAi7h2NjctDXDA1LTrGhDN
BmgMrGjAUTbAhi9kQGQ2QDfZxQUHqONc1YC7bABEuNKArWzAz1/TgLhsgPZe1icwgHQyGyDA
rgbAZgNcg5UGRGYDJPitaYA7D6ARnfkEyHAiWCwGAPA4ODg4ODg4ODg4ODg4ODg4ODg4ODg4
ODg4MTg4ODhR+BL4IQUOwd8Q/NsEgCHyA/0ZkMdJswGi3s8AsGwAYIEtA6LPA0CgDRlglQ0Q
8GaAJjAA+Ssb4CbgzYDasgEUILf+kPJfwB2aDUiZcvGCMcDP5UXAzuIz4NMf9h5JDFhqTQbw
tM7vwZgBm3bp9wDOgEwDzHtcMuCnPTIApz3L+4D8FmcApzF/D+AZsGmHvQfX3qMxAz7tMANg
2tB7KOA9LmuGLBkIHAgAVAI4ODg4ODg4ODg4ODg4ODgxODg4ODg4ODg4ODg4ODEwODg4NDg4
WOhBsvidkSluEviRBDcE7xDcELyeADIwxg/9A2UD/omfAemyAdsHl2TAgMpSLBtQei4zwGo2
gMD1Rmw8/wV4e80D2oAiM2BBZQM8a5MB9rIBmWPJALdsACEMMwNeZQPyF2wMUDIboNTwgK68
M4BkNqAe0u1cQ5nsAUnmAZVlBlzKBkxEWBkANxtAwr+xDBiQo182QELHA9CG4Xtc8R7OZMDT
ev49GPse7jJA05oZ0NN4fo8w/B5bfA8YeI8DofcB+b0UFowBZxXXDICZDbDw3WWAwrIBWq8E
oVgbTuQJAJQCODg4ODQ0NDQ1NDQwNDQtNDQ0NDAzNDQ0NDQ2NDQwNDQ0NDQ0NDQ0NTRg6DGe
+BEJRITYAyII/CMIQAj+/1EFuERA/PzpPID9s2IKcMAOVCwZILMBGR5d/MAY4EHBmgGi2YDL
cSUDlswGyN/IACsbwHbhzIDjeYCYJjgDWtkAIgo3A9ZmA6z+ZQYsVjYA3i9nwFo2IJ2GOQME
KRsgeZcUOKD2xMyAbDYgw77NgMVmA1jhrzJAaNkA/WMgBURfmA2QfjcDbDbgoXk/A75lAzoH
QwZc2YCf4bipFzBAb4/ZACjv2wxAygb4mSR2KDAguNkAlP67GQCaB8ROP7EABzSp2DJgWTag
s2F64AC3A8wPHDDIFA8QIgAHECI5MmDMBiiRbjPgKhtApMFkQCkbYOUVRoIx4Co3UhJQQRzc
CQBkAjQ0MDQ0NDQ0NDU0NDY0NDA0NDQ0NDQ1NDA0NDQxNDY0NDQyNzQ0YugxnlDiERksqQMi
CEAI/v8IwQnBmwpoQ+UH/NBswMcpxgyQZgOaDS5ggGQ2QMn3NsEBt3Q7AwLMBvQZb3EdNXH/
urGSrGfAl9kAjOdeBqSyATaMCQPi2QBIoMUFByAf9gyILBsAIfcZkJYN+Dl2BqRlA7SAsTKB
AWTebICE+xmgNBtgDl3PAKdsgHawM2DleYAl9LE3gQFkYjbg/K5lAGDZAB+mu0ow/gsoDrMB
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
Gnfd8IITzjZAXQ==
'
}
export -f $(compgen -A function | grep ^cpu) export -f $(compgen -A function | grep ^cpu)
test_one() { test_one() {
@ -472,7 +774,7 @@ par__test_cpu_detection_cpuinfo() {
' | unpack ' | unpack
} }
cpu10() { cpu10() {
echo '4-48-48-48 Dell R815 4 CPU 48-core' echo '4-48-48-48 Dell R815 4 CPU 48-core Opteron 6174'
echo ' echo '
KLUv/QRYRSEApj+vIjBLLADDcJR4ZOmSMcbRLoFyVLE7QWmYAUkyhG4uXRgCwJ2sAJ0ApQDz KLUv/QRYRSEApj+vIjBLLADDcJR4ZOmSMcbRLoFyVLE7QWmYAUkyhG4uXRgCwJ2sAJ0ApQDz
j2zYCFV5LceJnYZVIM0Qb46jYRWIevMJ5ZWQjNJCjmp8w8bjkeeoRoStN0cvIDkTshH1CaNs j2zYCFV5LceJnYZVIM0Qb46jYRWIevMJ5ZWQjNJCjmp8w8bjkeeoRoStN0cvIDkTshH1CaNs
@ -671,6 +973,32 @@ par__test_cpu_detection_cpuinfo() {
zdoA+1KxJ8/shJsDnYcJTIaXxS7ju0nnln2fbenY0DSGz5+q zdoA+1KxJ8/shJsDnYcJTIaXxS7ju0nnln2fbenY0DSGz5+q
' | unpack ' | unpack
} }
cpu20() {
echo '1-16-24-16 8*2 thread + 8*1 threads Intel Core i7-13700HX'
echo '
KLUv/QRoXSEApjqgIyBtrAMBfUS1S7lyNhBkqR+VRby1HGkcIfAfpUMCoQwIwQaLnACNAJAA
LX4Zn3Z86/pt/rpvlN4QgwxJGnClhXdPzld527SrNxLxc8heffK1xyxR1NLZEqah89q9Q9Ze
Rx6cIDR8oTAWS8Xr76OxliwWiwJmsSgVCw7PtG62SduLCSQf89ZOIhYWC8aiCBjvAg4QAUtn
wgUeAv6oy0YmvzQUAFw3Y9JE4IvsecQtgVslw8oXyVVwb9Hp5ErJ4gcAdHZvm5QD7BGu58Hg
6ewn0eXI404y6uhbo55PEvtKrKf3stONr66VDzq2rsrGk7+OMl1Ri2nU1M7i82W7+1OUTuEo
YBRh4z/JPOUXOuzBpSsCTTh51umQp7ybE1q8dFXJasvZHuG5dXX0DqSWHX+Sh5C1jvTr48p2
n/b0fIrxj47gA9ubpTK+NGM7g2iN5+03pvYNz2QRKOeaDpLeVx98DmPW1qNRdqfg+lY8yB7d
PmUL23LxkfZzh2kefc49dlSSHujQBNfHIOcXoz8ppdVKcupC09uTiz36DqTyZBb7k2N3u+3o
3WssyfeOdK/wxr6iXnReO5JgTkP93LHlHkuvvH9RSodMxx69KNe7bZI95K7ad7ip8+6c7j9a
3WcpQ6Z0y6MTi6IopShFUZTicKiGo6EYDNU0GmVgoBgGo5ZFKY2ilFLKQDkcjkaDaTAYjKZZ
GgMDA4ZRmGVZFEUpSqkkOViISRZPFzI5gSyq9EkN5gPv+pw7lu6lzrEqN0roQbaYJmksGoZf
nNB0Eof3bhc6dekbYgbpdzOOOLP2UpS0lta23JGTbEeM16IdnbVuO+1yK4KW29oerb1URpSr
9Lr9BIC6qNFchZCIzIyigjRJY6BGpmY2qTzCGDnKQIgREOGOCktK+F8YfS50VI64g4N04Kg8
wInlxaHDRjUodp8qTXWAoFGlc0zWvXk6ZFSjsvLs62BRTbqi1eWjw0Q1UlKejQ4Q1Uwn6l1+
dGioBiXn2dFBoZp0RKvLR4eDaqSkPBsdCKqZTtS7/OgQUA2K5KWq7+BPN+2nuKBefqrnIDLj
iTm8vZ1dZg5XJf7nQHBS2u05gJzxxhxubs+uM4cVif9zMJiEdvccRGY8jvlTHW4ZohKA86Ij
DK+qoBEOH9Hmb2hZJ2Lb0GRu0CBoyN9SBHNF0+Uszf2tI5lNzcDMQsaCnrfMOgES0v+PL068
ClabXlc8ZfVZ/G2Uif9+TkhUoBF51BvM/Tmub6WUJCRnc4PnthtuTLgx9FKSPYrKXoAnGonL
z2nQFnlhUcsxIwOg1RuiG0BUVysNdZjqnh7tS6AoqOj91PaSDVJOM9idASBdOsPlC43ACeGN
/1hXPh2Qq15MEmKDLoOWe2EE2Y5kjHpuT3nZY0+6YFB4UM/bW+9xShBIaCbgxs5hglN9t63i
' | unpack
}
export -f $(compgen -A function | grep ^cpu) export -f $(compgen -A function | grep ^cpu)
test_one() { test_one() {
@ -793,7 +1121,7 @@ par__test_cpu_detection_lscpu() {
' | unpack ' | unpack
} }
_cpu10() { _cpu10() {
echo '4-48-48-48 Dell R815 4 CPU 48-core' echo '4-48-48-48 Dell R815 4 CPU 48-core Opteron 6174'
echo ' echo '
' | unpack ' | unpack
} }
@ -951,6 +1279,31 @@ par__test_cpu_detection_lscpu() {
jAKUQ0da4Q== jAKUQ0da4Q==
' | unpack ' | unpack
} }
cpu20() {
echo '1-16-24-16 8*2 thread + 8*1 threads Intel Core i7-13700HX'
echo '
KLUv/QRoxSAACkYADCkAb7g52NOaaG9pWWVp1EK7UMah1zodCwjsgmz4tfgH/PMzcUVV1Ypq
XsoAswCsALDiYJkWExTubWeGpVgcGJDHJOIB4lGeZGEwGAIeDEcjgwMIhuIWQu3JUsEBg1HA
wSwK7ANATDyABIBD7YhoS3eHA3Om60EskArbls+13YO6jZw2UPDw+JZTioWZLA2m9YJ6rPEl
WBpPPSpcqRGaWByNBaN52a9u2cJJWB4NllHHlRweb2CplisQPPc6N+BgzbB8Zo1rIVhc7nIL
rqx7ITwSdUUJ165IlgfkDb3OouEIwAB0vbaA7xMiEiwPSANxmB7RGLXSXkhFBAFR2+2DbxqO
ujGmc6bArOABFfhUVI4ijHSNDdtTSvnL5VmrCJ8rfSlzknddMrlK28miCHPCinONr7nisSeq
9H5BZXO8UjiZSEgevlS5hNyCH6BsR5Yqc1olIsqy+W9bxFW81Uwf4QXxNANhoW0WtTusH5a2
0ufJ94vAYEt+dq5HhTobvNLL1smojkUUDIcD4gSYNx4OjpXsg0MKEFBIpfpiICyMRQ+s9Pt5
/KJaCOnx8UpRA1dHeq0xvcE0DwgzqWd77lBm/tSkY1gYWNSYgl8HvzaCCj73ZRqbCuWxB19P
Z/C5r/coDdTYtMvmxg4V94p3KIzCBT+5M5aKK/yGzvyGMj/y9Hxq7RBH7GHqEEcnvPSaelLg
Y+x2qHy1MO8wqatq14SP3K64rwyv69qkR/BhSjIGkY7PyStX4fzEExFeTlTlNMKgfAqT60IS
8Qa2zyUTiTew3OWeuiSiodHrkh8L68JUDaRifjGsuW5UfkxlqlntLfJz5wHZuGstXFE6a0pf
91BOuQB7s+JwW/R1TmqYkZxWynS1rkmI71Qw9YYPZuNPK79UecWvVVBye25R34Da+A1mm/Pm
yMJK5XSYws9XNmuh9Ib6bU56xVsJcRNhawOdbb4DnT1HZ78c5kOq9dEIK55bjjcn31jzQMmg
uOIVhHk+SXmVkqez5qO27UbdspW62in4YHIgYERmjowe25gv0YehmrYtSaLMaue6Xrq98nOM
A9QCXR3V0KYsBqQoZoiPwlh8RKh53tWjZUWprL3ylrQqiDDDEOLRHq4zbGOme2hNMCsEsvau
NZ2Gpp8FwUqjIVkwEVPnY3oMBhKMUQovJOAE4CGPdWW2gBUTV4IWBlsYWq336+m8y25XUgDk
+1MagrMyTOBdQbB1LmQnbQg+hAOIe1MTg0YdmQGAKxJdp5XfnAXE2YPnHOLYNN5HwIAhVCzv
Ee3uHiX412tBGQsaMBQgI5jVwZ3ghBsvbgU9Itz3kHVkyyKMcCSaWmvuTPAX+ghFcAWSqC+G
KC9ROWX9fWoZ7C7CNABXLKPG2LjX44E/rCicwihACaxZnTc=
' | unpack
}
export -f $(compgen -A function | grep ^cpu) export -f $(compgen -A function | grep ^cpu)

View file

@ -26,13 +26,24 @@ par_sshlogin_with_comma() {
} }
par_sshpass_with_password() { par__sshpass_with_password() {
echo '### sshpass' echo '### sshpass'
. ~/.passwords . ~/.passwords
echo OK | parallel -S "sshpass -p $withpassword ssh withpassword@lo:22" echo qwithpassword=$(echo "$withpassword" | parallel --shellquote)
echo OK | parallel -S "sshpass -p $qwithpassword ssh withpassword@lo:22" echo
echo OK | parallel -S withpassword:"$withpassword"@lo:22 echo echo OK | parallel -S withpassword:"$withpassword"@lo:22 echo
echo OK | parallel --onall -S withpassword:"$withpassword"@lo:22 echo
export SSHPASS="$withpassword" export SSHPASS="$withpassword"
echo OK | parallel -S withpassword:@lo:22 echo echo OK | parallel -S withpassword:@lo:22 echo
echo OK | parallel --onall -S withpassword:@lo:22 echo
echo '### Crazy passwords: `date>>/tmp/trap`;(|<*&)'"'"
> /tmp/trap
(
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'
echo This must stay empty
cat /tmp/trap
} }
par_--ssh_ssh_in_ssh() { par_--ssh_ssh_in_ssh() {

File diff suppressed because it is too large Load diff

View file

@ -559,7 +559,7 @@ par__test_XI_mI a9 b1 2 3 4 5 6 7 8 9
par__test_XI_mI a10 b1 2 3 4 5 6 7 8 9 10 par__test_XI_mI a10 b1 2 3 4 5 6 7 8 9 10
par__test_cpu_detection_cpuinfo 2-8-8-8 Xeon 8 core server in Germany par__test_cpu_detection_cpuinfo 2-8-8-8 Xeon 8 core server in Germany
par__test_cpu_detection_cpuinfo 2 8 8 8 par__test_cpu_detection_cpuinfo 2 8 8 8
par__test_cpu_detection_cpuinfo 4-48-48-48 Dell R815 4 CPU 48-core par__test_cpu_detection_cpuinfo 4-48-48-48 Dell R815 4 CPU 48-core Opteron 6174
par__test_cpu_detection_cpuinfo 4 24 48 24 par__test_cpu_detection_cpuinfo 4 24 48 24
par__test_cpu_detection_cpuinfo 1-4-8-4 4-core/8 thread Lenovo T480 par__test_cpu_detection_cpuinfo 1-4-8-4 4-core/8 thread Lenovo T480
par__test_cpu_detection_cpuinfo 1 4 8 4 par__test_cpu_detection_cpuinfo 1 4 8 4
@ -579,6 +579,8 @@ par__test_cpu_detection_cpuinfo 1-4-8-4 Lenovo E540 i7-4712MQ (PROSA stud organi
par__test_cpu_detection_cpuinfo 1 4 8 4 par__test_cpu_detection_cpuinfo 1 4 8 4
par__test_cpu_detection_cpuinfo 1-4-8-4 Core i7-3632QM Acer laptop par__test_cpu_detection_cpuinfo 1-4-8-4 Core i7-3632QM Acer laptop
par__test_cpu_detection_cpuinfo 1 4 8 4 par__test_cpu_detection_cpuinfo 1 4 8 4
par__test_cpu_detection_cpuinfo 1-16-24-16 8*2 thread + 8*1 threads Intel Core i7-13700HX
par__test_cpu_detection_cpuinfo 1 12 24 12
par__test_cpu_detection_cpuinfo 1-2-4-2 Core i5-2410M laptop firewall par__test_cpu_detection_cpuinfo 1-2-4-2 Core i5-2410M laptop firewall
par__test_cpu_detection_cpuinfo 1 2 4 2 par__test_cpu_detection_cpuinfo 1 2 4 2
par__test_cpu_detection_cpuinfo 1-2-2-2 AMD Opteron 244 dual core laptop(?) par__test_cpu_detection_cpuinfo 1-2-2-2 AMD Opteron 244 dual core laptop(?)
@ -611,6 +613,8 @@ par__test_cpu_detection_lscpu 1-4-8-4 Lenovo E540 i7-4712MQ (PROSA stud organize
par__test_cpu_detection_lscpu 1 4 8 4 par__test_cpu_detection_lscpu 1 4 8 4
par__test_cpu_detection_lscpu 1-4-8-4 Core i7-3632QM Acer laptop par__test_cpu_detection_lscpu 1-4-8-4 Core i7-3632QM Acer laptop
par__test_cpu_detection_lscpu 1 4 8 4 par__test_cpu_detection_lscpu 1 4 8 4
par__test_cpu_detection_lscpu 1-16-24-16 8*2 thread + 8*1 threads Intel Core i7-13700HX
par__test_cpu_detection_lscpu 1 12 24 12
par__test_cpu_detection_lscpu 1-2-4-2 Core i5-2410M laptop firewall par__test_cpu_detection_lscpu 1-2-4-2 Core i5-2410M laptop firewall
par__test_cpu_detection_lscpu 1 2 4 2 par__test_cpu_detection_lscpu 1 2 4 2
par__test_cpu_detection_lscpu 1-8-8-8 Huawei P Smart Octa-core (4x2.36 GHz Cortex-A53 & 4x1.7 GHz Cortex-A53) par__test_cpu_detection_lscpu 1-8-8-8 Huawei P Smart Octa-core (4x2.36 GHz Cortex-A53 & 4x1.7 GHz Cortex-A53)
@ -618,12 +622,15 @@ par__test_cpu_detection_lscpu 2 8 8 8
par__test_cpu_detection_lscpu 1-4-4-4 x96 quad-core Android TV-box par__test_cpu_detection_lscpu 1-4-4-4 x96 quad-core Android TV-box
par__test_cpu_detection_lscpu 1 1 1 1 par__test_cpu_detection_lscpu 1 1 1 1
par__test_cpu_detection_topology 4-64-64-64 Dell R815 4 CPU 64-core par__test_cpu_detection_topology 4-64-64-64 Dell R815 4 CPU 64-core
par__test_cpu_detection_topology 4 8 8 8
par__test_cpu_detection_topology 1-2-2-2 AMD Neo N36L Dual-Core Processor par__test_cpu_detection_topology 1-2-2-2 AMD Neo N36L Dual-Core Processor
par__test_cpu_detection_topology 1 2 2 2 par__test_cpu_detection_topology 1 2 2 2
par__test_cpu_detection_topology 1-4-8-4 Lenovo E540 i7-4712MQ (PROSA stud organizer) par__test_cpu_detection_topology 1-4-8-4 Lenovo E540 i7-4712MQ (PROSA stud organizer)
par__test_cpu_detection_topology 1 4 8 4 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 ThinkPad A475 AMD PRO A12-8830B R7 (64g)
par__test_cpu_detection_topology 1 2 4 2 par__test_cpu_detection_topology 1 2 4 2
par__test_cpu_detection_topology 1-16-24-16 8*2 thread + 8*1 threads Intel Core i7-13700HX
par__test_cpu_detection_topology 1 4 8 4
par_children_receive_sig ### Do children receive --termseq signals 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: This job was killed because it timed out:
par_children_receive_sig parallel: Warning: show_signals '' par_children_receive_sig parallel: Warning: show_signals ''

View file

@ -64,6 +64,24 @@ par__remote_load parallel: Warning: perl -e 'while(1){ }'
par__remote_load parallel: Warning: This job was killed because it timed out: par__remote_load parallel: Warning: This job was killed because it timed out:
par__remote_load parallel: Warning: perl -e 'while(1){ }' par__remote_load parallel: Warning: perl -e 'while(1){ }'
par__remote_load OK par__remote_load OK
par__sshpass_with_password ### sshpass
par__sshpass_with_password OK
par__sshpass_with_password OK
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 OK
par__sshpass_with_password OK
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 OK
par__sshpass_with_password ### Crazy passwords: `date>>/tmp/trap`;(|<*&)'
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: No address associated with hostname 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: No address associated with hostname par__sshpass_with_password
par__sshpass_with_password This must stay empty
par_csh_variable_newline ### Can csh propagate a variable containing \n par_csh_variable_newline ### Can csh propagate a variable containing \n
par_csh_variable_newline 1 par_csh_variable_newline 1
par_csh_variable_newline 2 par_csh_variable_newline 2
@ -101,10 +119,6 @@ par_sshlogin_with_comma ### --sshlogin with \,
par_sshlogin_with_comma OK par_sshlogin_with_comma OK
par_sshlogin_with_comma ### --sshlogin with ,, par_sshlogin_with_comma ### --sshlogin with ,,
par_sshlogin_with_comma OK par_sshlogin_with_comma OK
par_sshpass_with_password ### sshpass
par_sshpass_with_password OK
par_sshpass_with_password OK
par_sshpass_with_password OK
par_stop_if_no_hosts_left ### Stop if all hosts are filtered and there are no hosts left to run on par_stop_if_no_hosts_left ### Stop if all hosts are filtered and there are no hosts left to run on
par_stop_if_no_hosts_left parallel: Warning: Removed no-such.host. par_stop_if_no_hosts_left parallel: Warning: Removed no-such.host.
par_stop_if_no_hosts_left parallel: Error: Cannot run any jobs. par_stop_if_no_hosts_left parallel: Error: Cannot run any jobs.