У меня есть следующий сценарий:
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 &
Вместо «НЕКОТОРАЯ ДРУГАЯ КОМАНДА» я бы хотел, чтобы команда остановила выполнение следующих команд, пока все процессы, предшествующие этому, не были выполнены что я эффективно запускаю команды "партиями". Как я могу это сделать?
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 &
xargs
- отличный вариант, когда вы запускаете одну и ту же команду с разными аргументами.
echo file{1..32} | xargs -P 32 -n 1 command
-P 32
указывает xargs запускать максимум 32 процессы за один раз. -n 1
означает передачу в команду не более одного аргумента (без него он может отправить все файлы в одну команду и, следовательно, не получить параллельного выполнения).
Итак, в этом case, установите -P
на ваш размер партии. Другой вариант (и преимущество) заключается в том, что вы можете установить для параметра -P
значение параллелизма, которое вы действительно хотите использовать. В то время как подход и
запускает процесс для каждой команды, xargs ограничит количество процессов тем, что вы установили. Это означает, что вы можете нацелить параллелизм на количество ядер, которые у вас есть,
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}