Предположим , что у меня есть три (или более) Баш сценариев: script1.sh
, script2.sh
и script3.sh
. Я хотел бы вызвать все три сценария и запустить их параллельно . Один из способов сделать это - просто выполнить следующие команды:
nohup bash script1.sh &
nohup bash script2.sh &
nohup bash script3.sh &
(Как правило, выполнение сценариев может занять несколько часов или дней, поэтому я хотел бы использовать их, nohup
чтобы они продолжали работать, даже если моя консоль закрывается.)
Но есть ли способ выполнить эти три команды параллельно с одним вызовом?
Я думал что-то вроде
nohup bash script{1..3}.sh &
но это, кажется, выполняется script1.sh
, script2.sh
и script3.sh
последовательно, а не параллельно.
nohup bash script{1..100}.sh &
илиfor i in {1..100}; do nohup bash script{1..100} &; done
), а не печататьnohup bash script*.sh &
100 раз.screen
тоже (илиtmux
), чтобы решить проблему с консолью, но сохранить доступ к выводу (и вводу).nohup ... & nohup ... & nohup ... &
, Если вместо этого вы имеете в виду, что хотите запускать все сценарии, не вводя имя каждого сценария по отдельности, простой цикл сделает это.Ответы:
источник
Лучшим способом было бы использовать GNU Parallel . Параллельная GNU проста, и с ее помощью мы можем контролировать количество параллельных заданий, обеспечивая больший контроль над заданиями.
В приведенной ниже команде
script{1..3}.sh
раскрывается и отправляется в качестве аргументовbash
параллельно. Здесь-j0
указывает, что необходимо выполнить как можно больше заданий. По умолчаниюparallel
выполняется одно задание для одного ядра процессора.И вы также можете попробовать использовать
При выполнении второго метода, если вы получаете какое-либо сообщение об ошибке, это означает, что
--tollef
опция установлена,/etc/parallel/config
и ее нужно удалить, и все будет работать нормально.Вы можете прочитать
GNU Parallels
справочную страницу здесь для более богатых вариантов.А в случае, если вы выполняете задания с удаленной машины, лучше использовать,
screen
чтобы сессия не закрывалась из-за проблем с сетью.nohup
В этом нет необходимости, поскольку последние версии bash поставляются сhuponexit
as,off
и это не позволит родительской оболочке отправлятьHUP
сигнал своим дочерним элементам во время выхода. В случае, если это не сброшено, сделайте это систочник
bash
в качестве оболочкиparallel -j0 bash :::: <(ls script{1..3}.sh)
можно уменьшитьparallel -j0 bash :::: script{1..3}.sh
, нет?parallel -j0 bash ::: script{1..3}.sh
?bash ::: script{1..3}.sh
передаетсяparallel
, а не::: script{1..3}.sh
. Таким образом , это должно первым расширятьсяparallel bash ::: script1.sh script2.sh script3.sh
оболочкой и затемparallel
призыванийbash script1.sh
,bash script2.sh
,bash script3.sh
. Я попробовал этоparallel -j0 bash ::: script{1..3}.sh
- это лучше, чем::::
подход, поскольку он устраняет необходимость замены процесса. Также парсинг вывода lsМы также можем использовать
xargs
для параллельного запуска нескольких скриптов.здесь каждый скрипт передается bash как аргумент отдельно.
-P 0
указывает, что количество параллельных процессов может быть как можно больше. Также безопаснее использовать bash по умолчаниюjob control feature
(&)
.источник
Одна линия решение:
Менее остроумно, просто используйте скрипт-обертку:
Или зациклите их:
источник
Если вы хотите сэкономить на печати
Или, если подумать, может и нет
источник
Оформить заказ этого инструмента: https://github.com/wagoodman/bashful
Скажем, у вас есть
mytasks.yaml
сИ вы запускаете это так:
Ваши сценарии будут выполняться параллельно с вертикальным индикатором выполнения (+ это, если вы запускали его раньше, а время детерминировано). Вы можете настроить количество задач, которые вы хотите запускать параллельно, если вы начнете выполнять больше, чем только 3 из приведенных здесь:
Отказ от ответственности: я автор.
источник
Я предлагаю гораздо более простую утилиту, которую я только что написал. В настоящее время он называется par, но скоро будет переименован в parl или pll, еще не решил.
https://github.com/k-bx/par
API так же прост, как:
источник
Используйте Parallelshell
https://github.com/keithamus/parallelshell
источник