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.


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.


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


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

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

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,
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.