#!/bin/bash declare nb_proc declare nb_runs=1 declare cmdline declare flag_help=false ## Func defs print_help () { cat << EOF Run the command in pararrel ensuring the number of sucessful exits. Usage: $1 <OPTIONS> <CMDLINE> Options: -h print this message and exit gracefully -p number of processes to spawn (required) -n number of successful run to count (default: 1) EOF } parse_params () { local name local delta while getopts "hp:n:" name do case "$name" in h) flag_help=true ;; p) let "nb_proc=$OPTARG" ;; n) let "nb_runs=$OPTARG" ;; '?') exit 2;; esac done let "delta = OPTIND - 1" shift $delta cmdline="$@" } spwan_one () { $cmdline & } main () { local procs local ec local good_runs=0 local children # spwan initial processes for (( procs = 0; procs < nb_proc; procs += 1 )) do spwan_one done while true do wait -n ec=$? echo $ec if [ $ec -eq 0 ]; then let "good_runs += 1" if [ $good_runs -ge $nb_runs ]; then break else spwan_one fi elif [ $ec -ne 3 ]; then # error occurred or no more child left. do not continue break fi done children="$(jobs -p)" [ ! -z "$children" ] && kill -TERM $children 2> /dev/null > /dev/null while wait -n; do : ; done return $ec } ## Init script parse_params $@ ## Parametre check if $flag_help; then print_help exit 0 fi if [ -z "$nb_proc" ]; then cat << EOF >&2 -p option not set. Run with -h option for help. EOF exit 2 fi if [ -z "$cmdline" ]; then cat << EOF >&2 CMDLINE not set. Run with -h option for help. EOF fi ## Main start main