parallel: --halt 10% allows up to 10% of jobs to fail (though min. 3).

This commit is contained in:
Ole Tange 2014-07-19 08:53:46 +02:00
parent 5372383da2
commit c7cf5b17fd
2 changed files with 17 additions and 6 deletions

View file

@ -237,11 +237,13 @@ New in this release:
* Positional perl expressions (similar to {2}) are given as {=2 perl expression=} where 2 is the position. * Positional perl expressions (similar to {2}) are given as {=2 perl expression=} where 2 is the position.
* One small backwards incompatability: {1}_{2} will replace {2} with the empty string if there is only one argument. Previously {2} would have been left untouched.
* Replacement strings can be defined using --rpl. E.g. parallel --rpl '{.gz} s/\.gz$//' echo {.gz} ::: *.gz * Replacement strings can be defined using --rpl. E.g. parallel --rpl '{.gz} s/\.gz$//' echo {.gz} ::: *.gz
* The parenthesis around {= perl expression =} can be changed with --parens. * The parenthesis around {= perl expression =} can be changed with --parens.
* --tmux will direct the output to a tmux session instead of files. * --tmux will direct the output to a tmux session instead of files. Each running jobs will be in its own window.
* GNU Parallel was cited in: bammds: A tool for assessing the ancestry of low depth whole genome data using multidimensional scaling (MDS) http://bioinformatics.oxfordjournals.org/content/early/2014/06/28/bioinformatics.btu410.abstract * GNU Parallel was cited in: bammds: A tool for assessing the ancestry of low depth whole genome data using multidimensional scaling (MDS) http://bioinformatics.oxfordjournals.org/content/early/2014/06/28/bioinformatics.btu410.abstract
@ -251,7 +253,7 @@ New in this release:
* GNU Parallel was cited in: Web-scale Content Reuse Detection www.isi.edu/~johnh/PAPERS/Ardi14a.pdf * GNU Parallel was cited in: Web-scale Content Reuse Detection www.isi.edu/~johnh/PAPERS/Ardi14a.pdf
* Webcast at 2014-08-20 covering GNU Parallel: Data Science at the Command Line http://www.oreilly.com/pub/e/3115 * Tell your friends to sign up for the Webcast at 2014-08-20 covering GNU Parallel: Data Science at the Command Line http://www.oreilly.com/pub/e/3115
* GNU Parallel all the things! http://longwayaround.org.uk/notes/gnu-parallel-all-the-things/ * GNU Parallel all the things! http://longwayaround.org.uk/notes/gnu-parallel-all-the-things/
@ -265,6 +267,8 @@ New in this release:
* [原] Ubuntu 下使用 parallel 命令的注意事项 http://blog.ailms.me/2014/06/28/ubuntu-with-parallel.html * [原] Ubuntu 下使用 parallel 命令的注意事项 http://blog.ailms.me/2014/06/28/ubuntu-with-parallel.html
* 简单的并行, 可使用GNU parallel http://jerkwin.github.io/2014/06/10/GNU-parallel/
* Bug fixes and man page updates. * Bug fixes and man page updates.
GNU Parallel - For people who live life in the parallel lane. GNU Parallel - For people who live life in the parallel lane.

View file

@ -617,7 +617,7 @@ sub options_hash {
"compress" => \$opt::compress, "compress" => \$opt::compress,
"tty" => \$opt::tty, "tty" => \$opt::tty,
"T" => \$opt::retired, "T" => \$opt::retired,
"halt-on-error|halt=i" => \$opt::halt_on_error, "halt-on-error|halt=s" => \$opt::halt_on_error,
"H=i" => \$opt::retired, "H=i" => \$opt::retired,
"retries=i" => \$opt::retries, "retries=i" => \$opt::retries,
"dry-run|dryrun" => \$opt::dryrun, "dry-run|dryrun" => \$opt::dryrun,
@ -720,7 +720,7 @@ sub get_options_from_array {
sub parse_options { sub parse_options {
# Returns: N/A # Returns: N/A
# Defaults: # Defaults:
$Global::version = 20140714; $Global::version = 20140719;
$Global::progname = 'parallel'; $Global::progname = 'parallel';
$Global::infinity = 2**31; $Global::infinity = 2**31;
$Global::debug = 0; $Global::debug = 0;
@ -834,6 +834,7 @@ sub parse_options {
if(defined $opt::fg) { $Global::semaphore = 1; } if(defined $opt::fg) { $Global::semaphore = 1; }
if(defined $opt::bg) { $Global::semaphore = 1; } if(defined $opt::bg) { $Global::semaphore = 1; }
if(defined $opt::wait) { $Global::semaphore = 1; } if(defined $opt::wait) { $Global::semaphore = 1; }
if(defined $opt::halt_on_error and $opt::halt_on_error=~/%/) { $opt::halt_on_error /= 100; }
if(defined $opt::timeout and $opt::timeout !~ /^\d+(\.\d+)?%?$/) { if(defined $opt::timeout and $opt::timeout !~ /^\d+(\.\d+)?%?$/) {
::error("--timeout must be seconds or percentage\n"); ::error("--timeout must be seconds or percentage\n");
wait_and_exit(255); wait_and_exit(255);
@ -2434,9 +2435,15 @@ sub reaper {
if($job->exitstatus()) { if($job->exitstatus()) {
# The jobs had a exit status <> 0, so error # The jobs had a exit status <> 0, so error
$Global::exitstatus++; $Global::exitstatus++;
$Global::total_failed++;
if($opt::halt_on_error) { if($opt::halt_on_error) {
if($opt::halt_on_error == 1) { if($opt::halt_on_error == 1
# If halt on error == 1 we should gracefully exit or
($opt::halt_on_error < 1 and $Global::total_failed > 1
and
$Global::total_failed / $Global::total_started > $opt::halt_on_error)) {
# If halt on error == 1 or --halt 10%
# we should gracefully exit
print $Global::original_stderr print $Global::original_stderr
("$Global::progname: Starting no more jobs. ", ("$Global::progname: Starting no more jobs. ",
"Waiting for ", scalar(keys %Global::running), "Waiting for ", scalar(keys %Global::running),