Я также скомпилировал свое собственное ядро (на Debian ), и в итоге я просто запустил make gconfig
без .config
в каталоге (, так что он использует все значения по умолчанию для Debian, я думаю )впервые. Затем я настроил его (снял выделение с кучи ненужных модулей и т.д. )и теперь у меня гораздо более компактное ядро (я не переставал настраивать его! ).
После тестирования различных методов и программ я обнаружил, что прагматичным решением является GNU Parallel . Я публикую этот ответ, так как он может помочь другим.
GNU Parallel
не был построен для этой задачи, но прекрасно служит этой цели.
При запуске скриптов как
parallel -u ::: './script.sh 1' './script.sh 2' #(and so forth)
Все сценарии будут выполняться параллельно.
Флаг-u
(--ungroup
)отправляет выходные данные сценария в stdout
во время выполнения сценариев.
Ctrl + C завершает задание parallel
, а затем и все запущенные скрипты.
echo -e "1\n2\n3\n4\n" | xargs -n1 -P4./script.sh
Это еще один способ сделать это. xargs доступен практически в любой системе, а элемент управления -c должен уничтожить все задания.
Это также (в отличие от вызова ваших скриптов с &
, позволяет вам запускать это из bash-скрипта более высокого -уровня)
Опция -n1
указывает xargs запускать каждый аргумент в отдельном процессе, а опция -P4
указывает запускать 4 процесса.
Я хотел бы отметить интересную особенность tmux (tmux уже был предложен как отличный вариант @dan1st ). Существует способ одновременного запуска одной и той же команды в нескольких панелях. Вот пример.Я хочу запустить эхо «Имя фрукта $fruit» на двух разных панелях/логинах/хостах одновременно. Шаги:
tmux new-session -s myparallel
CTRL-B
, за которым следует " (это разделит панель на две. Если вам нужно больше панелей, повторите. " разбивается по горизонтали, % разбивается по вертикали)CTRL-B :setw synchronize-panes on
scriptName $fruit
и просмотреть вывод на всех панелях одновременно. CTRL-B :setw synchronize-panes off
Вы не теряете над ними контроля. Вы отправляете их (, кроме последнего ), на задний план.
Если вы запустите указанную вами цепочку команд, вызов ./script.sh 4
будет выполняться на переднем плане, а другие сценарии будут выполняться в фоновом режиме. Ввод будет отправлен в сценарий переднего плана. Чтобы приостановить сценарий переднего плана, нажмите CtrlZ . Чтобы перевести приостановленный скрипт в фоновый режим для продолжения работы, используйте команду bg
.
Чтобы увидеть сценарии (или, точнее, задания ), которые у вас есть, и состояния, в которых они находятся, используйте jobs
.
Чтобы вывести конкретную работу на передний план, используйте fg
и ее номер (, как сообщается вышеупомянутымjobs
)с префиксом %
, например. грамм. fg %2
. Чтобы завершить определенное задание, вы можете либо вывести его на передний план с помощью fg
и завершить его разумно, либо вы можете kill
, например. грамм. kill -TERM %2
.
Вы можете перенаправить вывод в файл (по одному на процесс или комбинированный ). Иметь один файл для всех не проблема, если записи небольшие (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
).
Диспетчер очереди задач может справиться с этой задачей.https://vicerveza.homeunix.net/~viric/soft/ts/article_linux_com.html
Вы можете найти этот инструмент под псевдонимом «tsp» в Debian и Ubuntu.
Для этого можно использовать tmux
.
Это терминальный мультиплексор, означающий, что он разбивает одну вкладку на несколько окон.
tmux
. Contr
+B, а затем "
или %
, чтобы разделить панель на две панели. Contr
+ B
, а затем клавиши со стрелками. Теперь у вас есть нормальный контроль над несколькими процессами в одной вкладке вашего терминала.
Если вы хотите сфокусировать (или убрать )фокус с определенной области, используйте Contr
+ B
, а затем Z
.
Если вам нужно прокрутить, используйте Contr
+ B
, затем Q
и прокручивайте с помощью клавиш со стрелками (или активируйте режим мыши ).
Шпаргалку можно найти здесь .
Этот процесс также можно автоматизировать.
При выполнении фоновых заданий переменная оболочки, которая печатается с использованием :«echo $!» дает идентификационный номер процесса последнего фонового задания. Вы можете создать массив сценариев оболочки, который будет содержать эти номера процессов в качестве фона, и может работать с процессами по мере необходимости. (т. е. вы можете проверить, работают ли они по-прежнему с "ps", или вы можете их убить.)
Только что проверил в bash, что "echo $!" или "shellvar=$!" должен быть на новой строке, так как ";" не работает после "&".