Wykonaj jednocześnie dwa lub więcej poleceń w skrypcie powłoki

Nov 28 2020

Często bardzo pomocne jest uruchamianie poleceń równolegle w skrypcie powłoki, ale nie mogę znaleźć sposobu, aby to zrobić. czy to możliwe? Jeśli tak, jak miałbym to osiągnąć? Jestem zainteresowany głównie zrobieniem tego dla fish.

Jest to przydatne, gdy uruchamiam polecenia, których wykonanie zajmuje dużo czasu, ale mogą lub muszą być uruchamiane w tym samym czasie, aby skrócić czas zakończenia wszystkiego.

Odpowiedzi

5 KamilMaciorowski Nov 28 2020 at 16:03

Najbardziej podstawowe podejście jest takie &, że ta druga odpowiedź jest właściwa. Zaleca również, nohupale nohupprzekierowuje stdin, stdout i stderr, coś, czego możesz chcieć lub nie. Czytaj różnica między nohup, disowna& i podjąć świadomą decyzję.

Inne podejście to parallel. Będzie to przydatne, jeśli polecenia, które chcesz zrównoleglać, są do siebie podobne i możesz stworzyć wzór.

Podstawowy wariant narzędzia (od moreutils, przynajmniej w Debianie ) pozwala ograniczyć liczbę zadań wykonywanych w tym samym czasie. GNUparallel jest bardziej zaawansowane. Jeśli zadania, które chcesz uruchomić, generują wynik, szczególnie przydatne będą następujące opcje:

--group
Wyjście grupowe. Dane wyjściowe z każdego zadania są grupowane i drukowane dopiero po zakończeniu polecenia. Stdout (standardowe wyjście), a następnie stderr (błąd standardowy). […]

( źródło )

( --groupjest domyślnie włączone, więc zwykle nie trzeba go jawnie używać).

--keep-order
-k
Zachowaj kolejność danych wyjściowych taką samą, jak kolejność danych wejściowych. Zwykle wynik pracy zostanie wydrukowany zaraz po zakończeniu zadania. […] -kWpływa tylko na kolejność drukowania wyników, a nie na kolejność wykonywania zadań.

( źródło )

Dzięki nim zostaną zorganizowane wyniki wielu zadań, czego nie można uzyskać &. Czasami możesz nie przejmować się wyjściem, ale nadal obchodzi cię kolejność; jak w mojej odpowiedzi, gdzie GNU paralleljest używane do zrównoleglenia wielu curlprocesów i uzyskania statusu wyjścia z każdego, zachowując sekwencję.

W Debianie GNU parallelznajduje się w pakiecie o nazwie parallel. Jako oddzielny plik wykonywalny parallelmożna uruchomić z dowolnej powłoki.

2 Giacomo1968 Nov 28 2020 at 11:12

Najlepszym sposobem na to jest połączenie nohuppoprzedzenia polecenia z &dopiskiem na końcu polecenia

Nie masz pewności, jaki jest Twój główny cel, ale mam nadzieję, że pomoże!

Aby uruchomić dowolne polecenie jako proces w tle na komputerze z systemem Linux, należy poprzedzić polecenie nohupi dopisać &na końcu.

Więc ostatnia komenda brzmiałaby:

nohup [your command] &

Te nohupśrodki powinny ignorować polecenia „hang ups” i znaku handlowego &dołączone do niego jest polecenie powłoki, który informuje system, aby uruchomić polecenie jako proces w tle. Więcej informacji na temat jego wykorzystania można znaleźć tutaj .

Po uruchomieniu takiego polecenia proces zostanie uruchomiony, zostaniesz odesłany z powrotem do wiersza poleceń i możesz wyjść z sesji terminala lub nawet zrobić coś innego, niezwiązanego z tym poleceniem podczas tej sesji terminala.