Załóżmy, że mam pięć .sh
skryptó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:
GNU
parallel
jest idealny do tego rodzaju rzeczy. Zainstaluj za pomocą,sudo apt install parallel
a następnie:Te
-j
kontrole ile procesy t prowadzone równolegle, a-j0
oznacza „wszystkie z nich.” Ustaw inną wartość (np.-j20
), Aby zamiast tego uruchamiać skrypty partiami.źródło
parallel
polecenie zmoreutils
pakietu. Przykładowe użycie:parallel -j 20 -- my_folder/*.sh
(W przeciwieństwie do GNUparallel
,-j0
uruchamiałby skrypty pojedynczo).sudo apt install parallel
zastąpi on plik/usr/bin/parallel
z GNU równolegle. Tak długo, jak go instalujesz, jak sugeruje moja odpowiedź, powinien on działać zgodnie z oczekiwaniami.parallel
poleceń z podręcznika, pisząc moją odpowiedź, aby zasugerować GNU równolegle.Aby uruchomić wszystkie skrypty jednocześnie (równolegle) użyj:
Aby uruchomić jeden po drugim (sekwencyjnie) użyj:
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:
Ustaw atrybuty skryptu na wykonywalne za pomocą polecenia:
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:
do:
Istnieją trzy sposoby na wywołanie skryptu bash z innego, tak jak tutaj:
W przypadku OP jeden lub więcej z 200 skryptów nie zawierało
#!/bin/bash
pierwszego 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:
Powyżej obrazu i komentarzy poniżej z harmonogramu jądra systemu Linux
źródło
bash
prefiks wywoływania skryptu.Jest na to narzędzie, czytaj
man run-parts
.Na przykład:
w moim skrypcie zapasowym Palm Pilot.
${visorhome}/pbackup.d/
:źródło
run-parts
wykonuje 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.run-parts
nie uruchomi skryptów (mają one kropkę w nazwie:my_folder/*.sh
run-parts
ma 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.Aby uruchomić wszystkie
*.sh
skrypty wmy_folder
katalogu jednocześnie, używającxargs
:Aby ograniczyć liczbę jednocześnie wykonywanych skryptów do
10
:źródło
ls
w skrypcie jest złą praktyką . Korzystaniefind
jest znacznie bezpieczniejsze. To pierwszy element tutaj: mywiki.wooledge.org/BashPitfalls#for_f_in_.24.28ls_.2A.mp3.29