Uruchamiaj skrypty Bash w folderze jednocześnie

10

Załóżmy, że mam pięć .shskryptów Bash ( ) w folderze ( my_folder) i mają one następujące nazwy:

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

Jak mogę napisać szósty skrypt Bash lub tylko jedną linijkę, która zacznie razem uruchamiać wszystkie te skrypty?

Potrzebuję pięciu skryptów, aby zacząć działać razem jednocześnie, a nie jeden po drugim.

aaaaa
źródło

Odpowiedzi:

12

GNU paralleljest idealny do tego rodzaju rzeczy. Zainstaluj za pomocą, sudo apt install parallela następnie:

parallel -j0 ::: my_folder/*sh

Te -jkontrole ile procesy t prowadzone równolegle, a -j0oznacza „wszystkie z nich.” Ustaw inną wartość (np. -j20), Aby zamiast tego uruchamiać skrypty partiami.

terdon
źródło
1
Uwaga: istnieje również parallelpolecenie z moreutilspakietu. Przykładowe użycie: parallel -j 20 -- my_folder/*.sh(W przeciwieństwie do GNU parallel, -j0uruchamiałby skrypty pojedynczo).
jfs
1
@jfs good point. Zauważ jednak, że sudo apt install parallelzastąpi on plik /usr/bin/parallelz GNU równolegle. Tak długo, jak go instalujesz, jak sugeruje moja odpowiedź, powinien on działać zgodnie z oczekiwaniami.
terdon
Tak, dowiedziałem się tego na własnej skórze, gdy próbowałem bezskutecznie parallelpoleceń z podręcznika, pisząc moją odpowiedź, aby zasugerować GNU równolegle.
jfs
9

Aby uruchomić wszystkie skrypty jednocześnie (równolegle) użyj:

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

Aby uruchomić jeden po drugim (sekwencyjnie) użyj:

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

Ulepszenie komentarzy

Jeśli masz 200 skryptów, które chcesz uruchomić w tym samym czasie (co może doprowadzić do awarii komputera BTW), użyj tego skryptu:

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

Ustaw atrybuty skryptu na wykonywalne za pomocą polecenia:

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

Przy pierwszym uruchomieniu skryptu będzie to odzwierciedlać tylko nazwy 200 skryptów, które wykona. Kiedy jesteś zadowolony, że wybierasz odpowiednie nazwy, edytuj skrypt i zmień ten wiersz:

    echo bash "$Script" &

do:

    bash "$Script" &

Istnieją trzy sposoby na wywołanie skryptu bash z innego, tak jak tutaj:

  1. Ustaw drugi skrypt jako wykonywalny, dodaj #!/bin/bashwiersz u góry i ścieżkę, w której znajduje się plik, do $PATHzmiennej środowiskowej. Następnie możesz nazwać to normalnym poleceniem;

  2. Lub wywołaj to za pomocą polecenia źródłowego (alias to.) W następujący sposób source /path/to/script:;

  3. Lub użyj polecenia bash, aby go wykonać: /bin/bash /path/to/script;

W przypadku OP jeden lub więcej z 200 skryptów nie zawierało #!/bin/bashpierwszego wiersza shebang w pliku. W związku z tym należało zastosować opcję 3..


200 skryptów działających jednocześnie

Pojawił się komentarz na temat tego, czy „działają w tym samym czasie”. W typowym systemie z 8 procesorami 25 skryptów będzie współużytkować jeden procesor w tym samym czasie, ale tylko jeden skrypt będzie wykonywany jednocześnie, aż skończy się przedział czasu (mierzony w milisekundach). Następnie następne zadanie otrzyma sprawiedliwy udział w milisekundach, a następnie następne zadanie itp. Itp.

W luźnym ujęciu możemy powiedzieć, że 200 zadań działa „jednocześnie”, ale nie „jednocześnie” na 8 procesorach, co odpowiada 25 zadaniom na procesor:

Stany wątków.png

Powyżej obrazu i komentarzy poniżej z harmonogramu jądra systemu Linux

time slice.png

WinEunuuchs2Unix
źródło
dziękuję .. chodzi o to, że w moim prawdziwym przypadku mam do uruchomienia ponad 200 skryptów. więc czy jest jakiś sposób, aby uruchomić je wszystkie za pomocą jednego polecenia (tj. bez zapisywania nazw plików)?
aaaaa
@ aaaaa Zmieniłem odpowiedź na 200 skryptów.
WinEunuuchs2Unix
dzięki. to działa .. jedyną rzeczą, którą musiałem dodać do twojej ostatniej linii, było „bash”. w przeciwnym razie dostaję „odmowę zgody”.
aaaaa
1
@ aaaaa Czy faktycznie wolisz, aby wszystkie ponad 200 skryptów działało w tym samym czasie, czy wolisz mieć mniejszą liczbę (powiedzmy 10) jednocześnie, a pozostałe w kolejce do uruchomienia, gdy jeden lub więcej z nich zakończy się i liczba aktualnie uruchomionych skryptów spada poniżej tej liczby? (Jeśli interesują Cię takie rozwiązania, sugeruję edycję pytania z informacją o tym, ile masz skryptów, ile czasu mają one na uruchomienie, jaki rodzaj pracy wykonują itd.)
Eliah Kagan
@aaaaa Dziękujemy za opinię. Zaktualizowałem odpowiedź, aby zawierała bashprefiks wywoływania skryptu.
WinEunuuchs2Unix
3

Jest na to narzędzie, czytaj man run-parts.

Na przykład:

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

w moim skrypcie zapasowym Palm Pilot. ${visorhome}/pbackup.d/:

01PopulateJpilot  02Extract_Pedometer  03URLs  04google  05Books  06Weight  07Sec  08Bkgm 50hardlinks
waltinator
źródło
1
@ eliah-kagan Uruchamianie „ponad 200 skryptów” „jednocześnie” wydaje się nierozsądne. Może to być dobry sposób na testowanie warunków skrajnych systemu
waltinator,
Słuszna uwaga. Myślę, że nadal warto wspomnieć, że run-partswykonuje skrypty sekwencyjnie, a nie wszystkie naraz, zgodnie z żądaniem OP. Masz jednak rację, że uruchomienie 200 skryptów jednocześnie nie jest tak samo skuteczne, jak uruchomienie 5 - i nawet jeśli uruchomienie ich wszystkich jednocześnie nie powoduje żadnych problemów, może być niepotrzebne. Ja skomentował zaproponować OP wyjaśnić swoje preferencje w tym względzie.
Eliah Kagan
run-partsnie uruchomi skryptów (mają one kropkę w nazwie:my_folder/*.sh
jfs
1
run-partsma bardzo specyficzne wymagania dotyczące nazwy pliku z jakiegoś dziwnego powodu. Nie uruchamia nazw plików z rozszerzeniami, więc obawiam się, że to tutaj nie zadziała.
terdon
1

Aby uruchomić wszystkie *.shskrypty w my_folderkatalogu jednocześnie, używając xargs:

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

Aby ograniczyć liczbę jednocześnie wykonywanych skryptów do 10:

$ ls my_folder/*.sh | xargs -P10 -n1 bash
jfs
źródło
Używanie danych wyjściowych lsw skrypcie jest złą praktyką . Korzystanie findjest znacznie bezpieczniejsze. To pierwszy element tutaj: mywiki.wooledge.org/BashPitfalls#for_f_in_.24.28ls_.2A.mp3.29
Joe
@ Joe w ogóle, to prawda. Nie widzę problemów w tym konkretnym przypadku.
jfs
To dlatego, że już o tym wiesz. Ludzie przyjeżdżający tu później mogą nie.
Joe
@Joe nie ślepo przestrzegaj dogmatów. Pomyśl sam, niż jedna opcja jest lepsza niż inna, co są kompromisy w twoim przypadku.
jfs
To nie jest dogmat. Jestem na nie uczulony. Ale widziałem rzeczy, które może emitować. Analiza wyników czytelnych dla ludzi nie jest wiarygodna. Deweloperzy nie mają motywacji do zachowania
Joe,