Предположим, у меня есть пять .sh
скриптов Bash ( ) в папке ( my_folder
), и они названы так:
script_1.sh
script_2.sh
script_3.sh
script_4.sh
script_5.sh
Как я могу написать шестой скрипт Bash или просто один лайнер, который начнет запускать все эти скрипты вместе?
Мне нужно, чтобы пять сценариев запускались одновременно, а не один за другим.
Ответы:
GNU
parallel
идеально подходит для такого рода вещей. Установите с помощьюsudo apt install parallel
и затем:В
-j
контролирует количество процессов т работать параллельно, а-j0
значит «все из них». Установите другое значение (например-j20
), чтобы вместо этого запускать сценарии партиями.источник
parallel
команда изmoreutils
пакета. Пример использования:parallel -j 20 -- my_folder/*.sh
(В отличие от GNUparallel
,-j0
скрипты запускаются по одному).sudo apt install parallel
файл будет заменен файлом/usr/bin/parallel
из параллельного GNU. Так что, пока вы устанавливаете его, как подсказывает мой ответ, он должен работать как положено.parallel
команды из руководства, когда пишу свой ответ, предлагая параллельную GNU.Чтобы запустить все сценарии одновременно (параллельно), используйте:
Для запуска одного за другим (последовательно) используйте:
Улучшение для комментариев
Если у вас есть 200 сценариев, которые вы хотите запустить в одно и то же время (что может помешать работе машины), используйте этот сценарий:
Установите атрибуты сценария на исполняемый с помощью команды:
При первом запуске сценария будут отображены только имена 200 сценариев, которые он будет выполнять. Когда вы счастливы, правильные имена выбираются, отредактируйте скрипт и измените эту строку:
чтобы:
Есть три способа вызвать bash-скрипт из другого, ответив здесь:
В случае OP один или несколько из 200 сценариев не содержали
#!/bin/bash
первую строку shebang в файле. Как таковой вариант 3. должен был использоваться.200 скриптов, работающих одновременно
Был поднят комментарий о том, «работают ли они одновременно». В типичной системе с 8 ЦП 25 сценариев будут совместно использовать один ЦП одновременно, но только один сценарий будет выполняться за раз, пока не истечет его временной интервал (измеряемый в миллисекундах). Затем следующая работа получит свою долю в миллисекундах, затем следующую работу и т. Д. И т. Д.
В целом мы можем сказать, что 200 заданий выполняются «одновременно», но не «одновременно» на 8 процессорах, что соответствует 25 заданиям на процессор:
Выше изображение и комментарии ниже из планировщика ядра Linux
источник
bash
префикс для вызова скрипта.Для этого есть инструмент, читай
man run-parts
.Например, я делаю:
в моем скрипте резервного копирования Palm Pilot.
${visorhome}/pbackup.d/
:источник
run-parts
сценарии выполняются последовательно, а не все сразу, как запросил OP. Вы правы, однако, что запуск 200 сценариев за раз вряд ли будет выполнять то же самое, что и запуск 5 - и даже если запуск их всех одновременно не вызывает никаких проблем, он все равно может быть ненужным. Я прокомментировал, чтобы предложить ОП уточнить свои предпочтения в этом отношении.run-parts
не будет запускать скрипты ( у них есть точка в названии:my_folder/*.sh
run-parts
имеет очень_ определенные требования к имени файла по какой-то странной причине. Он не запускает имена файлов с расширениями, поэтому я боюсь, что здесь это не сработает.Чтобы запустить все
*.sh
сценарии вmy_folder
каталоге одновременно, используйтеxargs
:Чтобы ограничить количество одновременно выполняемых сценариев
10
:источник
ls
скрипта. Использованиеfind
намного безопаснее. Это самый первый элемент здесь: mywiki.wooledge.org/BashPitfalls#for_f_in_.24.28ls_.2A.mp3.29