Как ограничить количество параллельных заданий

Другой вариант, если вы не женаты на grep для этого, является моим любимым инструментом, который я принял для замены grep давным-давно-ack . Он может в значительной степени попасть в предоставленный вами скрипт и предоставить нужный вам результат. (По умолчанию выполняется рекурсивный поиск, на что стоит обратить внимание, если вы не хотите искать файлы во вложенных папках ).

while read p; do
  for filename in $(ack -l $p); do
    echo "$p found in $filename" >> results.txt
  done
done

1
08.12.2020, 11:16
2 ответа

С GNU Parallel вы должны сделать что-то вроде:

[compute $script]
export script
run_one() {
  i="$1"
  export server_name=`echo $i`
  echo "connecting to $i"
  expect -c "$script"
  echo "Job completed on $i"
  echo "-----------------------------------"
}
export -f run_one

cat "$file" | parallel -j100 run_one '2>&1' >"$log2"

Или:

[compute $script]
export script

cat "$file" |
  parallel -j100 --tag 'i={} expect -c "$script" 2>&1' >"$log2"

2
18.03.2021, 23:03

Обычно я использую несколько иной подход, который не требует от вас отслеживания количества создаваемых вами подпроцессов, и всякий раз, когда очередь становится меньше максимального значения, она заполняется

max_jobs=100 # set queue size
while IFS= read -r i; do
  num_jobs=$(pgrep -c -P$$)
  if [[ $num_jobs -ge $max_jobs ]]; then
    wait -n $(pgrep -P$$) # Wait until a any subprocess terminates
  else
    <calling_awesome_script_here> &
  fi
done < "$file"

0
01.10.2021, 08:48

Теги

Похожие вопросы