parallel: Implemented --termseq.

This commit is contained in:
Ole Tange 2015-06-22 02:30:30 +02:00
parent 2029853dd9
commit 210e9db387
2 changed files with 72 additions and 55 deletions

View file

@ -795,6 +795,7 @@ sub options_hash {
"memfree=s" => \$opt::memfree, "memfree=s" => \$opt::memfree,
"retries=i" => \$opt::retries, "retries=i" => \$opt::retries,
"timeout=s" => \$opt::timeout, "timeout=s" => \$opt::timeout,
"termseq|term-seq=s" => \$opt::termseq,
# xargs-compatibility - implemented, man, testsuite # xargs-compatibility - implemented, man, testsuite
"max-procs|P=s" => \$opt::jobs, "max-procs|P=s" => \$opt::jobs,
"delimiter|d=s" => \$opt::d, "delimiter|d=s" => \$opt::d,
@ -1649,67 +1650,67 @@ sub shell_quote {
: (join" ",map { shell_quote_scalar($_) } @_); : (join" ",map { shell_quote_scalar($_) } @_);
} }
sub shell_quote_scalar_rc { sub shell_quote_scalar_rc {
# Quote for the rc-shell # Quote for the rc-shell
my $a = $_[0]; my $a = $_[0];
if(defined $a) { if(defined $a) {
if(($a =~ s/'/''/g) if(($a =~ s/'/''/g)
+ +
($a =~ s/[\n\002-\011\013-\032\\\#\?\`\(\)\{\}\[\]\^\*\<\=\>\~\|\; \"\!\$\&\'\202-\377]+/'$&'/go)) { ($a =~ s/[\n\002-\011\013-\032\\\#\?\`\(\)\{\}\[\]\^\*\<\=\>\~\|\; \"\!\$\&\'\202-\377]+/'$&'/go)) {
# A string was replaced # A string was replaced
# No need to test for "" or \0 # No need to test for "" or \0
} elsif($a eq "") { } elsif($a eq "") {
$a = "''"; $a = "''";
} elsif($a eq "\0") { } elsif($a eq "\0") {
$a = ""; $a = "";
}
} }
return $a;
} }
return $a;
}
sub shell_quote_scalar_csh { sub shell_quote_scalar_csh {
# Quote for (t)csh # Quote for (t)csh
my $a = $_[0]; my $a = $_[0];
if(defined $a) { if(defined $a) {
# $a =~ s/([\002-\011\013-\032\\\#\?\`\(\)\{\}\[\]\^\*\>\<\~\|\; \"\!\$\&\'\202-\377])/\\$1/g; # $a =~ s/([\002-\011\013-\032\\\#\?\`\(\)\{\}\[\]\^\*\>\<\~\|\; \"\!\$\&\'\202-\377])/\\$1/g;
# This is 1% faster than the above # This is 1% faster than the above
if(($a =~ s/[\002-\011\013-\032\\\#\?\`\(\)\{\}\[\]\^\*\<\=\>\~\|\; \"\!\$\&\'\202-\377]/\\$&/go) if(($a =~ s/[\002-\011\013-\032\\\#\?\`\(\)\{\}\[\]\^\*\<\=\>\~\|\; \"\!\$\&\'\202-\377]/\\$&/go)
+ +
# quote newline in csh as \\\n # quote newline in csh as \\\n
($a =~ s/[\n]/"\\\n"/go)) { ($a =~ s/[\n]/"\\\n"/go)) {
# A string was replaced # A string was replaced
# No need to test for "" or \0 # No need to test for "" or \0
} elsif($a eq "") { } elsif($a eq "") {
$a = "''"; $a = "''";
} elsif($a eq "\0") { } elsif($a eq "\0") {
$a = ""; $a = "";
}
} }
return $a;
} }
return $a;
}
sub shell_quote_scalar_default { sub shell_quote_scalar_default {
# Quote for other shells # Quote for other shells
my $a = $_[0]; my $a = $_[0];
if(defined $a) { if(defined $a) {
# zsh wants '=' quoted # zsh wants '=' quoted
# Solaris sh wants ^ quoted. # Solaris sh wants ^ quoted.
# $a =~ s/([\002-\011\013-\032\\\#\?\`\(\)\{\}\[\]\^\*\>\<\~\|\; \"\!\$\&\'\202-\377])/\\$1/g; # $a =~ s/([\002-\011\013-\032\\\#\?\`\(\)\{\}\[\]\^\*\>\<\~\|\; \"\!\$\&\'\202-\377])/\\$1/g;
# This is 1% faster than the above # This is 1% faster than the above
if(($a =~ s/[\002-\011\013-\032\\\#\?\`\(\)\{\}\[\]\^\*\<\=\>\~\|\; \"\!\$\&\'\202-\377]/\\$&/go) if(($a =~ s/[\002-\011\013-\032\\\#\?\`\(\)\{\}\[\]\^\*\<\=\>\~\|\; \"\!\$\&\'\202-\377]/\\$&/go)
+ +
# quote newline as '\n' # quote newline as '\n'
($a =~ s/[\n]/'\n'/go)) { ($a =~ s/[\n]/'\n'/go)) {
# A string was replaced # A string was replaced
# No need to test for "" or \0 # No need to test for "" or \0
} elsif($a eq "") { } elsif($a eq "") {
$a = "''"; $a = "''";
} elsif($a eq "\0") { } elsif($a eq "\0") {
$a = ""; $a = "";
}
} }
return $a;
} }
return $a;
}
sub shell_quote_scalar { sub shell_quote_scalar {
# Quote the string so the shell will not expand any special chars # Quote the string so the shell will not expand any special chars
@ -3217,13 +3218,15 @@ sub kill_sleep_seq {
# @pids = list of pids that are also processgroups # @pids = list of pids that are also processgroups
# Convert pids to process groups ($processgroup = -$pid) # Convert pids to process groups ($processgroup = -$pid)
my @pgrps = map { -$_ } @_; my @pgrps = map { -$_ } @_;
my @term_seq = ("TERM",200,"TERM",100,"TERM",50,"KILL",25); my @term_seq = split/,/,$opt::termseq;
if(not @term_seq) {
@term_seq = ("TERM",200,"TERM",100,"TERM",50,"KILL",25);
}
while(@term_seq) { while(@term_seq) {
@pgrps = kill_sleep(shift @term_seq, shift @term_seq, @pgrps); @pgrps = kill_sleep(shift @term_seq, shift @term_seq, @pgrps);
} }
} }
sub kill_sleep { sub kill_sleep {
my ($signal, $sleep_max, @pids) = @_; my ($signal, $sleep_max, @pids) = @_;
::debug("kill","kill_sleep $signal ",(join " ",sort @pids),"\n"); ::debug("kill","kill_sleep $signal ",(join " ",sort @pids),"\n");

View file

@ -1916,6 +1916,20 @@ I<str> and TAB (\t). I<str> can contain replacement strings such as
B<--tagstring> is ignored when using B<-u>, B<--onall>, and B<--nonall>. B<--tagstring> is ignored when using B<-u>, B<--onall>, and B<--nonall>.
=item B<--termseq> I<sequence> (alpha testing)
Termination sequence. When a job is killed due to B<--timeout>,
B<--memfree>, or abnormal termination of GNU B<parallel>, I<sequence>
determines how the job is killed. The default is:
TERM,200,TERM,100,TERM,50,KILL,25
which sends a TERM signal, waits 200 ms, sends another TERM signal,
waits 100 ms, sends another TERM signal, waits 50 ms, sends a KILL
signal, waits 25 ms, and exits. GNU B<parallel> discovers if a process
dies before the waiting time is up.
=item B<--tmpdir> I<dirname> =item B<--tmpdir> I<dirname>
Directory for temporary files. GNU B<parallel> normally buffers output Directory for temporary files. GNU B<parallel> normally buffers output