Я пытаюсь написать .sh файл, который запускает много программ одновременно
Я пробовал это
prog1
prog2
Но это запускает prog1, затем ждет, пока prog1 заканчивается, а затем запускает prog2 ...
Так как я могу запустить их параллельно?
bash
parallel-processing
Betamoo
источник
источник
wait
! Да, в bash вы можете дождаться дочерних процессов скрипта.nohup
чтобы не допустить уничтожения программы при зависании оболочки.Как насчет:
Это будет:
prog1
.prog2
и держите его на переднем плане , чтобы вы могли закрыть егоctrl-c
.prog2
, вы будете возвращаться кprog1
«S переднего плана , так что вы также можете закрыть его сctrl-c
.источник
prog1
когдаprog2
заканчивается? Подумайте оnode srv.js & cucumberjs
prog1 & prog2 ; fg
это было для запуска нескольких туннелей SSH одновременно. Надеюсь, это кому-нибудь поможет.prog2
не запустится, вы вернетесь к тому, чтоprog1
на переднем плане. Если это желательно, тогда все в порядке.prog1 & prog2 && kill $!
.Вы можете использовать
wait
:Он назначает переменные PID фоновой программы (это PID
$!
последнего запущенного процесса), затемwait
команда ожидает их. Это хорошо, потому что если вы убьете скрипт, он тоже убьет процессы!источник
#!/usr/bin/env bash ARRAY='cat bat rat' for ARR in $ARRAY do ./run_script1 $ARR & done P1=$! wait $P1 echo "INFO: Execution of all background processes in the for loop has completed.."
${}
чтобы интерполировать его в список строк или тому подобное.С GNU Parallel http://www.gnu.org/software/parallel/ это так же просто, как:
Или, если вы предпочитаете:
Выучить больше:
источник
parallel
с разным синтаксисом. Например, в производных Debianmoreutils
пакет содержит другую команду с именем,parallel
которая ведет себя совершенно иначе.parallel
лучше , чем использовать&
?parallel
лучше, когда имеется больше заданий, чем ядер, и в этом случае&
на одно ядро можно запускать более одного задания одновременно. (см принцип закуток )Если вы хотите иметь возможность легко запускать и уничтожать несколько процессов
ctrl-c
, это мой любимый метод: порождать несколько фоновых процессов в(…)
подоболочке и ловушкуSIGINT
для выполненияkill 0
, которая уничтожит все, что появилось в группе подоболочек:У вас могут быть сложные структуры выполнения процесса, и все будет закрываться одним
ctrl-c
(просто убедитесь, что последний процесс запущен на переднем плане, т. Е. Не включайте&
послеprog1.3
):источник
xargs -P <n>
позволяет выполнять<n>
команды параллельно.Хотя
-P
это нестандартный вариант, реализации GNU (Linux) и macOS / BSD поддерживают его.Следующий пример:
Вывод выглядит примерно так:
Время показывает, что команды были запущены параллельно (последняя команда была запущена только после того, как первая из трех оригинальных команд завершилась, но была выполнена очень быстро).
Сама
xargs
команда не вернется, пока все команды не будут завершены, но вы можете выполнить ее в фоновом режиме, завершив ее оператором управления,&
а затем используяwait
встроенную функцию для ожидания завершения всейxargs
команды.Примечание:
BSD / macOS
xargs
требует, чтобы вы указали количество команд для параллельного запуска в явном виде , тогда как GNUxargs
позволяет вам задавать параллельное-P 0
выполнение максимально возможного числа команд .Выходные данные параллельных процессов поступают по мере их генерации , поэтому они будут непредсказуемо чередоваться .
parallel
, как упомянуто в ответе Оле ( не входит в стандартную комплектацию большинства платформ), удобно сериализует (группирует) вывод для каждого процесса и предлагает множество дополнительных функций.источник
Перенаправлять ошибки в отдельные журналы.
источник
prog1 2> .errorprog1.log & prog2 2> .errorprog2.log &
ls notthere1 & 2> .errorprog1.log; ls notthere2 & 2>.errorprog2.log
. Ошибки отправляются на консоль, и оба файла ошибок пусты. Как говорит @Dennis Williamson,&
это разделитель, например;
, (а) он должен идти в конце команды (после любого перенаправления), и (б) вам вообще не нужен;
:-)Есть очень полезная программа, которая вызывает nohup.
источник
nohup
сам по себе ничего не запускает в фоновом режиме, и использованиеnohup
не является обязательным или обязательным условием для запуска задач в фоновом режиме. Они часто полезны вместе, но как таковой, это не отвечает на вопрос.Вот функция, которую я использую для параллельного запуска процесса max n (в примере n = 4):
Если для max_children задано количество ядер, эта функция будет пытаться избежать незанятых ядер.
источник
wait -n
требуетсяbash
4.3+, и он меняет логику на ожидание завершения любого из указанных / подразумеваемых процессов.Вы можете попробовать ppss . ppss довольно мощный - вы даже можете создать мини-кластер. xargs -P также может быть полезен, если вам нужно выполнить партию смущающей параллельной обработки.
источник
Недавно у меня была похожая ситуация, когда мне нужно было запускать несколько программ одновременно, перенаправлять их выходные данные в отдельные файлы журнала и ждать, пока они закончат, и в итоге я получил нечто подобное:
Источник: http://joaoperibeiro.com/execute-multiple-programs-and-redirect-their-outputs-linux/
источник
Менеджер процесса порождения
Конечно, технически это процессы, и эта программа должна называться диспетчером порождения процессов, но это только из-за того, что BASH работает, когда он разветвляется с помощью амперсанда, он использует системный вызов fork () или, возможно, clone () который клонируется в отдельное пространство памяти, а не что-то вроде pthread_create (), который бы разделял память. Если бы BASH поддерживал последнее, каждая «последовательность выполнения» работала бы одинаково и могла бы быть названа традиционными потоками, получая при этом более эффективный объем памяти. Функционально, однако, он работает так же, хотя и немного сложнее, поскольку переменные GLOBAL недоступны в каждом рабочем клоне, поэтому для управления критическими секциями используется файл межпроцессного взаимодействия и элементарный семафор стада. Формирование от BASH, конечно, является основным ответом здесь, но я чувствую, что люди знают это, но действительно хотят управлять тем, что порождено, а не просто раскошелиться и забыть это. Это демонстрирует способ управления до 200 экземплярами разветвленных процессов, каждый из которых обращается к одному ресурсу. Ясно, что это излишне, но мне понравилось писать, поэтому я продолжал. Увеличьте размер вашего терминала соответственно. Я надеюсь, что вы найдете это полезным.
источник
Ваш скрипт должен выглядеть так:
Предполагая, что ваша система может выполнять n заданий одновременно. используйте wait для запуска только n заданий одновременно.
источник
С помощью bashj ( https://sourceforge.net/projects/bashj/ ) вы сможете запускать не только несколько процессов (как предлагали другие), но и несколько потоков в одной JVM, управляемой из вашего сценария. Но, конечно, это требует Java JDK. Потоки потребляют меньше ресурсов, чем процессы.
Вот рабочий код:
источник