parallel: Cache CPU spec and setpgrp method in file. Startup 15% faster.

This commit is contained in:
Ole Tange 2019-06-25 21:18:27 +02:00
parent ebdc4c641a
commit f8782f43a7
5 changed files with 317 additions and 348 deletions

View file

@ -222,6 +222,9 @@ Quote of the month:
New in this release: New in this release:
* {= uq() =} will cause the replacement string to be unquoted. Example: parallel echo '{=uq()=}.jpg' ::: '*'
https://techieroop.com/how-to-run-multiple-bash-scripts-in-parallel/
* Bug fixes and man page updates. * Bug fixes and man page updates.

View file

@ -5940,7 +5940,7 @@ sub memfree_recompute() {
# Run the script twice if it gives 0 (typically intermittent error) # Run the script twice if it gives 0 (typically intermittent error)
$self->{'memfree'} = ::qqx($script) || ::qqx($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 memory free");
} }
#::debug("mem","New free:",$self->{'memfree'}," "); #::debug("mem","New free:",$self->{'memfree'}," ");
} }
@ -6970,53 +6970,75 @@ sub socket_core_thread() {
# 'active' => #taskset_threads = number of taskset limited cores # 'active' => #taskset_threads = number of taskset limited cores
# } # }
my $cpu; my $cpu;
my $cached_cpuspec = $Global::cache_dir . "/tmp/sshlogin/" .
::hostname() . "/cpuspec";
if(-e $cached_cpuspec and -M $cached_cpuspec < 1) {
# Reading cached copy instead of /proc/cpuinfo is 17 ms faster
if(open(my $in_fh, "<", $cached_cpuspec)) {
::debug("init","Read $cached_cpuspec");
$cpu->{'sockets'} = int(<$in_fh>);
$cpu->{'cores'} = int(<$in_fh>);
$cpu->{'threads'} = int(<$in_fh>);
close $in_fh;
}
}
if ($^O eq 'linux') { if ($^O eq 'linux') {
$cpu = sct_gnu_linux(); $cpu = sct_gnu_linux($cpu);
} elsif ($^O eq 'android') { } elsif ($^O eq 'android') {
$cpu = sct_android(); $cpu = sct_android($cpu);
} elsif ($^O eq 'freebsd') { } elsif ($^O eq 'freebsd') {
$cpu = sct_freebsd(); $cpu = sct_freebsd($cpu);
} elsif ($^O eq 'netbsd') { } elsif ($^O eq 'netbsd') {
$cpu = sct_netbsd(); $cpu = sct_netbsd($cpu);
} elsif ($^O eq 'openbsd') { } elsif ($^O eq 'openbsd') {
$cpu = sct_openbsd(); $cpu = sct_openbsd($cpu);
} elsif ($^O eq 'gnu') { } elsif ($^O eq 'gnu') {
$cpu = sct_hurd(); $cpu = sct_hurd($cpu);
} elsif ($^O eq 'darwin') { } elsif ($^O eq 'darwin') {
$cpu = sct_darwin(); $cpu = sct_darwin($cpu);
} elsif ($^O eq 'solaris') { } elsif ($^O eq 'solaris') {
$cpu = sct_solaris(); $cpu = sct_solaris($cpu);
} elsif ($^O eq 'aix') { } elsif ($^O eq 'aix') {
$cpu = sct_aix(); $cpu = sct_aix($cpu);
} elsif ($^O eq 'hpux') { } elsif ($^O eq 'hpux') {
$cpu = sct_hpux(); $cpu = sct_hpux($cpu);
} elsif ($^O eq 'nto') { } elsif ($^O eq 'nto') {
$cpu = sct_qnx(); $cpu = sct_qnx($cpu);
} elsif ($^O eq 'svr5') { } elsif ($^O eq 'svr5') {
$cpu = sct_openserver(); $cpu = sct_openserver($cpu);
} elsif ($^O eq 'irix') { } elsif ($^O eq 'irix') {
$cpu = sct_irix(); $cpu = sct_irix($cpu);
} elsif ($^O eq 'dec_osf') { } elsif ($^O eq 'dec_osf') {
$cpu = sct_tru64(); $cpu = sct_tru64($cpu);
} else { } else {
# Try all methods until we find something that works # Try all methods until we find something that works
$cpu = (sct_gnu_linux() $cpu = (sct_gnu_linux($cpu)
|| sct_android() || sct_android($cpu)
|| sct_freebsd() || sct_freebsd($cpu)
|| sct_netbsd() || sct_netbsd($cpu)
|| sct_openbsd() || sct_openbsd($cpu)
|| sct_hurd() || sct_hurd($cpu)
|| sct_darwin() || sct_darwin($cpu)
|| sct_solaris() || sct_solaris($cpu)
|| sct_aix() || sct_aix($cpu)
|| sct_hpux() || sct_hpux($cpu)
|| sct_qnx() || sct_qnx($cpu)
|| sct_openserver() || sct_openserver($cpu)
|| sct_irix() || sct_irix($cpu)
|| sct_tru64() || sct_tru64($cpu)
); );
} }
if(not grep { $_ > 0 } values %$cpu) {
$cpu = undef;
}
# Write cached copy instead of /proc/cpuinfo is 17 ms faster
if($cpu and open(my $out_fh, ">", $cached_cpuspec)) {
print $out_fh (map { chomp; "$_\n" }
$cpu->{'sockets'},
$cpu->{'cores'},
$cpu->{'threads'});
close $out_fh;
}
if(not $cpu) { if(not $cpu) {
my $nproc = nproc(); my $nproc = nproc();
if($nproc) { if($nproc) {
@ -7035,7 +7057,13 @@ sub socket_core_thread() {
$cpu->{'active'} = $cpu->{'active'} =
1 1
} }
$cpu->{'sockets'} ||= 1;
$cpu->{'threads'} ||= $cpu->{'cores'};
$cpu->{'active'} ||= $cpu->{'threads'};
chomp($cpu->{'sockets'},
$cpu->{'cores'},
$cpu->{'threads'},
$cpu->{'active'});
# Choose minimum of active and actual # Choose minimum of active and actual
my $mincpu; my $mincpu;
$mincpu->{'sockets'} = ::min($cpu->{'sockets'},$cpu->{'active'}); $mincpu->{'sockets'} = ::min($cpu->{'sockets'},$cpu->{'active'});
@ -7044,33 +7072,35 @@ sub socket_core_thread() {
return $mincpu; return $mincpu;
} }
sub sct_gnu_linux() { sub sct_gnu_linux($) {
# Returns: # Returns:
# { 'sockets' => #sockets # { 'sockets' => #sockets
# 'cores' => #cores # 'cores' => #cores
# 'threads' => #threads # 'threads' => #threads
# 'active' => #taskset_threads } # 'active' => #taskset_threads }
my $cpu; my $cpu = shift;
local $/ = "\n"; # If delimiter is set, then $/ will be wrong local $/ = "\n"; # If delimiter is set, then $/ will be wrong
if($ENV{'PARALLEL_CPUINFO'} or -e "/proc/cpuinfo") { my @cpuinfo;
if($ENV{'PARALLEL_CPUINFO'}) {
# Use CPUINFO from environment - used for testing only
@cpuinfo = split/(?<=\n)/,$ENV{'PARALLEL_CPUINFO'};
} elsif($cpu->{'sockets'} and $cpu->{'cores'} and
$cpu->{'threads'}) {
# Skip /proc/cpuinfo - already set
} elsif(open(my $in_fh, "<", "/proc/cpuinfo")) {
# Read /proc/cpuinfo
@cpuinfo = <$in_fh>;
}
if(@cpuinfo) {
$cpu->{'sockets'} = 0; $cpu->{'sockets'} = 0;
$cpu->{'cores'} = 0; $cpu->{'cores'} = 0;
$cpu->{'threads'} = 0; $cpu->{'threads'} = 0;
my %seen; my %seen;
my %phy_seen; my %phy_seen;
my @cpuinfo;
my $physicalid; my $physicalid;
if(open(my $in_fh, "<", "/proc/cpuinfo")) {
@cpuinfo = <$in_fh>;
close $in_fh;
}
if($ENV{'PARALLEL_CPUINFO'}) {
# Use CPUINFO from environment - used for testing only
@cpuinfo = split/(?<=\n)/,$ENV{'PARALLEL_CPUINFO'};
}
for(@cpuinfo) { for(@cpuinfo) {
if(/^physical id.*[:](.*)/) { if(/^physical id.*[:](.*)/) {
$physicalid=$1; $physicalid = $1;
if(not $phy_seen{$1}++) { if(not $phy_seen{$1}++) {
$cpu->{'sockets'}++; $cpu->{'sockets'}++;
} }
@ -7080,8 +7110,7 @@ sub sct_gnu_linux() {
} }
/^processor.*[:]/i and $cpu->{'threads'}++; /^processor.*[:]/i and $cpu->{'threads'}++;
} }
$cpu->{'sockets'} ||= 1; $cpu->{'cores'} ||= $cpu->{'threads'} || $cpu->{'sockets'};
$cpu->{'cores'} ||= $cpu->{'threads'};
} }
if(-e "/proc/self/status" and not $ENV{'PARALLEL_CPUINFO'}) { if(-e "/proc/self/status" and not $ENV{'PARALLEL_CPUINFO'}) {
# if 'taskset' is used to limit number of threads # if 'taskset' is used to limit number of threads
@ -7096,326 +7125,231 @@ sub sct_gnu_linux() {
close $in_fh; close $in_fh;
} }
} }
if(grep { /\d/ } values %$cpu) { return $cpu;
return $cpu;
} else {
return undef;
}
} }
sub sct_android() { sub sct_android($) {
# Returns: # Returns:
# { 'sockets' => #sockets # { 'sockets' => #sockets
# 'cores' => #cores # 'cores' => #cores
# 'threads' => #threads # 'threads' => #threads
# 'active' => #taskset_threads } # 'active' => #taskset_threads }
# Use GNU/Linux # Use GNU/Linux
return sct_gnu_linux(); return sct_gnu_linux(@_);
} }
sub sct_freebsd() { sub sct_freebsd($) {
# Returns: # Returns:
# { 'sockets' => #sockets # { 'sockets' => #sockets
# 'cores' => #cores # 'cores' => #cores
# 'threads' => #threads # 'threads' => #threads
# 'active' => #taskset_threads } # 'active' => #taskset_threads }
local $/ = "\n"; local $/ = "\n";
my $cpu; my $cpu = shift;
$cpu->{'cores'} = (::qqx(qq{ sysctl -a dev.cpu | grep \%parent | awk '{ print \$2 }' | uniq | wc -l | awk '{ print \$1 }' }) $cpu->{'cores'} ||=
(::qqx(qq{ sysctl -a dev.cpu | grep \%parent | awk '{ print \$2 }' | uniq | wc -l | awk '{ print \$1 }' })
or or
::qqx(qq{ sysctl hw.ncpu | awk '{ print \$2 }' })); ::qqx(qq{ sysctl hw.ncpu | awk '{ print \$2 }' }));
$cpu->{'cores'} and chomp $cpu->{'cores'}; $cpu->{'threads'} ||=
$cpu->{'threads'} =
(::qqx(qq{ sysctl hw.ncpu | awk '{ print \$2 }' }) (::qqx(qq{ sysctl hw.ncpu | awk '{ print \$2 }' })
or or
::qqx(qq{ sysctl -a dev.cpu | 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 }' }));
$cpu->{'threads'} and chomp $cpu->{'threads'}; return $cpu;
$cpu->{'sockets'} ||= $cpu->{'cores'};
if(grep { /\d/ } values %$cpu) {
return $cpu;
} else {
return undef;
}
} }
sub sct_netbsd() { sub sct_netbsd($) {
# Returns: # Returns:
# { 'sockets' => #sockets # { 'sockets' => #sockets
# 'cores' => #cores # 'cores' => #cores
# 'threads' => #threads # 'threads' => #threads
# 'active' => #taskset_threads } # 'active' => #taskset_threads }
local $/ = "\n"; local $/ = "\n";
my $cpu; my $cpu = shift;
$cpu->{'cores'} = ::qqx("sysctl -n hw.ncpu"); $cpu->{'cores'} ||= ::qqx("sysctl -n hw.ncpu");
$cpu->{'cores'} and chomp $cpu->{'cores'}; return $cpu;
$cpu->{'threads'} = ::qqx("sysctl -n hw.ncpu");
$cpu->{'threads'} and chomp $cpu->{'threads'};
$cpu->{'sockets'} ||= $cpu->{'cores'};
if(grep { /\d/ } values %$cpu) {
return $cpu;
} else {
return undef;
}
} }
sub sct_openbsd() { sub sct_openbsd($) {
# Returns: # Returns:
# { 'sockets' => #sockets # { 'sockets' => #sockets
# 'cores' => #cores # 'cores' => #cores
# 'threads' => #threads # 'threads' => #threads
# 'active' => #taskset_threads } # 'active' => #taskset_threads }
local $/ = "\n"; local $/ = "\n";
my $cpu; my $cpu = shift;
$cpu->{'cores'} = ::qqx('sysctl -n hw.ncpu'); $cpu->{'cores'} ||= ::qqx('sysctl -n hw.ncpu');
$cpu->{'cores'} and chomp $cpu->{'cores'}; return $cpu;
$cpu->{'threads'} = ::qqx('sysctl -n hw.ncpu');
$cpu->{'threads'} and chomp $cpu->{'threads'};
$cpu->{'sockets'} ||= $cpu->{'cores'};
if(grep { /\d/ } values %$cpu) {
return $cpu;
} else {
return undef;
}
} }
sub sct_hurd() { sub sct_hurd($) {
# Returns: # Returns:
# { 'sockets' => #sockets # { 'sockets' => #sockets
# 'cores' => #cores # 'cores' => #cores
# 'threads' => #threads # 'threads' => #threads
# 'active' => #taskset_threads } # 'active' => #taskset_threads }
local $/ = "\n"; local $/ = "\n";
my $cpu; my $cpu = shift;
$cpu->{'cores'} = ::qqx("nproc"); $cpu->{'cores'} ||= ::qqx("nproc");
$cpu->{'cores'} and chomp $cpu->{'cores'}; return $cpu;
$cpu->{'threads'} = ::qqx("nproc");
$cpu->{'threads'} and chomp $cpu->{'threads'};
if(grep { /\d/ } values %$cpu) {
return $cpu;
} else {
return undef;
}
} }
sub sct_darwin() { sub sct_darwin($) {
# Returns: # Returns:
# { 'sockets' => #sockets # { 'sockets' => #sockets
# 'cores' => #cores # 'cores' => #cores
# 'threads' => #threads # 'threads' => #threads
# 'active' => #taskset_threads } # 'active' => #taskset_threads }
local $/ = "\n"; local $/ = "\n";
my $cpu; my $cpu = shift;
$cpu->{'cores'} = $cpu->{'cores'} ||=
(::qqx('sysctl -n hw.physicalcpu') (::qqx('sysctl -n hw.physicalcpu')
or or
::qqx(qq{ sysctl -a hw | grep [^a-z]physicalcpu[^a-z] | awk '{ print \$2 }' })); ::qqx(qq{ sysctl -a hw | grep [^a-z]physicalcpu[^a-z] | awk '{ print \$2 }' }));
$cpu->{'cores'} and chomp $cpu->{'cores'}; $cpu->{'threads'} ||=
$cpu->{'threads'} =
(::qqx('sysctl -n hw.logicalcpu') (::qqx('sysctl -n hw.logicalcpu')
or or
::qqx(qq{ sysctl -a hw | grep [^a-z]logicalcpu[^a-z] | awk '{ print \$2 }' })); ::qqx(qq{ sysctl -a hw | grep [^a-z]logicalcpu[^a-z] | awk '{ print \$2 }' }));
$cpu->{'threads'} and chomp $cpu->{'threads'}; return $cpu;
$cpu->{'sockets'} ||= $cpu->{'cores'};
if(grep { /\d/ } values %$cpu) {
return $cpu;
} else {
return undef;
}
} }
sub sct_solaris() { sub sct_solaris($) {
# Returns: # Returns:
# { 'sockets' => #sockets # { 'sockets' => #sockets
# 'cores' => #cores # 'cores' => #cores
# 'threads' => #threads # 'threads' => #threads
# 'active' => #taskset_threads } # 'active' => #taskset_threads }
local $/ = "\n"; local $/ = "\n";
my $cpu; my $cpu = shift;
if(-x "/usr/sbin/psrinfo") { if(not $cpu->{'cores'}) {
my @psrinfo = ::qqx("/usr/sbin/psrinfo"); if(-x "/usr/bin/kstat") {
if($#psrinfo >= 0) { my @chip_id = ::qqx("/usr/bin/kstat cpu_info|grep chip_id");
$cpu->{'cores'} = $#psrinfo +1; if($#chip_id >= 0) {
} $cpu->{'sockets'} ||= $#chip_id +1;
} }
if(-x "/usr/sbin/prtconf") { my @core_id = ::qqx("/usr/bin/kstat -m cpu_info|grep -w core_id|uniq");
my @prtconf = ::qqx("/usr/sbin/prtconf | grep cpu..instance"); if($#core_id >= 0) {
if($#prtconf >= 0) { $cpu->{'cores'} ||= $#core_id +1;
$cpu->{'cores'} = $#prtconf +1; }
} }
} if(-x "/usr/sbin/psrinfo") {
if(-x "/usr/sbin/prtconf") { my @psrinfo = ::qqx("/usr/sbin/psrinfo -p");
my @prtconf = ::qqx("/usr/sbin/prtconf | grep cpu..instance"); if($#psrinfo >= 0) {
if($#prtconf >= 0) { $cpu->{'sockets'} ||= $psrinfo[0];
$cpu->{'cores'} = $#prtconf +1; }
} }
} if(-x "/usr/sbin/prtconf") {
$cpu->{'cores'} and chomp $cpu->{'cores'}; my @prtconf = ::qqx("/usr/sbin/prtconf | grep cpu..instance");
if($#prtconf >= 0) {
if(-x "/usr/sbin/psrinfo") { $cpu->{'cores'} ||= $#prtconf +1;
my @psrinfo = ::qqx("/usr/sbin/psrinfo");
if($#psrinfo >= 0) {
$cpu->{'threads'} = $#psrinfo +1;
}
}
if(-x "/usr/sbin/prtconf") {
my @prtconf = ::qqx("/usr/sbin/prtconf | grep cpu..instance");
if($#prtconf >= 0) {
$cpu->{'threads'} = $#prtconf +1;
}
}
$cpu->{'threads'} and chomp $cpu->{'threads'};
if(grep { /\d/ } values %$cpu) {
return $cpu;
} else {
return undef;
}
}
sub sct_aix() {
# Returns:
# { 'sockets' => #sockets
# 'cores' => #cores
# 'threads' => #threads
# 'active' => #taskset_threads }
local $/ = "\n";
my $cpu;
if(-x "/usr/sbin/lscfg") {
if(open(my $in_fh, "-|", "/usr/sbin/lscfg -vs |grep proc | wc -l|tr -d ' '")) {
$cpu->{'cores'} = <$in_fh>;
chomp ($cpu->{'cores'});
close $in_fh;
}
}
if(-x "/usr/bin/vmstat") {
if(open(my $in_fh, "-|", "/usr/bin/vmstat 1 1")) {
while(<$in_fh>) {
/lcpu=([0-9]*) / and $cpu->{'threads'} = $1;
} }
close $in_fh;
} }
} }
return $cpu;
if(grep { /\d/ } values %$cpu) {
# BUG It is not not known how to calculate this
$cpu->{'sockets'} = 1;
return $cpu;
} else {
return undef;
}
} }
sub sct_hpux() { sub sct_aix($) {
# Returns: # Returns:
# { 'sockets' => #sockets # { 'sockets' => #sockets
# 'cores' => #cores # 'cores' => #cores
# 'threads' => #threads # 'threads' => #threads
# 'active' => #taskset_threads } # 'active' => #taskset_threads }
local $/ = "\n"; local $/ = "\n";
my $cpu; my $cpu = shift;
$cpu->{'cores'} = if(not $cpu->{'cores'}) {
if(-x "/usr/sbin/lscfg") {
if(open(my $in_fh, "-|", "/usr/sbin/lscfg -vs |grep proc | wc -l|tr -d ' '")) {
$cpu->{'cores'} = <$in_fh>;
close $in_fh;
}
}
}
if(not $cpu->{'threads'}) {
if(-x "/usr/bin/vmstat") {
if(open(my $in_fh, "-|", "/usr/bin/vmstat 1 1")) {
while(<$in_fh>) {
/lcpu=([0-9]*) / and $cpu->{'threads'} = $1;
}
close $in_fh;
}
}
}
return $cpu;
}
sub sct_hpux($) {
# Returns:
# { 'sockets' => #sockets
# 'cores' => #cores
# 'threads' => #threads
# 'active' => #taskset_threads }
local $/ = "\n";
my $cpu = shift;
$cpu->{'cores'} ||=
::qqx(qq{ /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 }'});
chomp($cpu->{'cores'}); $cpu->{'threads'} ||=
$cpu->{'threads'} =
::qqx(qq{ /usr/bin/mpsched -s 2>&1 | perl -ne '/Processor Count\\D+(\\d+)/ and print "\$1"'}); ::qqx(qq{ /usr/bin/mpsched -s 2>&1 | perl -ne '/Processor Count\\D+(\\d+)/ and print "\$1"'});
return $cpu;
if(grep { /\d/ } values %$cpu) {
# BUG It is not not known how to calculate this
$cpu->{'sockets'} = 1;
return $cpu;
} else {
return undef;
}
} }
sub sct_qnx() { sub sct_qnx($) {
# Returns: # Returns:
# { 'sockets' => #sockets # { 'sockets' => #sockets
# 'cores' => #cores # 'cores' => #cores
# 'threads' => #threads # 'threads' => #threads
# 'active' => #taskset_threads } # 'active' => #taskset_threads }
local $/ = "\n"; local $/ = "\n";
my $cpu; my $cpu = shift;
# BUG: It is not known how to calculate this. # BUG: It is not known how to calculate this.
if(grep { /\d/ } values %$cpu) { return $cpu;
return $cpu;
} else {
return undef;
}
} }
sub sct_openserver() { sub sct_openserver($) {
# Returns: # Returns:
# { 'sockets' => #sockets # { 'sockets' => #sockets
# 'cores' => #cores # 'cores' => #cores
# 'threads' => #threads # 'threads' => #threads
# 'active' => #taskset_threads } # 'active' => #taskset_threads }
local $/ = "\n"; local $/ = "\n";
my $cpu; my $cpu = shift;
if(-x "/usr/sbin/psrinfo") { if(not $cpu->{'cores'}) {
my @psrinfo = ::qqx("/usr/sbin/psrinfo"); if(-x "/usr/sbin/psrinfo") {
if($#psrinfo >= 0) { my @psrinfo = ::qqx("/usr/sbin/psrinfo");
$cpu->{'cores'} = $#psrinfo +1; if($#psrinfo >= 0) {
} $cpu->{'cores'} = $#psrinfo +1;
} }
if(-x "/usr/sbin/psrinfo") { }
my @psrinfo = ::qqx("/usr/sbin/psrinfo");
if($#psrinfo >= 0) {
$cpu->{'threads'} = $#psrinfo +1;
}
} }
$cpu->{'sockets'} ||= $cpu->{'cores'}; $cpu->{'sockets'} ||= $cpu->{'cores'};
return $cpu;
if(grep { /\d/ } values %$cpu) {
return $cpu;
} else {
return undef;
}
} }
sub sct_irix() { sub sct_irix($) {
# Returns: # Returns:
# { 'sockets' => #sockets # { 'sockets' => #sockets
# 'cores' => #cores # 'cores' => #cores
# 'threads' => #threads # 'threads' => #threads
# 'active' => #taskset_threads } # 'active' => #taskset_threads }
local $/ = "\n"; local $/ = "\n";
my $cpu; my $cpu = shift;
$cpu->{'cores'} = ::qqx(qq{ hinv | grep HZ | grep Processor | awk '{print \$1}' }); $cpu->{'cores'} ||=
$cpu->{'cores'} and chomp $cpu->{'cores'}; ::qqx(qq{ hinv | grep HZ | grep Processor | awk '{print \$1}' });
return $cpu;
if(grep { /\d/ } values %$cpu) {
return $cpu;
} else {
return undef;
}
} }
sub sct_tru64() { sub sct_tru64($) {
# Returns: # Returns:
# { 'sockets' => #sockets # { 'sockets' => #sockets
# 'cores' => #cores # 'cores' => #cores
# 'threads' => #threads # 'threads' => #threads
# 'active' => #taskset_threads } # 'active' => #taskset_threads }
local $/ = "\n"; local $/ = "\n";
my $cpu; my $cpu = shift;
$cpu->{'cores'} = ::qqx("sizer -pr"); $cpu->{'cores'} ||= ::qqx("sizer -pr");
$cpu->{'cores'} and chomp $cpu->{'cores'};
$cpu->{'cores'} ||= 1;
$cpu->{'sockets'} ||= $cpu->{'cores'}; $cpu->{'sockets'} ||= $cpu->{'cores'};
$cpu->{'threads'} ||= $cpu->{'cores'}; $cpu->{'threads'} ||= $cpu->{'cores'};
if(grep { /\d/ } values %$cpu) { return $cpu;
return $cpu;
} else {
return undef;
}
} }
sub sshcommand($) { sub sshcommand($) {
@ -9221,7 +9155,8 @@ sub start($) {
return $pid; return $pid;
} }
sub open3_setpgrp { sub redefine_open3_setpgrp {
my $setgprp_cache = shift;
# Select and run open3_setpgrp_internal/open3_setpgrp_external # Select and run open3_setpgrp_internal/open3_setpgrp_external
no warnings 'redefine'; no warnings 'redefine';
my ($outfh,$name) = ::tmpfile(SUFFIX => ".tst"); my ($outfh,$name) = ::tmpfile(SUFFIX => ".tst");
@ -9235,6 +9170,7 @@ sub start($) {
"perl -MIPC::Open3 -e ". "perl -MIPC::Open3 -e ".
::shell_quote_scalar_default($script) ::shell_quote_scalar_default($script)
); );
my $redefine_eval;
# Redirect STDERR temporarily, # Redirect STDERR temporarily,
# so errors on MacOS X are ignored. # so errors on MacOS X are ignored.
open my $saveerr, ">&STDERR"; open my $saveerr, ">&STDERR";
@ -9249,14 +9185,30 @@ sub start($) {
# or does not have bash: # or does not have bash:
# Use (slow) external version # Use (slow) external version
unlink($name); unlink($name);
*open3_setpgrp = \&open3_setpgrp_external; $redefine_eval = '*open3_setpgrp = \&open3_setpgrp_external';
::debug("init","open3_setpgrp_external chosen\n"); ::debug("init","open3_setpgrp_external chosen\n");
} else { } else {
# Supports open3(x,x,x,"-") # Supports open3(x,x,x,"-")
# This is 0.5 ms faster to run # This is 0.5 ms faster to run
*open3_setpgrp = \&open3_setpgrp_internal; $redefine_eval = '*open3_setpgrp = \&open3_setpgrp_internal';
::debug("init","open3_setpgrp_internal chosen\n"); ::debug("init","open3_setpgrp_internal chosen\n");
} }
open(my $fh, ">", $setgprp_cache) || die;
print $fh $redefine_eval;
close $fh;
eval $redefine_eval;
}
sub open3_setpgrp {
my $setgprp_cache = $Global::cache_dir . "/tmp/sshlogin/" .
::hostname() . "/setpgrp_func";
if(-e $setgprp_cache) {
open(my $fh, "<", $setgprp_cache) || die;
eval <$fh> || die;
close $fh;
} else {
redefine_open3_setpgrp($setgprp_cache);
}
# The sub is now redefined. Call it # The sub is now redefined. Call it
return open3_setpgrp(@_); return open3_setpgrp(@_);
} }

View file

@ -277,9 +277,9 @@ shell quote a string
perl quote a string perl quote a string
=item Z<> B<uq()> =item Z<> B<uq()> (or B<uq>)
unquote current replacement string do not quote current replacement string
=item Z<> B<total_jobs()> =item Z<> B<total_jobs()>

View file

@ -10,6 +10,7 @@ P_ALL="openstep qnx pidora alpha tru64 hpux-ia64 syllable raspbian solaris openi
# Skip irix until Perl is upgraded (I cannot due to too small disk quota) # Skip irix until Perl is upgraded (I cannot due to too small disk quota)
P_ALL="openstep qnx pidora alpha tru64 hpux-ia64 syllable raspbian solaris openindiana aix hpux debian-ppc suse solaris-x86 mandriva ubuntu scosysv unixware centos miros macosx redhat netbsd openbsd freebsd debian dragonfly vax minix hurd beaglebone cubieboard2" P_ALL="openstep qnx pidora alpha tru64 hpux-ia64 syllable raspbian solaris openindiana aix hpux debian-ppc suse solaris-x86 mandriva ubuntu scosysv unixware centos miros macosx redhat netbsd openbsd freebsd debian dragonfly vax minix hurd beaglebone cubieboard2"
P="$P_ALL" P="$P_ALL"
#P="unixware freebsd netbsd"
# tru64 takes 22s to run 4 parallels # tru64 takes 22s to run 4 parallels
MAXTIME=50 MAXTIME=50
@ -20,13 +21,14 @@ MAXINNERPROC=${maxinnerproc:-3}
export PARALLEL_SSH="ssh -oLogLevel=quiet" export PARALLEL_SSH="ssh -oLogLevel=quiet"
# select a running master (debian-ppc, suse, ubuntu, or debian) # select a running master (debian-ppc, suse, ubuntu, redhat, or debian)
# 2019-06-25 debian has too little free memory (and swap)
MASTER=$(parallel -j0 --delay 0.1 --halt now,success=1 $PARALLEL_SSH {} echo {} \ MASTER=$(parallel -j0 --delay 0.1 --halt now,success=1 $PARALLEL_SSH {} echo {} \
::: {debian-ppc,ubuntu,debian,suse}.polarhome.com) ::: {debian-ppc,ubuntu,suse,redhat}.polarhome.com)
parallel -j0 --delay 0.1 --retries $RETRIES \ parallel -j0 --delay 0.1 --retries $RETRIES \
rsync -L /usr/local/bin/{parallel,env_parallel,env_parallel.*[^~],parcat,stdout} \ rsync -L /usr/local/bin/{parallel,env_parallel,env_parallel.*[^~],parcat,stdout} \
::: $MASTER:bin/ ::: $MASTER:bin/
doit() { doit() {
# Avoid the stupid /etc/issue.net banner at Polarhome: -oLogLevel=quiet # Avoid the stupid /etc/issue.net banner at Polarhome: -oLogLevel=quiet
@ -35,7 +37,7 @@ doit() {
export MAXTIME export MAXTIME
export RETRIES export RETRIES
export MAXPROC export MAXPROC
export RET_TIME_K="--memfree 150m -k --retries $RETRIES --timeout $MAXTIME" export RET_TIME_K="--memfree 100m -k --retries $RETRIES --timeout $MAXTIME"
LC_ALL=C LC_ALL=C
MAXPROC=$(echo $(seq 300 | parallel -j0 echo {%} | sort -n | tail -n1) /$MAXINNERPROC | bc) MAXPROC=$(echo $(seq 300 | parallel -j0 echo {%} | sort -n | tail -n1) /$MAXINNERPROC | bc)
@ -44,8 +46,8 @@ doit() {
echo '### Filter out working servers' echo '### Filter out working servers'
# syllable often gives false positive # syllable often gives false positive
parallel --timeout $MAXTIME -j10 ssh syllable true ::: {1..10} 2>/dev/null >/dev/null & parallel --timeout $MAXTIME -j10 ssh syllable true ::: {1..10} 2>/dev/null >/dev/null &
POLAR_ALL="`bin/parallel --memfree 200m -j0 -k --timeout 10 echo {} ::: $P`" POLAR_ALL="`bin/parallel --memfree 100m -j0 -k --timeout 10 echo {} ::: $P`"
POLAR="`bin/parallel --memfree 200m -j0 -k --timeout 10 $PARALLEL_SSH {} echo {} ::: $P`" POLAR="`bin/parallel --memfree 100m -j0 -k --timeout 10 $PARALLEL_SSH {} echo {} ::: $P`"
diff <(echo "$POLAR_ALL") <(echo "$POLAR") diff <(echo "$POLAR_ALL") <(echo "$POLAR")
S_POLAR=`bin/parallel -j0 $RET_TIME_K echo -S 1/{} ::: $POLAR` S_POLAR=`bin/parallel -j0 $RET_TIME_K echo -S 1/{} ::: $POLAR`
@ -77,7 +79,7 @@ doit() {
par_nonall() { par_nonall() {
parallel -j$MAXPROC $RET_TIME_K --delay 0.1 --tag \ parallel -j$MAXPROC $RET_TIME_K --delay 0.1 --tag \
--nonall $S_POLAR -S "1/sshwithpass minix" --argsep ,:- \ --nonall $S_POLAR -S "1/sshwithpass minix" --argsep ,:- \
'source setupenv >&/dev/null || . `pwd`/setupenv;' "$@" 'source setupenv 2>/dev/null; . `pwd`/setupenv;' "$@"
# setupenv contains something like this (adapted to the local path and shell) # setupenv contains something like this (adapted to the local path and shell)
# #
# PATH=$HOME/bin:$PATH:/usr/local/bin # PATH=$HOME/bin:$PATH:/usr/local/bin
@ -93,7 +95,7 @@ doit() {
::: $POLAR minix ::: $POLAR minix
echo Done copying echo Done copying
env_parallel -d '\n\n' -vkj$MAXINNERPROC --delay 2 <<'EOF' env_parallel -d '\n\n' -vkj$MAXINNERPROC --delay 2 <<'EOF' |
echo echo
echo '### Works on ...' echo '### Works on ...'
@ -123,7 +125,7 @@ doit() {
cat <(echo bash only A) cat <(echo bash only A)
} }
export -f funcA; export -f funcA;
bin/parallel funcA ::: 1' 2>&1 | sort bin/parallel funcA ::: 1' 2>&1 | LANG=C sort
echo echo
echo '### Does PARALLEL_SHELL help exporting a bash function' echo '### Does PARALLEL_SHELL help exporting a bash function'
@ -142,16 +144,29 @@ doit() {
bin/parallel funcB ::: 1' 2>&1 bin/parallel funcB ::: 1' 2>&1
echo echo
echo '### env_parallel echo :::: <(echo OK)' echo '### env_parallel --install'
echo '(bash ksh mksh zsh only)' echo '(bash ksh mksh zsh only)'
echo echo
par_nonall 'bin/env_parallel --install && echo install-OK' 2>&1 par_nonall 'bin/env_parallel --install && echo install-OK' 2>&1
echo
echo '### env_parallel echo env_parallel ::: run-OK'
echo '(bash ksh mksh zsh only)'
echo
par_nonall 'env_parallel echo env_parallel ::: run-OK' 2>&1 par_nonall 'env_parallel echo env_parallel ::: run-OK' 2>&1
echo
echo '### env_parallel echo reading from process substitution :::: <(echo OK)'
echo '(bash ksh mksh zsh only)'
echo
# csh on NetBSD does not support process substitution # csh on NetBSD does not support process substitution
par_nonall 'env_parallel echo reading from process substitution :::: <(echo OK)' 2>&1 | par_nonall 'env_parallel echo reading from process substitution :::: <(echo OK)' 2>&1 |
grep -v ': /tmp/.*: No such file or directory' grep -v ': /tmp/.*: No such file or directory'
# Test empty command name in process list echo
echo '### Test empty command name in process list'
echo '(bash ksh mksh zsh only)'
echo
test_empty_cmd() { test_empty_cmd() {
echo '### Test if empty command name in process list causes problems' echo '### Test if empty command name in process list causes problems'
perl -e '$0=" ";sleep 1000' & perl -e '$0=" ";sleep 1000' &
@ -179,7 +194,9 @@ doit() {
echo '### env_parset var1,var2,var3 seq ::: 2 3 4' echo '### env_parset var1,var2,var3 seq ::: 2 3 4'
par_nonall 'start=2; env_parset var1,var2,var3 seq \$start ::: 2 3 4; echo $var1,$var2,$var3' 2>&1 par_nonall 'start=2; env_parset var1,var2,var3 seq \$start ::: 2 3 4; echo $var1,$var2,$var3' 2>&1
EOF EOF
perl -ne 'm{UX:sh ./bin/sh.: ERROR: source: Not found} and next;
m{/usr/X11R7/bin/.: Permission denied.} and next;
print'
} }
env_parallel -u -S$MASTER doit ::: 1 env_parallel -u -S$MASTER doit ::: 1

View file

@ -1,4 +1,4 @@
MAXTIME=50 RETRIES=3 MAXPROC=84 MAXINNERPROC=3 MAXTIME=50 RETRIES=3 MAXPROC=100 MAXINNERPROC=3
### Filter out working servers ### Filter out working servers
1d0 1d0
< openstep < openstep
@ -17,7 +17,6 @@ MAXTIME=50 RETRIES=3 MAXPROC=84 MAXINNERPROC=3
bin/parallel qnx copy qnx bin/parallel parallel bin/parallel qnx copy qnx bin/parallel parallel
bin/parallel pidora copy pidora bin/parallel parallel bin/parallel pidora copy pidora bin/parallel parallel
bin/parallel tru64 copy tru64 bin/parallel parallel bin/parallel tru64 copy tru64 bin/parallel parallel
bin/parallel hpux-ia64 copy hpux-ia64 bin/parallel parallel
bin/parallel raspbian copy raspbian bin/parallel parallel bin/parallel raspbian copy raspbian bin/parallel parallel
bin/parallel solaris copy solaris bin/parallel parallel bin/parallel solaris copy solaris bin/parallel parallel
bin/parallel openindiana copy openindiana bin/parallel parallel bin/parallel openindiana copy openindiana bin/parallel parallel
@ -38,12 +37,10 @@ bin/parallel netbsd copy netbsd bin/parallel parallel
bin/parallel openbsd copy openbsd bin/parallel parallel bin/parallel openbsd copy openbsd bin/parallel parallel
bin/parallel freebsd copy freebsd bin/parallel parallel bin/parallel freebsd copy freebsd bin/parallel parallel
bin/parallel debian copy debian bin/parallel parallel bin/parallel debian copy debian bin/parallel parallel
bin/parallel hurd copy hurd bin/parallel parallel
bin/parallel minix copy minix bin/parallel parallel bin/parallel minix copy minix bin/parallel parallel
bin/env_parallel qnx copy qnx bin/env_parallel env_parallel bin/env_parallel qnx copy qnx bin/env_parallel env_parallel
bin/env_parallel pidora copy pidora bin/env_parallel env_parallel bin/env_parallel pidora copy pidora bin/env_parallel env_parallel
bin/env_parallel tru64 copy tru64 bin/env_parallel env_parallel bin/env_parallel tru64 copy tru64 bin/env_parallel env_parallel
bin/env_parallel hpux-ia64 copy hpux-ia64 bin/env_parallel env_parallel
bin/env_parallel raspbian copy raspbian bin/env_parallel env_parallel bin/env_parallel raspbian copy raspbian bin/env_parallel env_parallel
bin/env_parallel solaris copy solaris bin/env_parallel env_parallel bin/env_parallel solaris copy solaris bin/env_parallel env_parallel
bin/env_parallel openindiana copy openindiana bin/env_parallel env_parallel bin/env_parallel openindiana copy openindiana bin/env_parallel env_parallel
@ -64,12 +61,10 @@ bin/env_parallel netbsd copy netbsd bin/env_parallel env_parallel
bin/env_parallel openbsd copy openbsd bin/env_parallel env_parallel bin/env_parallel openbsd copy openbsd bin/env_parallel env_parallel
bin/env_parallel freebsd copy freebsd bin/env_parallel env_parallel bin/env_parallel freebsd copy freebsd bin/env_parallel env_parallel
bin/env_parallel debian copy debian bin/env_parallel env_parallel bin/env_parallel debian copy debian bin/env_parallel env_parallel
bin/env_parallel hurd copy hurd bin/env_parallel env_parallel
bin/env_parallel minix copy minix bin/env_parallel env_parallel bin/env_parallel minix copy minix bin/env_parallel env_parallel
bin/env_parallel.ash qnx copy qnx bin/env_parallel.ash env_parallel.ash bin/env_parallel.ash qnx copy qnx bin/env_parallel.ash env_parallel.ash
bin/env_parallel.ash pidora copy pidora bin/env_parallel.ash env_parallel.ash bin/env_parallel.ash pidora copy pidora bin/env_parallel.ash env_parallel.ash
bin/env_parallel.ash tru64 copy tru64 bin/env_parallel.ash env_parallel.ash bin/env_parallel.ash tru64 copy tru64 bin/env_parallel.ash env_parallel.ash
bin/env_parallel.ash hpux-ia64 copy hpux-ia64 bin/env_parallel.ash env_parallel.ash
bin/env_parallel.ash raspbian copy raspbian bin/env_parallel.ash env_parallel.ash bin/env_parallel.ash raspbian copy raspbian bin/env_parallel.ash env_parallel.ash
bin/env_parallel.ash solaris copy solaris bin/env_parallel.ash env_parallel.ash bin/env_parallel.ash solaris copy solaris bin/env_parallel.ash env_parallel.ash
bin/env_parallel.ash openindiana copy openindiana bin/env_parallel.ash env_parallel.ash bin/env_parallel.ash openindiana copy openindiana bin/env_parallel.ash env_parallel.ash
@ -90,12 +85,10 @@ bin/env_parallel.ash netbsd copy netbsd bin/env_parallel.ash env_parallel.ash
bin/env_parallel.ash openbsd copy openbsd bin/env_parallel.ash env_parallel.ash bin/env_parallel.ash openbsd copy openbsd bin/env_parallel.ash env_parallel.ash
bin/env_parallel.ash freebsd copy freebsd bin/env_parallel.ash env_parallel.ash bin/env_parallel.ash freebsd copy freebsd bin/env_parallel.ash env_parallel.ash
bin/env_parallel.ash debian copy debian bin/env_parallel.ash env_parallel.ash bin/env_parallel.ash debian copy debian bin/env_parallel.ash env_parallel.ash
bin/env_parallel.ash hurd copy hurd bin/env_parallel.ash env_parallel.ash
bin/env_parallel.ash minix copy minix bin/env_parallel.ash env_parallel.ash bin/env_parallel.ash minix copy minix bin/env_parallel.ash env_parallel.ash
bin/env_parallel.bash qnx copy qnx bin/env_parallel.bash env_parallel.bash bin/env_parallel.bash qnx copy qnx bin/env_parallel.bash env_parallel.bash
bin/env_parallel.bash pidora copy pidora bin/env_parallel.bash env_parallel.bash bin/env_parallel.bash pidora copy pidora bin/env_parallel.bash env_parallel.bash
bin/env_parallel.bash tru64 copy tru64 bin/env_parallel.bash env_parallel.bash bin/env_parallel.bash tru64 copy tru64 bin/env_parallel.bash env_parallel.bash
bin/env_parallel.bash hpux-ia64 copy hpux-ia64 bin/env_parallel.bash env_parallel.bash
bin/env_parallel.bash raspbian copy raspbian bin/env_parallel.bash env_parallel.bash bin/env_parallel.bash raspbian copy raspbian bin/env_parallel.bash env_parallel.bash
bin/env_parallel.bash solaris copy solaris bin/env_parallel.bash env_parallel.bash bin/env_parallel.bash solaris copy solaris bin/env_parallel.bash env_parallel.bash
bin/env_parallel.bash openindiana copy openindiana bin/env_parallel.bash env_parallel.bash bin/env_parallel.bash openindiana copy openindiana bin/env_parallel.bash env_parallel.bash
@ -116,12 +109,10 @@ bin/env_parallel.bash netbsd copy netbsd bin/env_parallel.bash env_parallel.bash
bin/env_parallel.bash openbsd copy openbsd bin/env_parallel.bash env_parallel.bash bin/env_parallel.bash openbsd copy openbsd bin/env_parallel.bash env_parallel.bash
bin/env_parallel.bash freebsd copy freebsd bin/env_parallel.bash env_parallel.bash bin/env_parallel.bash freebsd copy freebsd bin/env_parallel.bash env_parallel.bash
bin/env_parallel.bash debian copy debian bin/env_parallel.bash env_parallel.bash bin/env_parallel.bash debian copy debian bin/env_parallel.bash env_parallel.bash
bin/env_parallel.bash hurd copy hurd bin/env_parallel.bash env_parallel.bash
bin/env_parallel.bash minix copy minix bin/env_parallel.bash env_parallel.bash bin/env_parallel.bash minix copy minix bin/env_parallel.bash env_parallel.bash
bin/env_parallel.csh qnx copy qnx bin/env_parallel.csh env_parallel.csh bin/env_parallel.csh qnx copy qnx bin/env_parallel.csh env_parallel.csh
bin/env_parallel.csh pidora copy pidora bin/env_parallel.csh env_parallel.csh bin/env_parallel.csh pidora copy pidora bin/env_parallel.csh env_parallel.csh
bin/env_parallel.csh tru64 copy tru64 bin/env_parallel.csh env_parallel.csh bin/env_parallel.csh tru64 copy tru64 bin/env_parallel.csh env_parallel.csh
bin/env_parallel.csh hpux-ia64 copy hpux-ia64 bin/env_parallel.csh env_parallel.csh
bin/env_parallel.csh raspbian copy raspbian bin/env_parallel.csh env_parallel.csh bin/env_parallel.csh raspbian copy raspbian bin/env_parallel.csh env_parallel.csh
bin/env_parallel.csh solaris copy solaris bin/env_parallel.csh env_parallel.csh bin/env_parallel.csh solaris copy solaris bin/env_parallel.csh env_parallel.csh
bin/env_parallel.csh openindiana copy openindiana bin/env_parallel.csh env_parallel.csh bin/env_parallel.csh openindiana copy openindiana bin/env_parallel.csh env_parallel.csh
@ -142,12 +133,10 @@ bin/env_parallel.csh netbsd copy netbsd bin/env_parallel.csh env_parallel.csh
bin/env_parallel.csh openbsd copy openbsd bin/env_parallel.csh env_parallel.csh bin/env_parallel.csh openbsd copy openbsd bin/env_parallel.csh env_parallel.csh
bin/env_parallel.csh freebsd copy freebsd bin/env_parallel.csh env_parallel.csh bin/env_parallel.csh freebsd copy freebsd bin/env_parallel.csh env_parallel.csh
bin/env_parallel.csh debian copy debian bin/env_parallel.csh env_parallel.csh bin/env_parallel.csh debian copy debian bin/env_parallel.csh env_parallel.csh
bin/env_parallel.csh hurd copy hurd bin/env_parallel.csh env_parallel.csh
bin/env_parallel.csh minix copy minix bin/env_parallel.csh env_parallel.csh bin/env_parallel.csh minix copy minix bin/env_parallel.csh env_parallel.csh
bin/env_parallel.dash qnx copy qnx bin/env_parallel.dash env_parallel.dash bin/env_parallel.dash qnx copy qnx bin/env_parallel.dash env_parallel.dash
bin/env_parallel.dash pidora copy pidora bin/env_parallel.dash env_parallel.dash bin/env_parallel.dash pidora copy pidora bin/env_parallel.dash env_parallel.dash
bin/env_parallel.dash tru64 copy tru64 bin/env_parallel.dash env_parallel.dash bin/env_parallel.dash tru64 copy tru64 bin/env_parallel.dash env_parallel.dash
bin/env_parallel.dash hpux-ia64 copy hpux-ia64 bin/env_parallel.dash env_parallel.dash
bin/env_parallel.dash raspbian copy raspbian bin/env_parallel.dash env_parallel.dash bin/env_parallel.dash raspbian copy raspbian bin/env_parallel.dash env_parallel.dash
bin/env_parallel.dash solaris copy solaris bin/env_parallel.dash env_parallel.dash bin/env_parallel.dash solaris copy solaris bin/env_parallel.dash env_parallel.dash
bin/env_parallel.dash openindiana copy openindiana bin/env_parallel.dash env_parallel.dash bin/env_parallel.dash openindiana copy openindiana bin/env_parallel.dash env_parallel.dash
@ -168,12 +157,10 @@ bin/env_parallel.dash netbsd copy netbsd bin/env_parallel.dash env_parallel.dash
bin/env_parallel.dash openbsd copy openbsd bin/env_parallel.dash env_parallel.dash bin/env_parallel.dash openbsd copy openbsd bin/env_parallel.dash env_parallel.dash
bin/env_parallel.dash freebsd copy freebsd bin/env_parallel.dash env_parallel.dash bin/env_parallel.dash freebsd copy freebsd bin/env_parallel.dash env_parallel.dash
bin/env_parallel.dash debian copy debian bin/env_parallel.dash env_parallel.dash bin/env_parallel.dash debian copy debian bin/env_parallel.dash env_parallel.dash
bin/env_parallel.dash hurd copy hurd bin/env_parallel.dash env_parallel.dash
bin/env_parallel.dash minix copy minix bin/env_parallel.dash env_parallel.dash bin/env_parallel.dash minix copy minix bin/env_parallel.dash env_parallel.dash
bin/env_parallel.fish qnx copy qnx bin/env_parallel.fish env_parallel.fish bin/env_parallel.fish qnx copy qnx bin/env_parallel.fish env_parallel.fish
bin/env_parallel.fish pidora copy pidora bin/env_parallel.fish env_parallel.fish bin/env_parallel.fish pidora copy pidora bin/env_parallel.fish env_parallel.fish
bin/env_parallel.fish tru64 copy tru64 bin/env_parallel.fish env_parallel.fish bin/env_parallel.fish tru64 copy tru64 bin/env_parallel.fish env_parallel.fish
bin/env_parallel.fish hpux-ia64 copy hpux-ia64 bin/env_parallel.fish env_parallel.fish
bin/env_parallel.fish raspbian copy raspbian bin/env_parallel.fish env_parallel.fish bin/env_parallel.fish raspbian copy raspbian bin/env_parallel.fish env_parallel.fish
bin/env_parallel.fish solaris copy solaris bin/env_parallel.fish env_parallel.fish bin/env_parallel.fish solaris copy solaris bin/env_parallel.fish env_parallel.fish
bin/env_parallel.fish openindiana copy openindiana bin/env_parallel.fish env_parallel.fish bin/env_parallel.fish openindiana copy openindiana bin/env_parallel.fish env_parallel.fish
@ -194,12 +181,10 @@ bin/env_parallel.fish netbsd copy netbsd bin/env_parallel.fish env_parallel.fish
bin/env_parallel.fish openbsd copy openbsd bin/env_parallel.fish env_parallel.fish bin/env_parallel.fish openbsd copy openbsd bin/env_parallel.fish env_parallel.fish
bin/env_parallel.fish freebsd copy freebsd bin/env_parallel.fish env_parallel.fish bin/env_parallel.fish freebsd copy freebsd bin/env_parallel.fish env_parallel.fish
bin/env_parallel.fish debian copy debian bin/env_parallel.fish env_parallel.fish bin/env_parallel.fish debian copy debian bin/env_parallel.fish env_parallel.fish
bin/env_parallel.fish hurd copy hurd bin/env_parallel.fish env_parallel.fish
bin/env_parallel.fish minix copy minix bin/env_parallel.fish env_parallel.fish bin/env_parallel.fish minix copy minix bin/env_parallel.fish env_parallel.fish
bin/env_parallel.ksh qnx copy qnx bin/env_parallel.ksh env_parallel.ksh bin/env_parallel.ksh qnx copy qnx bin/env_parallel.ksh env_parallel.ksh
bin/env_parallel.ksh pidora copy pidora bin/env_parallel.ksh env_parallel.ksh bin/env_parallel.ksh pidora copy pidora bin/env_parallel.ksh env_parallel.ksh
bin/env_parallel.ksh tru64 copy tru64 bin/env_parallel.ksh env_parallel.ksh bin/env_parallel.ksh tru64 copy tru64 bin/env_parallel.ksh env_parallel.ksh
bin/env_parallel.ksh hpux-ia64 copy hpux-ia64 bin/env_parallel.ksh env_parallel.ksh
bin/env_parallel.ksh raspbian copy raspbian bin/env_parallel.ksh env_parallel.ksh bin/env_parallel.ksh raspbian copy raspbian bin/env_parallel.ksh env_parallel.ksh
bin/env_parallel.ksh solaris copy solaris bin/env_parallel.ksh env_parallel.ksh bin/env_parallel.ksh solaris copy solaris bin/env_parallel.ksh env_parallel.ksh
bin/env_parallel.ksh openindiana copy openindiana bin/env_parallel.ksh env_parallel.ksh bin/env_parallel.ksh openindiana copy openindiana bin/env_parallel.ksh env_parallel.ksh
@ -220,12 +205,10 @@ bin/env_parallel.ksh netbsd copy netbsd bin/env_parallel.ksh env_parallel.ksh
bin/env_parallel.ksh openbsd copy openbsd bin/env_parallel.ksh env_parallel.ksh bin/env_parallel.ksh openbsd copy openbsd bin/env_parallel.ksh env_parallel.ksh
bin/env_parallel.ksh freebsd copy freebsd bin/env_parallel.ksh env_parallel.ksh bin/env_parallel.ksh freebsd copy freebsd bin/env_parallel.ksh env_parallel.ksh
bin/env_parallel.ksh debian copy debian bin/env_parallel.ksh env_parallel.ksh bin/env_parallel.ksh debian copy debian bin/env_parallel.ksh env_parallel.ksh
bin/env_parallel.ksh hurd copy hurd bin/env_parallel.ksh env_parallel.ksh
bin/env_parallel.ksh minix copy minix bin/env_parallel.ksh env_parallel.ksh bin/env_parallel.ksh minix copy minix bin/env_parallel.ksh env_parallel.ksh
bin/env_parallel.mksh qnx copy qnx bin/env_parallel.mksh env_parallel.mksh bin/env_parallel.mksh qnx copy qnx bin/env_parallel.mksh env_parallel.mksh
bin/env_parallel.mksh pidora copy pidora bin/env_parallel.mksh env_parallel.mksh bin/env_parallel.mksh pidora copy pidora bin/env_parallel.mksh env_parallel.mksh
bin/env_parallel.mksh tru64 copy tru64 bin/env_parallel.mksh env_parallel.mksh bin/env_parallel.mksh tru64 copy tru64 bin/env_parallel.mksh env_parallel.mksh
bin/env_parallel.mksh hpux-ia64 copy hpux-ia64 bin/env_parallel.mksh env_parallel.mksh
bin/env_parallel.mksh raspbian copy raspbian bin/env_parallel.mksh env_parallel.mksh bin/env_parallel.mksh raspbian copy raspbian bin/env_parallel.mksh env_parallel.mksh
bin/env_parallel.mksh solaris copy solaris bin/env_parallel.mksh env_parallel.mksh bin/env_parallel.mksh solaris copy solaris bin/env_parallel.mksh env_parallel.mksh
bin/env_parallel.mksh openindiana copy openindiana bin/env_parallel.mksh env_parallel.mksh bin/env_parallel.mksh openindiana copy openindiana bin/env_parallel.mksh env_parallel.mksh
@ -246,12 +229,10 @@ bin/env_parallel.mksh netbsd copy netbsd bin/env_parallel.mksh env_parallel.mksh
bin/env_parallel.mksh openbsd copy openbsd bin/env_parallel.mksh env_parallel.mksh bin/env_parallel.mksh openbsd copy openbsd bin/env_parallel.mksh env_parallel.mksh
bin/env_parallel.mksh freebsd copy freebsd bin/env_parallel.mksh env_parallel.mksh bin/env_parallel.mksh freebsd copy freebsd bin/env_parallel.mksh env_parallel.mksh
bin/env_parallel.mksh debian copy debian bin/env_parallel.mksh env_parallel.mksh bin/env_parallel.mksh debian copy debian bin/env_parallel.mksh env_parallel.mksh
bin/env_parallel.mksh hurd copy hurd bin/env_parallel.mksh env_parallel.mksh
bin/env_parallel.mksh minix copy minix bin/env_parallel.mksh env_parallel.mksh bin/env_parallel.mksh minix copy minix bin/env_parallel.mksh env_parallel.mksh
bin/env_parallel.pdksh qnx copy qnx bin/env_parallel.pdksh env_parallel.pdksh bin/env_parallel.pdksh qnx copy qnx bin/env_parallel.pdksh env_parallel.pdksh
bin/env_parallel.pdksh pidora copy pidora bin/env_parallel.pdksh env_parallel.pdksh bin/env_parallel.pdksh pidora copy pidora bin/env_parallel.pdksh env_parallel.pdksh
bin/env_parallel.pdksh tru64 copy tru64 bin/env_parallel.pdksh env_parallel.pdksh bin/env_parallel.pdksh tru64 copy tru64 bin/env_parallel.pdksh env_parallel.pdksh
bin/env_parallel.pdksh hpux-ia64 copy hpux-ia64 bin/env_parallel.pdksh env_parallel.pdksh
bin/env_parallel.pdksh raspbian copy raspbian bin/env_parallel.pdksh env_parallel.pdksh bin/env_parallel.pdksh raspbian copy raspbian bin/env_parallel.pdksh env_parallel.pdksh
bin/env_parallel.pdksh solaris copy solaris bin/env_parallel.pdksh env_parallel.pdksh bin/env_parallel.pdksh solaris copy solaris bin/env_parallel.pdksh env_parallel.pdksh
bin/env_parallel.pdksh openindiana copy openindiana bin/env_parallel.pdksh env_parallel.pdksh bin/env_parallel.pdksh openindiana copy openindiana bin/env_parallel.pdksh env_parallel.pdksh
@ -272,12 +253,10 @@ bin/env_parallel.pdksh netbsd copy netbsd bin/env_parallel.pdksh env_parallel.pd
bin/env_parallel.pdksh openbsd copy openbsd bin/env_parallel.pdksh env_parallel.pdksh bin/env_parallel.pdksh openbsd copy openbsd bin/env_parallel.pdksh env_parallel.pdksh
bin/env_parallel.pdksh freebsd copy freebsd bin/env_parallel.pdksh env_parallel.pdksh bin/env_parallel.pdksh freebsd copy freebsd bin/env_parallel.pdksh env_parallel.pdksh
bin/env_parallel.pdksh debian copy debian bin/env_parallel.pdksh env_parallel.pdksh bin/env_parallel.pdksh debian copy debian bin/env_parallel.pdksh env_parallel.pdksh
bin/env_parallel.pdksh hurd copy hurd bin/env_parallel.pdksh env_parallel.pdksh
bin/env_parallel.pdksh minix copy minix bin/env_parallel.pdksh env_parallel.pdksh bin/env_parallel.pdksh minix copy minix bin/env_parallel.pdksh env_parallel.pdksh
bin/env_parallel.sh qnx copy qnx bin/env_parallel.sh env_parallel.sh bin/env_parallel.sh qnx copy qnx bin/env_parallel.sh env_parallel.sh
bin/env_parallel.sh pidora copy pidora bin/env_parallel.sh env_parallel.sh bin/env_parallel.sh pidora copy pidora bin/env_parallel.sh env_parallel.sh
bin/env_parallel.sh tru64 copy tru64 bin/env_parallel.sh env_parallel.sh bin/env_parallel.sh tru64 copy tru64 bin/env_parallel.sh env_parallel.sh
bin/env_parallel.sh hpux-ia64 copy hpux-ia64 bin/env_parallel.sh env_parallel.sh
bin/env_parallel.sh raspbian copy raspbian bin/env_parallel.sh env_parallel.sh bin/env_parallel.sh raspbian copy raspbian bin/env_parallel.sh env_parallel.sh
bin/env_parallel.sh solaris copy solaris bin/env_parallel.sh env_parallel.sh bin/env_parallel.sh solaris copy solaris bin/env_parallel.sh env_parallel.sh
bin/env_parallel.sh openindiana copy openindiana bin/env_parallel.sh env_parallel.sh bin/env_parallel.sh openindiana copy openindiana bin/env_parallel.sh env_parallel.sh
@ -298,12 +277,10 @@ bin/env_parallel.sh netbsd copy netbsd bin/env_parallel.sh env_parallel.sh
bin/env_parallel.sh openbsd copy openbsd bin/env_parallel.sh env_parallel.sh bin/env_parallel.sh openbsd copy openbsd bin/env_parallel.sh env_parallel.sh
bin/env_parallel.sh freebsd copy freebsd bin/env_parallel.sh env_parallel.sh bin/env_parallel.sh freebsd copy freebsd bin/env_parallel.sh env_parallel.sh
bin/env_parallel.sh debian copy debian bin/env_parallel.sh env_parallel.sh bin/env_parallel.sh debian copy debian bin/env_parallel.sh env_parallel.sh
bin/env_parallel.sh hurd copy hurd bin/env_parallel.sh env_parallel.sh
bin/env_parallel.sh minix copy minix bin/env_parallel.sh env_parallel.sh bin/env_parallel.sh minix copy minix bin/env_parallel.sh env_parallel.sh
bin/env_parallel.tcsh qnx copy qnx bin/env_parallel.tcsh env_parallel.tcsh bin/env_parallel.tcsh qnx copy qnx bin/env_parallel.tcsh env_parallel.tcsh
bin/env_parallel.tcsh pidora copy pidora bin/env_parallel.tcsh env_parallel.tcsh bin/env_parallel.tcsh pidora copy pidora bin/env_parallel.tcsh env_parallel.tcsh
bin/env_parallel.tcsh tru64 copy tru64 bin/env_parallel.tcsh env_parallel.tcsh bin/env_parallel.tcsh tru64 copy tru64 bin/env_parallel.tcsh env_parallel.tcsh
bin/env_parallel.tcsh hpux-ia64 copy hpux-ia64 bin/env_parallel.tcsh env_parallel.tcsh
bin/env_parallel.tcsh raspbian copy raspbian bin/env_parallel.tcsh env_parallel.tcsh bin/env_parallel.tcsh raspbian copy raspbian bin/env_parallel.tcsh env_parallel.tcsh
bin/env_parallel.tcsh solaris copy solaris bin/env_parallel.tcsh env_parallel.tcsh bin/env_parallel.tcsh solaris copy solaris bin/env_parallel.tcsh env_parallel.tcsh
bin/env_parallel.tcsh openindiana copy openindiana bin/env_parallel.tcsh env_parallel.tcsh bin/env_parallel.tcsh openindiana copy openindiana bin/env_parallel.tcsh env_parallel.tcsh
@ -324,12 +301,10 @@ bin/env_parallel.tcsh netbsd copy netbsd bin/env_parallel.tcsh env_parallel.tcsh
bin/env_parallel.tcsh openbsd copy openbsd bin/env_parallel.tcsh env_parallel.tcsh bin/env_parallel.tcsh openbsd copy openbsd bin/env_parallel.tcsh env_parallel.tcsh
bin/env_parallel.tcsh freebsd copy freebsd bin/env_parallel.tcsh env_parallel.tcsh bin/env_parallel.tcsh freebsd copy freebsd bin/env_parallel.tcsh env_parallel.tcsh
bin/env_parallel.tcsh debian copy debian bin/env_parallel.tcsh env_parallel.tcsh bin/env_parallel.tcsh debian copy debian bin/env_parallel.tcsh env_parallel.tcsh
bin/env_parallel.tcsh hurd copy hurd bin/env_parallel.tcsh env_parallel.tcsh
bin/env_parallel.tcsh minix copy minix bin/env_parallel.tcsh env_parallel.tcsh bin/env_parallel.tcsh minix copy minix bin/env_parallel.tcsh env_parallel.tcsh
bin/env_parallel.zsh qnx copy qnx bin/env_parallel.zsh env_parallel.zsh bin/env_parallel.zsh qnx copy qnx bin/env_parallel.zsh env_parallel.zsh
bin/env_parallel.zsh pidora copy pidora bin/env_parallel.zsh env_parallel.zsh bin/env_parallel.zsh pidora copy pidora bin/env_parallel.zsh env_parallel.zsh
bin/env_parallel.zsh tru64 copy tru64 bin/env_parallel.zsh env_parallel.zsh bin/env_parallel.zsh tru64 copy tru64 bin/env_parallel.zsh env_parallel.zsh
bin/env_parallel.zsh hpux-ia64 copy hpux-ia64 bin/env_parallel.zsh env_parallel.zsh
bin/env_parallel.zsh raspbian copy raspbian bin/env_parallel.zsh env_parallel.zsh bin/env_parallel.zsh raspbian copy raspbian bin/env_parallel.zsh env_parallel.zsh
bin/env_parallel.zsh solaris copy solaris bin/env_parallel.zsh env_parallel.zsh bin/env_parallel.zsh solaris copy solaris bin/env_parallel.zsh env_parallel.zsh
bin/env_parallel.zsh openindiana copy openindiana bin/env_parallel.zsh env_parallel.zsh bin/env_parallel.zsh openindiana copy openindiana bin/env_parallel.zsh env_parallel.zsh
@ -350,12 +325,10 @@ bin/env_parallel.zsh netbsd copy netbsd bin/env_parallel.zsh env_parallel.zsh
bin/env_parallel.zsh openbsd copy openbsd bin/env_parallel.zsh env_parallel.zsh bin/env_parallel.zsh openbsd copy openbsd bin/env_parallel.zsh env_parallel.zsh
bin/env_parallel.zsh freebsd copy freebsd bin/env_parallel.zsh env_parallel.zsh bin/env_parallel.zsh freebsd copy freebsd bin/env_parallel.zsh env_parallel.zsh
bin/env_parallel.zsh debian copy debian bin/env_parallel.zsh env_parallel.zsh bin/env_parallel.zsh debian copy debian bin/env_parallel.zsh env_parallel.zsh
bin/env_parallel.zsh hurd copy hurd bin/env_parallel.zsh env_parallel.zsh
bin/env_parallel.zsh minix copy minix bin/env_parallel.zsh env_parallel.zsh bin/env_parallel.zsh minix copy minix bin/env_parallel.zsh env_parallel.zsh
bin/parcat qnx copy qnx bin/parcat parcat bin/parcat qnx copy qnx bin/parcat parcat
bin/parcat pidora copy pidora bin/parcat parcat bin/parcat pidora copy pidora bin/parcat parcat
bin/parcat tru64 copy tru64 bin/parcat parcat bin/parcat tru64 copy tru64 bin/parcat parcat
bin/parcat hpux-ia64 copy hpux-ia64 bin/parcat parcat
bin/parcat raspbian copy raspbian bin/parcat parcat bin/parcat raspbian copy raspbian bin/parcat parcat
bin/parcat solaris copy solaris bin/parcat parcat bin/parcat solaris copy solaris bin/parcat parcat
bin/parcat openindiana copy openindiana bin/parcat parcat bin/parcat openindiana copy openindiana bin/parcat parcat
@ -376,7 +349,6 @@ bin/parcat netbsd copy netbsd bin/parcat parcat
bin/parcat openbsd copy openbsd bin/parcat parcat bin/parcat openbsd copy openbsd bin/parcat parcat
bin/parcat freebsd copy freebsd bin/parcat parcat bin/parcat freebsd copy freebsd bin/parcat parcat
bin/parcat debian copy debian bin/parcat parcat bin/parcat debian copy debian bin/parcat parcat
bin/parcat hurd copy hurd bin/parcat parcat
bin/parcat minix copy minix bin/parcat parcat bin/parcat minix copy minix bin/parcat parcat
Done copying Done copying
@ -391,9 +363,8 @@ aix Works on aix7
centos Works on centos.polarhome.com centos Works on centos.polarhome.com
debian Works on debian debian Works on debian
debian-ppc Works on debian-ppc debian-ppc Works on debian-ppc
freebsd Syntax error: Bad fd number freebsd Works on freebsd.polarhome.com
hpux Works on hpux64 hpux Works on hpux64
hpux-ia64 Works on hpux-ia64
macosx Works on macosx.polarhome.com macosx Works on macosx.polarhome.com
mandriva Works on mandriva.polarhome.com mandriva Works on mandriva.polarhome.com
miros Works on miros.polarhome.com miros Works on miros.polarhome.com
@ -402,7 +373,6 @@ openbsd Works on openbsd.polarhome.com
openindiana Works on openindiana openindiana Works on openindiana
pidora Works on pidora pidora Works on pidora
qnx Works on qnx qnx Works on qnx
qnx /bin/sh: >&/dev/null : illegal file descriptor name
qnx parallel: Warning: Cannot figure out number of cpus. Using 1. qnx parallel: Warning: Cannot figure out number of cpus. Using 1.
raspbian Works on raspbian raspbian Works on raspbian
redhat Works on redhat.polarhome.com redhat Works on redhat.polarhome.com
@ -413,7 +383,6 @@ suse Works on suse
tru64 Works on tru64.polarhome.com tru64 Works on tru64.polarhome.com
ubuntu Works on ubuntu ubuntu Works on ubuntu
unixware Works on unixware.polarhome.com unixware Works on unixware.polarhome.com
unixware UX:sh (/bin/sh): ERROR: source: Not found
echo echo
echo '### --number-of-cores/--number-of-cpus should work with no error' echo '### --number-of-cores/--number-of-cpus should work with no error'
echo echo
@ -430,12 +399,13 @@ debian 1
debian 2 debian 2
debian-ppc 1 debian-ppc 1
debian-ppc 1 debian-ppc 1
freebsd Syntax error: Bad fd number freebsd 1
freebsd 1
hpux 1 hpux 1
hpux 1 hpux 1
hpux-ia64 1 hpux-ia64 1
hpux-ia64 1 hpux-ia64 1
macosx 2 macosx 1
macosx 2 macosx 2
mandriva 1 mandriva 1
mandriva 1 mandriva 1
@ -451,7 +421,6 @@ pidora 1
pidora 1 pidora 1
qnx 1 qnx 1
qnx 1 qnx 1
qnx /bin/sh: >&/dev/null : illegal file descriptor name
qnx parallel: Warning: Cannot figure out number of cpus. Using 1. qnx parallel: Warning: Cannot figure out number of cpus. Using 1.
qnx parallel: Warning: Cannot figure out number of cpus. Using 1. qnx parallel: Warning: Cannot figure out number of cpus. Using 1.
raspbian 1 raspbian 1
@ -460,9 +429,9 @@ redhat 1
redhat 2 redhat 2
scosysv 1 scosysv 1
scosysv 1 scosysv 1
solaris
solaris 2 solaris 2
solaris-x86 solaris 2
solaris-x86 1
solaris-x86 1 solaris-x86 1
suse 1 suse 1
suse 1 suse 1
@ -472,7 +441,6 @@ ubuntu 1
ubuntu 2 ubuntu 2
unixware 1 unixware 1
unixware 1 unixware 1
unixware UX:sh (/bin/sh): ERROR: source: Not found
aix 1 aix 1
aix 1 aix 1
centos 1 centos 1
@ -481,7 +449,8 @@ debian 2
debian 2 debian 2
debian-ppc 1 debian-ppc 1
debian-ppc 1 debian-ppc 1
freebsd Syntax error: Bad fd number freebsd 1
freebsd 1
hpux 1 hpux 1
hpux 1 hpux 1
hpux-ia64 2 hpux-ia64 2
@ -502,7 +471,6 @@ pidora 1
pidora 1 pidora 1
qnx 1 qnx 1
qnx 1 qnx 1
qnx /bin/sh: >&/dev/null : illegal file descriptor name
qnx parallel: Warning: Cannot figure out number of cpus. Using 1. qnx parallel: Warning: Cannot figure out number of cpus. Using 1.
qnx parallel: Warning: Cannot figure out number of cpus. Using 1. qnx parallel: Warning: Cannot figure out number of cpus. Using 1.
raspbian 1 raspbian 1
@ -523,7 +491,6 @@ ubuntu 2
ubuntu 2 ubuntu 2
unixware 1 unixware 1
unixware 1 unixware 1
unixware UX:sh (/bin/sh): ERROR: source: Not found
echo echo
echo '### Fails if tmpdir is R/O' echo '### Fails if tmpdir is R/O'
echo echo
@ -542,7 +509,8 @@ debian Error in tempfile() using template /XXXXXXXX.arg: Could not create temp f
debian OK readonly tmp debian OK readonly tmp
debian-ppc Error in tempfile() using template /XXXXXXXX.arg: Could not create temp file /XXXXXXXX.arg: Permission denied at /home/t/tange/bin/parallel line 0000. debian-ppc Error in tempfile() using template /XXXXXXXX.arg: Could not create temp file /XXXXXXXX.arg: Permission denied at /home/t/tange/bin/parallel line 0000.
debian-ppc OK readonly tmp debian-ppc OK readonly tmp
freebsd Syntax error: Bad fd number freebsd Error in tempfile() using template /XXXXXXXX.arg: Could not create temp file /XXXXXXXX.arg: Permission denied at /home/t/tange/bin/parallel line 0000.
freebsd OK readonly tmp
hpux Error in tempfile() using /XXXXXXXX.arg: Could not create temp file /XXXXXXXX.arg: Permission denied at /home/t/tange/bin/parallel line 0000 hpux Error in tempfile() using /XXXXXXXX.arg: Could not create temp file /XXXXXXXX.arg: Permission denied at /home/t/tange/bin/parallel line 0000
hpux OK readonly tmp hpux OK readonly tmp
hpux-ia64 Error in tempfile() using /XXXXXXXX.arg: Parent directory (/) is not writable hpux-ia64 Error in tempfile() using /XXXXXXXX.arg: Parent directory (/) is not writable
@ -566,7 +534,6 @@ pidora Error in tempfile() using template /XXXXXXXX.arg: Could not create temp f
pidora OK readonly tmp pidora OK readonly tmp
qnx Error in tempfile() using /XXXXXXXX.arg: Could not create temp file /XXXXXXXX.arg: Permission denied at /home/t/tange/bin/parallel line 0000 qnx Error in tempfile() using /XXXXXXXX.arg: Could not create temp file /XXXXXXXX.arg: Permission denied at /home/t/tange/bin/parallel line 0000
qnx OK readonly tmp qnx OK readonly tmp
qnx /bin/sh: >&/dev/null : illegal file descriptor name
raspbian Error in tempfile() using /XXXXXXXX.arg: Could not create temp file /XXXXXXXX.arg: Permission denied at /home/t/tange/bin/parallel line 0000 raspbian Error in tempfile() using /XXXXXXXX.arg: Could not create temp file /XXXXXXXX.arg: Permission denied at /home/t/tange/bin/parallel line 0000
raspbian OK readonly tmp raspbian OK readonly tmp
redhat Error in tempfile() using /XXXXXXXX.arg: Could not create temp file /XXXXXXXX.arg: Permission denied at /home/t/tange/bin/parallel line 0000 redhat Error in tempfile() using /XXXXXXXX.arg: Could not create temp file /XXXXXXXX.arg: Permission denied at /home/t/tange/bin/parallel line 0000
@ -577,7 +544,7 @@ scosysv OK readonly tmp
solaris Error in tempfile() using /XXXXXXXX.arg: Parent directory (/) is not writable solaris Error in tempfile() using /XXXXXXXX.arg: Parent directory (/) is not writable
solaris at /home/t/tange/bin/parallel line 0000 solaris at /home/t/tange/bin/parallel line 0000
solaris OK readonly tmp solaris OK readonly tmp
solaris-x86 Error in tempfile() using /XXXXXXXX.arg: Could not create temp file /XXXXXXXX.arg: Permission denied at /home/tange/bin/parallel line 0000 solaris-x86 Error in tempfile() using /XXXXXXXX.arg: Could not create temp file /XXXXXXXX.arg: Permission denied at ~/bin/parallel line 0000
solaris-x86 OK readonly tmp solaris-x86 OK readonly tmp
suse Error in tempfile() using /XXXXXXXX.arg: Could not create temp file /XXXXXXXX.arg: Permission denied at /home/t/tange/bin/parallel line 0000. suse Error in tempfile() using /XXXXXXXX.arg: Could not create temp file /XXXXXXXX.arg: Permission denied at /home/t/tange/bin/parallel line 0000.
suse OK readonly tmp suse OK readonly tmp
@ -588,7 +555,6 @@ ubuntu Error in tempfile() using template /XXXXXXXX.arg: Could not create temp f
ubuntu OK readonly tmp ubuntu OK readonly tmp
unixware Error in tempfile() using /XXXXXXXX.arg: Could not create temp file /XXXXXXXX.arg: Permission denied at /home/t/tange/bin/parallel line 0000 unixware Error in tempfile() using /XXXXXXXX.arg: Could not create temp file /XXXXXXXX.arg: Permission denied at /home/t/tange/bin/parallel line 0000
unixware OK readonly tmp unixware OK readonly tmp
unixware UX:sh (/bin/sh): ERROR: source: Not found
echo echo
echo '### Does exporting a bash function make parallel fail?' echo '### Does exporting a bash function make parallel fail?'
echo 'If login shell is not bash compatible it fails' echo 'If login shell is not bash compatible it fails'
@ -599,7 +565,7 @@ unixware UX:sh (/bin/sh): ERROR: source: Not found
cat <(echo bash only A) cat <(echo bash only A)
} }
export -f funcA; export -f funcA;
bin/parallel funcA ::: 1' 2>&1 | sort bin/parallel funcA ::: 1' 2>&1 | LANG=C sort
### Does exporting a bash function make parallel fail? ### Does exporting a bash function make parallel fail?
If login shell is not bash compatible it fails If login shell is not bash compatible it fails
@ -612,7 +578,8 @@ debian bash only A
debian test funcA debian test funcA
debian-ppc bash only A debian-ppc bash only A
debian-ppc test funcA debian-ppc test funcA
freebsd Syntax error: Bad fd number freebsd Syntax error: "(" unexpected (expecting word)
freebsd test funcA
hpux bash only A hpux bash only A
hpux test funcA hpux test funcA
hpux-ia64 bash only A hpux-ia64 bash only A
@ -653,7 +620,6 @@ tru64 test funcA
ubuntu bash only A ubuntu bash only A
ubuntu test funcA ubuntu test funcA
unixware UX:sh (/bin/sh): ERROR: /bin/sh: Syntax error at line 3: `(' unexpected unixware UX:sh (/bin/sh): ERROR: /bin/sh: Syntax error at line 3: `(' unexpected
unixware UX:sh (/bin/sh): ERROR: source: Not found
unixware test funcA unixware test funcA
echo echo
echo '### Does PARALLEL_SHELL help exporting a bash function' echo '### Does PARALLEL_SHELL help exporting a bash function'
@ -725,16 +691,12 @@ ubuntu bash only B
unixware test funcB unixware test funcB
unixware bash only B unixware bash only B
echo echo
echo '### env_parallel echo :::: <(echo OK)' echo '### env_parallel --install'
echo '(bash ksh mksh zsh only)' echo '(bash ksh mksh zsh only)'
echo echo
par_nonall 'bin/env_parallel --install && echo install-OK' 2>&1 par_nonall 'bin/env_parallel --install && echo install-OK' 2>&1
par_nonall 'env_parallel echo env_parallel ::: run-OK' 2>&1
# csh on NetBSD does not support process substitution
par_nonall 'env_parallel echo reading from process substitution :::: <(echo OK)' 2>&1 |
grep -v ': /tmp/.*: No such file or directory'
### env_parallel echo :::: <(echo OK) ### env_parallel --install
(bash ksh mksh zsh only) (bash ksh mksh zsh only)
aix Installed env_parallel in: aix Installed env_parallel in:
@ -781,7 +743,17 @@ debian-ppc /home/t/tange/.profile
debian-ppc /home/t/tange/.cshrc debian-ppc /home/t/tange/.cshrc
debian-ppc /home/t/tange/.tcshrc debian-ppc /home/t/tange/.tcshrc
debian-ppc install-OK debian-ppc install-OK
freebsd Syntax error: Bad fd number freebsd Installed env_parallel in:
freebsd /home/t/tange/.bashrc
freebsd /home/t/tange/.shrc
freebsd /home/t/tange/.zshenv
freebsd /home/t/tange/.config/fish/config.fish
freebsd /home/t/tange/.kshrc
freebsd /home/t/tange/.mkshrc
freebsd /home/t/tange/.profile
freebsd /home/t/tange/.cshrc
freebsd /home/t/tange/.tcshrc
freebsd install-OK
hpux Installed env_parallel in: hpux Installed env_parallel in:
hpux /home/t/tange/.bashrc hpux /home/t/tange/.bashrc
hpux /home/t/tange/.shrc hpux /home/t/tange/.shrc
@ -893,7 +865,6 @@ qnx /home/t/tange/.profile
qnx /home/t/tange/.cshrc qnx /home/t/tange/.cshrc
qnx /home/t/tange/.tcshrc qnx /home/t/tange/.tcshrc
qnx install-OK qnx install-OK
qnx /bin/sh: >&/dev/null : illegal file descriptor name
raspbian Installed env_parallel in: raspbian Installed env_parallel in:
raspbian /home/t/tange/.bashrc raspbian /home/t/tange/.bashrc
raspbian /home/t/tange/.shrc raspbian /home/t/tange/.shrc
@ -939,15 +910,15 @@ solaris /home/t/tange/.cshrc
solaris /home/t/tange/.tcshrc solaris /home/t/tange/.tcshrc
solaris install-OK solaris install-OK
solaris-x86 Installed env_parallel in: solaris-x86 Installed env_parallel in:
solaris-x86 /home/tange/.bashrc solaris-x86 ~/.bashrc
solaris-x86 /home/tange/.shrc solaris-x86 ~/.shrc
solaris-x86 /home/tange/.zshenv solaris-x86 ~/.zshenv
solaris-x86 /home/tange/.config/fish/config.fish solaris-x86 ~/.config/fish/config.fish
solaris-x86 /home/tange/.kshrc solaris-x86 ~/.kshrc
solaris-x86 /home/tange/.mkshrc solaris-x86 ~/.mkshrc
solaris-x86 /home/tange/.profile solaris-x86 ~/.profile
solaris-x86 /home/tange/.cshrc solaris-x86 ~/.cshrc
solaris-x86 /home/tange/.tcshrc solaris-x86 ~/.tcshrc
solaris-x86 install-OK solaris-x86 install-OK
suse Installed env_parallel in: suse Installed env_parallel in:
suse /home/t/tange/.bashrc suse /home/t/tange/.bashrc
@ -993,12 +964,21 @@ unixware /home/t/tange/.profile
unixware /home/t/tange/.cshrc unixware /home/t/tange/.cshrc
unixware /home/t/tange/.tcshrc unixware /home/t/tange/.tcshrc
unixware install-OK unixware install-OK
unixware UX:sh (/bin/sh): ERROR: source: Not found echo
echo '### env_parallel echo env_parallel ::: run-OK'
echo '(bash ksh mksh zsh only)'
echo
par_nonall 'env_parallel echo env_parallel ::: run-OK' 2>&1
### env_parallel echo env_parallel ::: run-OK
(bash ksh mksh zsh only)
aix env_parallel run-OK aix env_parallel run-OK
centos env_parallel run-OK centos env_parallel run-OK
debian env_parallel run-OK debian env_parallel run-OK
debian-ppc env_parallel run-OK debian-ppc env_parallel run-OK
freebsd Syntax error: Bad fd number freebsd env_parallel run-OK
freebsd Cannot fork: Resource temporarily unavailable
hpux env_parallel run-OK hpux env_parallel run-OK
hpux-ia64 env_parallel run-OK hpux-ia64 env_parallel run-OK
macosx env_parallel run-OK macosx env_parallel run-OK
@ -1009,7 +989,6 @@ openbsd env_parallel run-OK
openindiana env_parallel run-OK openindiana env_parallel run-OK
pidora env_parallel run-OK pidora env_parallel run-OK
qnx env_parallel run-OK qnx env_parallel run-OK
qnx /bin/sh: >&/dev/null : illegal file descriptor name
qnx /bin/sh: compgen: cannot execute - No such file or directory qnx /bin/sh: compgen: cannot execute - No such file or directory
qnx /bin/sh: compgen: cannot execute - No such file or directory qnx /bin/sh: compgen: cannot execute - No such file or directory
qnx /bin/sh: compgen: cannot execute - No such file or directory qnx /bin/sh: compgen: cannot execute - No such file or directory
@ -1024,7 +1003,17 @@ suse env_parallel run-OK
tru64 env_parallel run-OK tru64 env_parallel run-OK
ubuntu env_parallel run-OK ubuntu env_parallel run-OK
unixware env_parallel run-OK unixware env_parallel run-OK
unixware UX:sh (/bin/sh): ERROR: source: Not found echo
echo '### env_parallel echo reading from process substitution :::: <(echo OK)'
echo '(bash ksh mksh zsh only)'
echo
# csh on NetBSD does not support process substitution
par_nonall 'env_parallel echo reading from process substitution :::: <(echo OK)' 2>&1 |
grep -v ': /tmp/.*: No such file or directory'
### env_parallel echo reading from process substitution :::: <(echo OK)
(bash ksh mksh zsh only)
aix reading from process substitution OK aix reading from process substitution OK
centos reading from process substitution OK centos reading from process substitution OK
debian reading from process substitution OK debian reading from process substitution OK
@ -1051,7 +1040,10 @@ suse reading from process substitution OK
tru64 reading from process substitution OK tru64 reading from process substitution OK
ubuntu reading from process substitution OK ubuntu reading from process substitution OK
unixware UX:sh (/bin/sh): ERROR: /bin/sh: Syntax error at line 1: `(' unexpected unixware UX:sh (/bin/sh): ERROR: /bin/sh: Syntax error at line 1: `(' unexpected
# Test empty command name in process list echo
echo '### Test empty command name in process list'
echo '(bash ksh mksh zsh only)'
echo
test_empty_cmd() { test_empty_cmd() {
echo '### Test if empty command name in process list causes problems' echo '### Test if empty command name in process list causes problems'
perl -e '$0=" ";sleep 1000' & perl -e '$0=" ";sleep 1000' &
@ -1062,6 +1054,10 @@ unixware UX:sh (/bin/sh): ERROR: /bin/sh: Syntax error at line 1: `(' unexpected
export -f test_empty_cmd export -f test_empty_cmd
export PARALLEL_SHELL=bin/bash export PARALLEL_SHELL=bin/bash
PARALLEL='--env test_empty_cmd' par_nonall test_empty_cmd 2>&1 PARALLEL='--env test_empty_cmd' par_nonall test_empty_cmd 2>&1
### Test empty command name in process list
(bash ksh mksh zsh only)
aix ### Test if empty command name in process list causes problems aix ### Test if empty command name in process list causes problems
aix OK_with_empty_cmd aix OK_with_empty_cmd
centos ### Test if empty command name in process list causes problems centos ### Test if empty command name in process list causes problems
@ -1127,7 +1123,7 @@ aix 1 2 1 2 3 1 2 3 4
centos 1 2 1 2 3 1 2 3 4 centos 1 2 1 2 3 1 2 3 4
debian 1 2 1 2 3 1 2 3 4 debian 1 2 1 2 3 1 2 3 4
debian-ppc 1 2 1 2 3 1 2 3 4 debian-ppc 1 2 1 2 3 1 2 3 4
freebsd Syntax error: Bad fd number freebsd eval: 1: Syntax error: word unexpected (expecting ")")
hpux hpux
hpux-ia64 1 2 1 2 3 1 2 3 4 hpux-ia64 1 2 1 2 3 1 2 3 4
macosx 1 2 1 2 3 1 2 3 4 macosx 1 2 1 2 3 1 2 3 4
@ -1139,7 +1135,6 @@ openbsd
openindiana 1 2 1 2 3 1 2 3 4 openindiana 1 2 1 2 3 1 2 3 4
pidora 1 2 1 2 3 1 2 3 4 pidora 1 2 1 2 3 1 2 3 4
qnx qnx
qnx /bin/sh: >&/dev/null : illegal file descriptor name
qnx parallel: Warning: Cannot figure out number of cpus. Using 1. qnx parallel: Warning: Cannot figure out number of cpus. Using 1.
qnx /bin/sh: syntax error: `(' unexpected qnx /bin/sh: syntax error: `(' unexpected
raspbian 1 2 1 2 3 1 2 3 4 raspbian 1 2 1 2 3 1 2 3 4
@ -1150,14 +1145,17 @@ solaris-x86 1 2 1 2 3 1 2 3 4
suse 1 2 1 2 3 1 2 3 4 suse 1 2 1 2 3 1 2 3 4
tru64 1 2 1 2 3 1 2 3 4 tru64 1 2 1 2 3 1 2 3 4
ubuntu 1 2 1 2 3 1 2 3 4 ubuntu 1 2 1 2 3 1 2 3 4
unixware UX:sh (/bin/sh): ERROR: source: Not found
unixware UX:sh (/bin/sh): ERROR: /bin/sh: Syntax error at line 1: `arr=' unexpected unixware UX:sh (/bin/sh): ERROR: /bin/sh: Syntax error at line 1: `arr=' unexpected
### env_parset arr seq ::: 2 3 4 ### env_parset arr seq ::: 2 3 4
aix 2 2 3 2 3 4 aix 2 2 3 2 3 4
centos 2 2 3 2 3 4 centos 2 2 3 2 3 4
debian 2 2 3 2 3 4 debian 2 2 3 2 3 4
debian-ppc 2 2 3 2 3 4 debian-ppc 2 2 3 2 3 4
freebsd Syntax error: Bad fd number freebsd Cannot fork: Resource temporarily unavailable
freebsd Cannot fork: Resource temporarily unavailable
freebsd Cannot fork: Resource temporarily unavailable
freebsd Cannot fork: Resource temporarily unavailable
freebsd eval: 1: Syntax error: word unexpected (expecting ")")
hpux hpux
hpux-ia64 1 2 1 2 1 2 hpux-ia64 1 2 1 2 1 2
macosx 2 2 3 2 3 4 macosx 2 2 3 2 3 4
@ -1170,7 +1168,6 @@ openbsd
openindiana 2 2 3 2 3 4 openindiana 2 2 3 2 3 4
pidora 2 2 3 2 3 4 pidora 2 2 3 2 3 4
qnx qnx
qnx /bin/sh: >&/dev/null : illegal file descriptor name
qnx /bin/sh: compgen: cannot execute - No such file or directory qnx /bin/sh: compgen: cannot execute - No such file or directory
qnx /bin/sh: compgen: cannot execute - No such file or directory qnx /bin/sh: compgen: cannot execute - No such file or directory
qnx /bin/sh: compgen: cannot execute - No such file or directory qnx /bin/sh: compgen: cannot execute - No such file or directory
@ -1184,7 +1181,6 @@ solaris-x86 2 2 3 2 3 4
suse 2 2 3 2 3 4 suse 2 2 3 2 3 4
tru64 2 2 3 2 3 4 tru64 2 2 3 2 3 4
ubuntu 2 2 3 2 3 4 ubuntu 2 2 3 2 3 4
unixware UX:sh (/bin/sh): ERROR: source: Not found
unixware UX:sh (/bin/sh): ERROR: /bin/sh: Syntax error at line 1: `arr=' unexpected unixware UX:sh (/bin/sh): ERROR: /bin/sh: Syntax error at line 1: `arr=' unexpected
echo echo
echo '### parset var1,var2,var3 seq ::: 2 3 4' echo '### parset var1,var2,var3 seq ::: 2 3 4'
@ -1202,7 +1198,7 @@ aix 1 2,1 2 3,1 2 3 4
centos 1 2,1 2 3,1 2 3 4 centos 1 2,1 2 3,1 2 3 4
debian 1 2,1 2 3,1 2 3 4 debian 1 2,1 2 3,1 2 3 4
debian-ppc 1 2,1 2 3,1 2 3 4 debian-ppc 1 2,1 2 3,1 2 3 4
freebsd Syntax error: Bad fd number freebsd 1 2,1 2 3,1 2 3 4
hpux ,, hpux ,,
hpux-ia64 1 2,1 2 3,1 2 3 4 hpux-ia64 1 2,1 2 3,1 2 3 4
macosx 1 2,1 2 3,1 2 3 4 macosx 1 2,1 2 3,1 2 3 4
@ -1214,7 +1210,6 @@ openbsd ,,
openindiana 1 2,1 2 3,1 2 3 4 openindiana 1 2,1 2 3,1 2 3 4
pidora 1 2,1 2 3,1 2 3 4 pidora 1 2,1 2 3,1 2 3 4
qnx ,, qnx ,,
qnx /bin/sh: >&/dev/null : illegal file descriptor name
qnx parallel: Warning: Cannot figure out number of cpus. Using 1. qnx parallel: Warning: Cannot figure out number of cpus. Using 1.
qnx parallel: Warning: Cannot figure out number of cpus. Using 1. qnx parallel: Warning: Cannot figure out number of cpus. Using 1.
raspbian 1 2,1 2 3,1 2 3 4 raspbian 1 2,1 2 3,1 2 3 4
@ -1226,13 +1221,17 @@ suse 1 2,1 2 3,1 2 3 4
tru64 1 2,1 2 3,1 2 3 4 tru64 1 2,1 2 3,1 2 3 4
ubuntu 1 2,1 2 3,1 2 3 4 ubuntu 1 2,1 2 3,1 2 3 4
unixware 1 2,1 2 3,1 2 3 4 unixware 1 2,1 2 3,1 2 3 4
unixware UX:sh (/bin/sh): ERROR: source: Not found
### env_parset var1,var2,var3 seq ::: 2 3 4 ### env_parset var1,var2,var3 seq ::: 2 3 4
aix 2,2 3,2 3 4 aix 2,2 3,2 3 4
centos 2,2 3,2 3 4 centos 2,2 3,2 3 4
debian 2,2 3,2 3 4 debian 2,2 3,2 3 4
debian-ppc 2,2 3,2 3 4 debian-ppc 2,2 3,2 3 4
freebsd Syntax error: Bad fd number freebsd 2,2 3,2 3 4
freebsd Cannot fork: Resource temporarily unavailable
freebsd Cannot fork: Resource temporarily unavailable
freebsd Cannot fork: Resource temporarily unavailable
freebsd Cannot fork: Resource temporarily unavailable
freebsd Cannot fork: Resource temporarily unavailable
hpux ,, hpux ,,
hpux-ia64 1 2,1 2,1 2 hpux-ia64 1 2,1 2,1 2
macosx 2,2 3,2 3 4 macosx 2,2 3,2 3 4
@ -1245,7 +1244,6 @@ openbsd ,,
openindiana 2,2 3,2 3 4 openindiana 2,2 3,2 3 4
pidora 2,2 3,2 3 4 pidora 2,2 3,2 3 4
qnx ,, qnx ,,
qnx /bin/sh: >&/dev/null : illegal file descriptor name
qnx /bin/sh: compgen: cannot execute - No such file or directory qnx /bin/sh: compgen: cannot execute - No such file or directory
qnx /bin/sh: compgen: cannot execute - No such file or directory qnx /bin/sh: compgen: cannot execute - No such file or directory
qnx /bin/sh: compgen: cannot execute - No such file or directory qnx /bin/sh: compgen: cannot execute - No such file or directory
@ -1260,4 +1258,3 @@ suse 2,2 3,2 3 4
tru64 2,2 3,2 3 4 tru64 2,2 3,2 3 4
ubuntu 2,2 3,2 3 4 ubuntu 2,2 3,2 3 4
unixware 2,2 3,2 3 4 unixware 2,2 3,2 3 4
unixware UX:sh (/bin/sh): ERROR: source: Not found