Запустіть сценарії Bash у папці все одночасно


10

Припустимо, у мене .shв папці ( my_folder) є п'ять сценаріїв Bash ( ), і вони названі так:

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

Як я можу написати шостий сценарій Bash або просто один вкладиш, який почне запускати всі ці сценарії разом?

Мені потрібно п’ять сценаріїв, щоб почати виконувати всі разом одночасно, а не один за одним.


Відповіді:


12

GNU parallelідеально підходить для подібних речей. Встановіть за допомогою, sudo apt install parallelа потім:

parallel -j0 ::: my_folder/*sh

У -jконтролює кількість процесів т працювати паралельно, а -j0значить «все з них». Установіть його на інше значення (наприклад -j20), щоб замість цього запустити сценарії в партіях.


1
Примітка: також є parallelкоманда з moreutilsпакета. Приклад використання: parallel -j 20 -- my_folder/*.sh(На відміну від GNU parallel, -j0сценарії запускаються по одному).
jfs

1
@jfs хороший пункт. Але зауважте, що sudo apt install parallelзамінить файл у файлі /usr/bin/parallelGNU паралельним. Тому поки ви встановите його, як підказує моя відповідь, він повинен працювати так, як очікувалося.
тердон

Так, я виявив це важким способом, коли невдало пробував parallelкоманди з посібника під час написання своєї відповіді, щоб запропонувати паралельно GNU.
jfs

9

Для запуску всіх сценаріїв одночасно (паралельно) використовуйте:

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" &

Є три способи викликати скрипт bash з іншого, як тут відповіли:

  1. Зробіть інший виконуваний сценарій, додайте #!/bin/bashрядок у верхній частині та шлях, де файл знаходиться до $PATHзмінної середовища. Тоді ви можете називати це звичайною командою;

  2. Або викликати за допомогою команди джерела (псевдонім.) Наступним чином: source /path/to/script;

  3. Або використовуйте команду Баша , щоб виконати його: /bin/bash /path/to/script;

У випадку з ОП один або кілька з 200 сценаріїв не містили #!/bin/bashпершого рядка shebang у файлі. Як такий варіант 3. довелося використовувати.


200 сценаріїв, що працюють одночасно

Був опублікований коментар щодо того, чи "вони працюють одночасно". У типовій системі 8 процесорів 25 сценаріїв будуть спільно використовувати один процесор одночасно, але лише один сценарій буде виконуватися одночасно, поки не закінчиться відрізок часу (вимірюється в мілісекундах). Тоді наступна робота отримає свою справедливу частку мілісекунд, потім наступна робота і т.д., і т.д.

У розрізненому розумінні можна сказати, що 200 завдань виконуються "одночасно", але не "одночасно" через 8 процесорів, що дорівнює 25 робочим місцям на процесор:

нитка state.png

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

час slice.png


дякую .. річ у тому, що в моєму реальному випадку я маю понад 200 сценаріїв для запуску. так чи є спосіб я запустити їх за допомогою однієї команди (тобто, не пишучи їхніх імен файлів)?
aaaaa

@aaaaa Я змінив відповідь на 200 сценаріїв.
WinEunuuchs2Unix

Дякую. це працює .. єдине, що мені довелося додати до вашого останнього рядка, це «баш». інакше мені "дозвіл відмовлено".
aaaaa

1
@aaaaa Ви дійсно вважаєте за краще, щоб усі 200+ скриптів запускалися одночасно, або ви хочете, щоб заздалегідь було запущено якесь менше число (скажімо, 10), а інші стоять у черзі для запуску, коли один або більше з них закінчується та кількість поточно запущених сценаріїв опускається нижче цієї кількості? (Якщо вас цікавлять подібні рішення, я пропоную відредагувати ваше запитання інформацією про те, скільки у вас є сценаріїв, скільки часу вони прагнуть запустити, яку роботу вони роблять тощо).
Елія Каган

@aaaaa Дякую за відгук. Я оновив відповідь, щоб включити bashпрефікс для виклику сценарію.
WinEunuuchs2Unix

3

Прочитайте інструмент для цього man run-parts.

Наприклад, я роблю:

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

в моєму сценарії резервного копіювання Palm Pilot. ${visorhome}/pbackup.d/:

01PopulateJpilot  02Extract_Pedometer  03URLs  04google  05Books  06Weight  07Sec  08Bkgm 50hardlinks

1
@ eliah-kagan Запуск "більше 200 сценаріїв" "одночасно" видається нерозумним. Це може бути гарним способом провести тест на стрес
waltinator

Гарна думка. Я думаю, ви все ще хочете згадати, що run-partsсценарії виконують послідовно, а не відразу відразу, як цього вимагала ОП. Ти маєш рацію, що запуск 200 скриптів одночасно навряд чи буде виконати так само, як запуск 5 - і навіть якщо запустити їх усі відразу не спричинить жодних проблем, це все одно може бути непотрібним. Я коментував пропозицію ОП роз'яснити їхні переваги з цього приводу.
Елія Каган

run-partsне буде запускати сценарії (вони мають крапку в імені:my_folder/*.sh
jfs

1
run-partsмає дуже_ конкретні вимоги до імені файлів з якоїсь дивної причини. Він не запустить імена файлів із розширеннями, тому, боюся, це не спрацює тут.
тердон

1

Щоб запустити всі *.shсценарії в my_folderкаталозі одночасно, використовуючи xargs:

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

Щоб обмежити кількість одночасно виконаних скриптів 10:

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

Це погана практика використовувати вихід lsу сценарії. Використовувати findнабагато безпечніше. Це найперший елемент тут: mywiki.wooledge.org/BashPitfalls#for_f_in_.24.28ls_.2A.mp3.29
Joe

@Joe взагалі, це правда. Я не бачу проблем у цьому конкретному випадку.
jfs

Це тому, що ви вже про це знаєте. Люди, які приїдуть сюди пізніше, можуть цього не зробити.
Джо

@Joe сліпо не слідкуйте за догмою Подумайте самі, ніж один варіант кращий за інший, що є компромісом у вашому випадку.
jfs

Це не догма. Я до них насторожений. Але я бачив речі, які можна виділити. Розбір людського читаного результату не є надійним. Немає стимулів для розробників триматись
Джо
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.