Я пытаюсь запустить 20 files одновременно, используя warc.sh или лучший способ указать 20 экземпляров warc.sh одновременно с содержимым каталога в качестве входных данных. Я также пытаюсь посмотреть PID на случай, если случится что-то плохое, и загружать новый экземпляр новым входом каждый раз, когда старый экземпляр завершается.

# test if files exists and run
if [ "$(ls -A ${base_dir}/schedule)" ]; then

    # function to be backgrounded
    track()
    {
      ./warc "${base_dir}/schedule/$1 printf" "\nFinished: %d\n" "$1"
    }

    start=$(date '+%s')

    # Make an associative array in which you'll record pids.
    declare -A pids

    # Background an instance of the track() function for each number, record the pid.
    for n in `ls -A ${base_dir}/schedule`; do
        if [ ${#pids[@]} > 20 ]; then
          track $n &
          pid=$!
          echo "Backgrounded: $n (pid=$pid)"
          pids[$pid]=$n
        else
            echo 'Sleeping' ; sleep 2
        fi
    done

    # Watch your stable of backgrounded processes.
    # If a pid goes away, remove it from the array.
    while [ -n "${pids[*]}" ]; do
      sleep 1
      for pid in "${!pids[@]}"; do
        if ! ps "$pid" >/dev/null; then
          unset pids[$pid]
          echo "unset: $pid"
        fi
      done
      if [ -z "${!pids[*]}" ]; then
        break
      fi
      printf "\rStill waiting for: %s ... " "${pids[*]}"
    done

    printf "\r%-25s \n" "Done."
fi

Прямо сейчас это полностью выходит из-под контроля и создает фоновый процесс плюс 900 =/

1 ответ1

0

Напишите для него Makefile и запустите make -j 20 .
Вы можете написать Makefile с помощью скрипта оболочки

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .