如何并行运行bash脚本

时间:2019-04-17 14:00:37

标签: python-3.x python-multiprocessing

我有一系列250个bash脚本,需要并行执行。每个脚本使用大约1个内核,因此我不想同时执行它们。我想同时运行10个脚本,每当一个脚本执行完后,都要执行另一个脚本。

1 个答案:

答案 0 :(得分:1)

我推荐parallel,但我将发布这种怪诞是为了让人们将其拆开并进行调整。 :)

#! /bin/env bash

## TODO: this documentation block needs to be expanded.
use="

  $0 <#procs> <cmdfile>

  Pass the number of desired processes to prespawn as the 1st argument.
  Pass the command file with the list of tasks you need done.

  Command file format:
   KEYSTRING:cmdlist

  where KEYSTRING will be used as a unique logfile name
  and   cmdlist   is the base command string to be run

  KEYSTRING may not contain whitespace of any sort.
  Other lines are not allowed, including blanks or comments.

"

die()  { echo "$@ $use" >&2; exit 1; }

case $# in
2) case "$1" in
   *[^0-9]*) die "INVALID #procs '$1'" ;;
   esac
   declare -i primer="$1"  # a countdown of how many processes to pre-spawn
   cmdfile="$2"
   [[ -r "$cmdfile" ]]  || { die "$cmdfile not readable"; }
   grep -v : "$cmdfile" || { die "$cmdfile has invalid lines"; }
   declare -i lines=$( grep -c : $cmdfile)
   if (( lines < primer ))
   then die "Note - command lines in $cmdfile ($lines) fewer than requested process chains ($primer)"
   fi  ;;
*) die ;;
esac >&2

trap 'echo abort $0@$LINENO; use; exit 1' ERR       # make sure any error is fatal
trap ': no-op to ignore' HUP  # ignore hangups (built-in nohup without explicit i/o redirection)

spawn() {
  IFS="$IFS:" read key cmd && [[ "${cmd:-}" ]] || return
  echo "$(date) executing '$cmd'; c.f. $key.log" | tee "$key.log"
  echo "# autogenerated by $0 $(date)
   { $cmd
     spawn
   } >> $key.log 2>&1 &
  " >| $key.sh
  . $key.sh
  rm -f $key.sh
  return 0
}

# create a command list based on those designators
declare chains=0
while (( primer-- ))  # until we've filled the requested quota
do spawn              # create a child process
done < $cmdfile