Wykonaj jednocześnie dwa lub więcej poleceń w skrypcie powłoki
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
Najbardziej podstawowe podejście jest takie &
, że ta druga odpowiedź jest właściwa. Zaleca również, nohup
ale nohup
przekierowuje 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 )
( --group
jest 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. […]-k
Wpł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 parallel
jest używane do zrównoleglenia wielu curl
procesów i uzyskania statusu wyjścia z każdego, zachowując sekwencję.
W Debianie GNU parallel
znajduje się w pakiecie o nazwie parallel
. Jako oddzielny plik wykonywalny parallel
można uruchomić z dowolnej powłoki.
Najlepszym sposobem na to jest połączenie nohup
poprzedzenia 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.