Как мне запускать команды в пакетном режиме?

У меня есть следующий сценарий:

command file1 &
command file2 &
command file3 &
command file4 &
command file5 &
command file6 &
# SOME OTHER COMMAND 
command file7 &
command file8 &
command file9 &
command file10 &
command file11 &
command file12 &

Вместо «НЕКОТОРАЯ ДРУГАЯ КОМАНДА» я бы хотел, чтобы команда остановила выполнение следующих команд, пока все процессы, предшествующие этому, не были выполнены что я эффективно запускаю команды "партиями". Как я могу это сделать?

1
задан 8 July 2020 в 01:11

3 ответа

You should be able to use the bash shell's built in wait command. From man bash (emphasis mine):

       wait [-n] [n ...]
              Wait for each specified child process and return its termination
              status.  Each n may be a process ID or a job specification; if a
              job  spec  is  given,  all  processes in that job's pipeline are
              waited for.  If n is not given, all currently active child  pro‐
              cesses are waited for, and the return status is zero.  If the -n
              option is supplied, wait waits for  any  job  to  terminate  and
              returns  its exit status.  If n specifies a non-existent process
              or job, the return status is 127.  Otherwise, the return  status
              is the exit status of the last process or job waited for.

So

command file1 &
command file2 &
command file3 &
command file4 &
command file5 &
command file6 &

wait

command file7 &
command file8 &
command file9 &
command file10 &
command file11 &
command file12 &
2
ответ дан 30 July 2020 в 22:11

xargs - отличный вариант, когда вы запускаете одну и ту же команду с разными аргументами.

echo file{1..32} | xargs -P 32 -n 1 command

-P 32 указывает xargs запускать максимум 32 процессы за один раз. -n 1 означает передачу в команду не более одного аргумента (без него он может отправить все файлы в одну команду и, следовательно, не получить параллельного выполнения).

Итак, в этом case, установите -P на ваш размер партии. Другой вариант (и преимущество) заключается в том, что вы можете установить для параметра -P значение параллелизма, которое вы действительно хотите использовать. В то время как подход и запускает процесс для каждой команды, xargs ограничит количество процессов тем, что вы установили. Это означает, что вы можете нацелить параллелизм на количество ядер, которые у вас есть,

0
ответ дан 30 July 2020 в 22:11

If you want to get a bit fancy, a bash script

batch() {
    for arg; do
        theCommand "$arg" &
    done
    wait
}

batch file{1..6}
batch file{7..12}
2
ответ дан 30 July 2020 в 22:11

Другие вопросы по тегам:

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