Запускать скрипты Bash в папке одновременно

Предположим, у меня есть пять сценариев Bash (.sh) в папке (my_folder), и они названы так:

script_1.sh
script_2.sh
script_3.sh
script_4.sh
script_5.sh

Как написать шестой сценарий Bash или просто один вкладыш, который начнет запускать все эти сценарии вместе?

Мне нужно, чтобы пять сценариев запускались все вместе одновременно, а не один за другим.

10
задан 7 July 2019 в 08:27

4 ответа

GNU parallel идеально подходит для этого вида вещи. Установка с sudo apt install parallel и затем:

parallel -j0 ::: my_folder/*sh

-j средства управления, сколько процессов t выполненный параллельно, и -j0 означает "всех их". Установите его на другое значение (например. -j20) запускать скрипты в пакетах вместо этого.

12
ответ дан 23 November 2019 в 04:19

Существует инструмент для этого, читать man run-parts.

Например, я делаю:

 run-parts ${visorhome}/pbackup.d/

в моем Palm Pilot копируют сценарий. ${visorhome}/pbackup.d/:

01PopulateJpilot  02Extract_Pedometer  03URLs  04google  05Books  06Weight  07Sec  08Bkgm 50hardlinks
3
ответ дан 23 November 2019 в 04:19

Выполнять все *.sh сценарии в my_folder каталог одновременно с помощью xargs:

$ ls my_folder/*.sh | xargs -P0 -n1 bash

Ограничить количество одновременно выполняемых сценариев к 10:

$ ls my_folder/*.sh | xargs -P10 -n1 bash
1
ответ дан 23 November 2019 в 04:19

Для запущения всех скриптов, одновременно (параллельно) используйте:

script_1.sh &
script_2.sh &
script_3.sh &
script_4.sh &
script_5.sh &

Для выполнения, один за другим (последовательно) используйте:

script_1.sh &&
script_2.sh &&
script_3.sh &&
script_4.sh &&
script_5.sh

Улучшение для комментариев

Если у Вас есть 200 сценариев, Вы хотите работать одновременно (который мог бы сорвать машину BTW), используют этот сценарий:

#!/bin/bash
for Script in my_folder/*.sh ; do
    echo bash "$Script" &
done

Установите атрибуты сценария на исполняемый файл с командой:

chmod a+x /path/to/script.sh

В первый раз, когда Вы запускаете скрипт, он только повторит названия этих 200 сценариев, которые он будет выполнять. Когда Вы рады, что правильные имена выбираются, редактируют сценарий и изменяют эту строку:

    echo bash "$Script" &

кому:

    bash "$Script" &

Существует три способа, которыми можно назвать сценарий удара от другого, как отвечено здесь:

  1. Сделайте другой исполняемый файл сценария, добавьте #!/bin/bash строка наверху и путь, где файл к $PATH переменная среды. Затем можно назвать его как нормальную команду;

  2. Или назовите его с исходной командой (псевдоним.) как это: source /path/to/script;

  3. Или используйте команду удара для выполнения его: /bin/bash /path/to/script;

В случае OP один или несколько из этих 200 сценариев не содержал хижину #!/bin/bash первая строка в файле. Опция 3 как таковая. должен был использоваться.


200 Сценариев, работающих одновременно

Комментарий был повышен о том, "работают ли они одновременно". В типичных 8 системах ЦП 25 сценариев будут совместно использовать один ЦП одновременно, но только один один сценарий выполнится за один раз, пока это не будет интервал времени (измеряемый в миллисекундах), заканчивается. Затем следующее задание получит свою справедливую долю миллисекунд, затем следующее задание, и т.д., и т.д.

В свободных терминах мы можем сказать, что 200 заданий работают "одновременно", но не "одновременно" через 8 центральных процессоров, который приравнивается к 25 заданиям на ЦП:

thread states.png

Выше изображения и комментариев ниже из планировщика ядра Linux

time slice.png

9
ответ дан 23 November 2019 в 04:19

Другие вопросы по тегам:

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