Załóżmy, że mam trzy (lub więcej) skrypty bash: script1.sh
, script2.sh
, i script3.sh
. Chciałbym wywołać wszystkie trzy skrypty i uruchomić je równolegle . Jednym ze sposobów jest wykonanie następujących poleceń:
nohup bash script1.sh &
nohup bash script2.sh &
nohup bash script3.sh &
(Ogólnie rzecz biorąc, skrypty mogą potrwać kilka godzin lub dni, więc chciałbym ich użyć nohup
, aby kontynuowały działanie nawet po zamknięciu konsoli).
Ale czy jest jakiś sposób na wykonanie tych trzech poleceń równolegle za pomocą jednego wywołania?
Myślałem o czymś takim
nohup bash script{1..3}.sh &
ale wydaje się to wykonać script1.sh
, script2.sh
i script3.sh
kolejno, a nie równolegle.
nohup bash script{1..100}.sh &
lubfor i in {1..100}; do nohup bash script{1..100} &; done
), zamiast pisaćnohup bash script*.sh &
100 razy.screen
(lubtmux
), aby rozwiązać problem z konsolą, ale zachować dostęp do danych wyjściowych (i danych wejściowych).nohup ... & nohup ... & nohup ... &
. Jeśli masz na myśli, że chcesz uruchomić wszystkie skrypty bez wpisywania nazwy każdego skryptu osobno, zrobi to prosta pętla.Odpowiedzi:
źródło
Lepszym sposobem byłoby użycie GNU Parallel . GNU równoległy jest prosty i dzięki nim możemy kontrolować liczbę zadań do uruchomienia równoległego z większą kontrolą nad zadaniami.
W poniższym poleceniu
script{1..3}.sh
rozwija się i są wysyłane jako argumentybash
równolegle do. Tutaj-j0
wskazuje jak wiele miejsc pracy powinny być prowadzone, jak to możliwe. Domyślnieparallel
uruchamia jedno zadanie dla jednego rdzenia procesora.Możesz także spróbować użyć
Podczas wykonywania drugiej metody, jeśli pojawi się komunikat o błędzie, oznacza to, że
--tollef
opcja jest włączona/etc/parallel/config
i że należy ją usunąć, a wszystko będzie działać poprawnie.Możesz przeczytać
GNU Parallels
stronę man tutaj, aby uzyskać bogatsze opcje.A jeśli
screen
wykonujesz zadania ze zdalnego komputera, lepiej użyj, aby sesja nie została zamknięta z powodu problemów z siecią.nohup
nie jest konieczne, ponieważ najnowsze wersje bash są dostarczane jakohuponexit
as,off
co zapobiegnie wysyłaniu przez powłokę nadrzędnąHUP
sygnału do jej dzieci podczas wychodzenia. W przypadku, gdy nie jest rozbrojony, zrób toźródło
bash
ponieważparallel -j0 bash :::: <(ls script{1..3}.sh)
można zmniejszyć powłokęparallel -j0 bash :::: script{1..3}.sh
, nie?parallel -j0 bash ::: script{1..3}.sh
?bash ::: script{1..3}.sh
jest przekazywaneparallel
, nie::: script{1..3}.sh
. Więc powinno to pierwsze rozszerzenie doparallel bash ::: script1.sh script2.sh script3.sh
przez powłokę i następnieparallel
wywołańbash script1.sh
,bash script2.sh
,bash script3.sh
. Próbowałemparallel -j0 bash ::: script{1..3}.sh
- jest to lepsze niż::::
podejście, ponieważ pozwala uniknąć konieczności zastępowania procesów. Również parsowania wyjście ls jeździł z pułapekMożemy również użyć
xargs
do uruchomienia wielu skryptów równolegle.tutaj każdy skrypt jest osobno przekazywany do bash jako argument.
-P 0
wskazuje, że liczba równoległych procesów może być jak największa. Bezpieczniej jest też korzystać z domyślnej wersji bashjob control feature
(&)
.źródło
Pojedyncza linia rozwiązanie:
Mniej żartobliwie, po prostu użyj skryptu opakowania:
Lub zapętl się nad nimi:
źródło
Jeśli chcesz zaoszczędzić trochę czasu na pisanie
Albo po namyśle, może nie
źródło
Sprawdź to narzędzie: https://github.com/wagoodman/bashful
Załóżmy, że masz
mytasks.yaml
zI działasz tak:
Twoje skrypty byłyby uruchamiane równolegle z pionowym paskiem postępu (+ eta, jeśli uruchomiłeś go wcześniej, a czas jest deterministyczny). Możesz dostosować liczbę zadań, które chcesz uruchomić równolegle, jeśli zaczniesz uruchamiać więcej niż tylko podane 3 tutaj:
Oświadczenie: Jestem autorem.
źródło
Sugeruję znacznie prostsze narzędzie, które właśnie napisałem. Obecnie nazywa się par, ale wkrótce zostanie zmieniona na parl lub pll, jeszcze nie zdecydowałem.
https://github.com/k-bx/par
Interfejs API jest tak prosty, jak:
źródło
Użyj równoległej powłoki
https://github.com/keithamus/parallelshell
źródło