Как запустить несколько сценариев Bash одновременно в окне терминала?

Я также скомпилировал свое собственное ядро ​​(на Debian ), и в итоге я просто запустил make gconfigбез .configв каталоге (, так что он использует все значения по умолчанию для Debian, я думаю )впервые. Затем я настроил его (снял выделение с кучи ненужных модулей и т.д. )и теперь у меня гораздо более компактное ядро ​​(я не переставал настраивать его! ).

11
24.04.2020, 18:07
8 ответов

После тестирования различных методов и программ я обнаружил, что прагматичным решением является GNU Parallel . Я публикую этот ответ, так как он может помочь другим.

GNU Parallelне был построен для этой задачи, но прекрасно служит этой цели.

При запуске скриптов как

parallel -u ::: './script.sh 1' './script.sh 2' #(and so forth)

Все сценарии будут выполняться параллельно.

Флаг-u(--ungroup)отправляет выходные данные сценария в stdoutво время выполнения сценариев.

Ctrl + C завершает задание parallel, а затем и все запущенные скрипты.

14
19.03.2021, 02:26

echo -e "1\n2\n3\n4\n" | xargs -n1 -P4./script.sh

Это еще один способ сделать это. xargs доступен практически в любой системе, а элемент управления -c должен уничтожить все задания.

Это также (в отличие от вызова ваших скриптов с &, позволяет вам запускать это из bash-скрипта более высокого -уровня)

Опция -n1указывает xargs запускать каждый аргумент в отдельном процессе, а опция -P4указывает запускать 4 процесса.

1
19.03.2021, 02:26

Я хотел бы отметить интересную особенность tmux (tmux уже был предложен как отличный вариант @dan1st ). Существует способ одновременного запуска одной и той же команды в нескольких панелях. Вот пример.Я хочу запустить эхо «Имя фрукта $fruit» на двух разных панелях/логинах/хостах одновременно. Шаги:

  1. Запустить tmux:tmux new-session -s myparallel
  2. CTRL-B, за которым следует " (это разделит панель на две. Если вам нужно больше панелей, повторите. " разбивается по горизонтали, % разбивается по вертикали)
  3. Перейдите к каждой панели (, используя CTRL -B и клавишу со стрелкой ), чтобы установить переменную для этой панели. Например, панель #1 будет иметь фрукт = «яблоко», а панель #2 — фрукт = «апельсин»
  4. .
  5. Теперь, когда у вас есть переменные, установленные для каждой панели, пришло время синхронизировать панели, чтобы все, что вы вводите, отражалось на всех панелях. Команда для этогоCTRL-B :setw synchronize-panes on
  6. Теперь вы можете запустить scriptName $fruitи просмотреть вывод на всех панелях одновременно.
  7. Для полноты картины, чтобы выйти из синхронизированного режима, введитеCTRL-B :setw synchronize-panes off
0
19.03.2021, 02:26

Вы не теряете над ними контроля. Вы отправляете их (, кроме последнего ), на задний план.

Если вы запустите указанную вами цепочку команд, вызов ./script.sh 4будет выполняться на переднем плане, а другие сценарии будут выполняться в фоновом режиме. Ввод будет отправлен в сценарий переднего плана. Чтобы приостановить сценарий переднего плана, нажмите CtrlZ . Чтобы перевести приостановленный скрипт в фоновый режим для продолжения работы, используйте команду bg.

Чтобы увидеть сценарии (или, точнее, задания ), которые у вас есть, и состояния, в которых они находятся, используйте jobs.

Чтобы вывести конкретную работу на передний план, используйте fgи ее номер (, как сообщается вышеупомянутымjobs)с префиксом %, например. грамм. fg %2. Чтобы завершить определенное задание, вы можете либо вывести его на передний план с помощью fgи завершить его разумно, либо вы можете kill, например. грамм. kill -TERM %2.

17
19.03.2021, 02:26

Вы можете перенаправить вывод в файл (по одному на процесс или комбинированный ). Иметь один файл для всех не проблема, если записи небольшие (512 байт безопасно, возможно, даже 4K ). Маленькие записи атомарны:

./script.sh 1 >output.1 2>&1 &
./script.sh 2 >output.2 2>&1 &
./script.sh 3 >output.3 2>&1 &
./script.sh 4 >output.4 2>&1 &
./script.sh 5 >output.5 2>&1 &

while wait % >/dev/null 2>&1; do : ; done

Если вы делаете это в интерактивном режиме, может помочь следующее. :Вы можете легко обращаться к заданиям, добавляя перед ними (в противном случае бесполезное )определение переменной среды (, например идентификатор фоновой задачи):

bgtid=foo./script.sh 1 &
[...]
kill %bgtid=foo

Префикс команды просто должен быть однозначным (, поэтому никаких bgtid=fooиbgtid=foobar).

4
19.03.2021, 02:26

Диспетчер очереди задач может справиться с этой задачей.https://vicerveza.homeunix.net/~viric/soft/ts/article_linux_com.html

Вы можете найти этот инструмент под псевдонимом «tsp» в Debian и Ubuntu.

1
19.03.2021, 02:26

Для этого можно использовать tmux.

Это терминальный мультиплексор, означающий, что он разбивает одну вкладку на несколько окон.

  • Запустите его командой tmux.
  • Используйте Contr+B, а затем "или %, чтобы разделить панель на две панели.
  • Запуск процессов на переднем плане.
  • Переключайтесь между процессами, используя Contr+ B, а затем клавиши со стрелками.

Теперь у вас есть нормальный контроль над несколькими процессами в одной вкладке вашего терминала.

Если вы хотите сфокусировать (или убрать )фокус с определенной области, используйте Contr+ B, а затем Z.

Если вам нужно прокрутить, используйте Contr+ B, затем Qи прокручивайте с помощью клавиш со стрелками (или активируйте режим мыши ).

Шпаргалку можно найти здесь .

Этот процесс также можно автоматизировать.

5
19.03.2021, 02:26

При выполнении фоновых заданий переменная оболочки, которая печатается с использованием :«echo $!» дает идентификационный номер процесса последнего фонового задания. Вы можете создать массив сценариев оболочки, который будет содержать эти номера процессов в качестве фона, и может работать с процессами по мере необходимости. (т. е. вы можете проверить, работают ли они по-прежнему с "ps", или вы можете их убить.)

Только что проверил в bash, что "echo $!" или "shellvar=$!" должен быть на новой строке, так как ";" не работает после "&".

0
19.03.2021, 02:26

Теги

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