Wielowarte skryptowanie i zarządzanie procesami w wierszu poleceń

Wielowarte skryptowanie i zarządzanie procesami w wierszu poleceń

Rzeczy, które możesz zrobić za pomocą skryptu Bash, są nieograniczone. Gdy zaczniesz opracowywać zaawansowane skrypty, wkrótce zaczniesz napotykać limity systemu operacyjnego. Na przykład, czy komputer ma 2 wątki procesora lub więcej (wiele nowoczesnych maszyn ma 8-32 wątków)? Jeśli tak, to prawdopodobnie skorzystacie z wielowo-strefowych scenariuszy i kodowania Bash. Kontynuuj czytanie i dowiedz się, dlaczego!

W tym samouczku się nauczysz:

  • Jak zaimplementować jedno-strefowe liniowce Bash bezpośrednio z wiersza poleceń
  • Dlaczego kodowanie wielowociorne prawie zawsze może i zwiększy wydajność twoich skryptów
  • Jak działają tło i procesy na pierwszym planie i jak manipulować kolejkami pracy
Wielowo-strefowe scenariusze i zarządzanie procesami

Zastosowane wymagania i konwencje oprogramowania

Wymagania oprogramowania i konwencje linii poleceń Linux
Kategoria Wymagania, konwencje lub wersja oprogramowania
System Niezależne od rozkładu, zależne od wersji bash
Oprogramowanie Interfejs wiersza poleceń bash (grzmotnąć)
Konwencje # - Wymaga, aby podane polecenia Linux są wykonywane z uprawnieniami root bezpośrednio jako użytkownik root lub za pomocą sudo Komenda
$ - Wymaga, aby podane polecenia Linux zostały wykonane jako zwykły użytkownik niepewny

Po wykonaniu skryptu BASH będzie on maksymalnie używa pojedynczego wątku procesora, chyba że uruchomisz subshells/wątki. Jeśli Twój komputer ma co najmniej dwa wątki procesora, będziesz w stanie maksymalnie wyprzedzić zasoby procesora za pomocą wielokrotnych skryptów w Bash. Powód tego jest prosty; Jak tylko uruchomi się wtórny „wątek” (odczyt: subshell), wówczas ten kolejny wątek może (i często) użyć innego wątku procesora.

Załóż przez chwilę, że masz nowoczesną maszynę z 8 lub więcej wątkami. Czy możesz zacząć widzieć, jak moglibyśmy wykonywać kod - jednocześnie osiem równoległych wątków, każdy z innym wątkiem procesora (lub udostępniany we wszystkich wątkach) - w ten sposób wykonałby to znacznie szybciej niż jedno-wowarte Proces działający w jednym wątku procesora (który może być dzielony z innymi procesami uruchamiającymi)? Zwykle zyski będą zależeć nieco od tego, co jest wykonywane, ale zyski będą, prawie zawsze!

Podekscytowany? Świetnie. Zanurzmy się w to.

Najpierw musimy zrozumieć, czym jest subshell, w jaki sposób się rozpoczyna, dlaczego użyłbyś jednego i jak można go użyć do wdrożenia wielodokładnego kodu bash.

Subshell to kolejny proces klienta Bash wykonany/uruchomiono z bieżącego. Zróbmy coś łatwego i zacznij jeden z otwartego terminalu Bash:

$ bash $ exit exit $ 

Co tu się stało? Najpierw zaczęliśmy kolejną skorupę bash (grzmotnąć), który zaczął się, a z kolei przyniosła monit o polecenie ($). Więc drugi $ W powyższym przykładzie jest w rzeczywistości inna powłoka bash, z inną Pid (Pid jest identyfikatorem procesu; Unikalny identyfikator liczby, który jednoznacznie identyfikuje każdy proces działający w systemie operacyjnym). Wreszcie opuściliśmy z subshell Wyjście i wrócił do subshelly nadrzędnej! Czy możemy jakoś dowodować, że tak naprawdę się stało? Tak:

$ $ 220250 $ Bash $ $ 222629 $ EXIT EXIT $ ECO 220250 $ 

Istnieje specjalna zmienna w Bash $$, który zawiera Pid bieżącej powłoki w użyciu. Czy widzisz, jak zmienił się identyfikator procesu, gdy byliśmy w subshell?

Świetnie! Teraz, gdy wiemy, czym są podskorle i trochę o tym, jak działają, zanurzmy się w przykładach kodowania wielowo-strefowego i dowiedz się więcej!

Proste wielokresta w Bash

Zacznijmy od prostego, jedno-liniowego, wielokrogowego przykładu, którego wyjście może początkowo wyglądać nieco myląco:

$ za i in $ (seq 1 2); echo $ i; Wykonane 1 2 $ dla I in $ (SEQ 1 2); echo $ i & DODAK [1] 223561 1 [2] 223562 $ 2 [1]- gotowe $ i [2]+ Done Echo $ i $ 

Na początku Do pętla (patrz nasz artykuł na temat pętli bash, aby dowiedzieć się, jak kodować pętle
), po prostu wyprowadzamy zmienną $ i który wyniesie się od 1 do 2 (z powodu naszego użycia polecenia SEQ), które - co ciekawe - rozpoczyna się w subshell!

NOTATKA
Możesz użyć $ (…) składnia gdziekolwiek W wierszu poleceń, aby uruchomić subshell: Jest to bardzo potężny i wszechstronny sposób kodowania subshells bezpośrednio w innych wierszach poleceń!

W sekundę Do Pętla, zmieniliśmy tylko jedną postać. Zamiast używać ; - EOL (koniec linii) Idiom składni Bash, który kończy dane polecenie (możesz o tym pomyśleć, jak Enter/Execute/Go naprzód), użyliśmy I. Ta prosta zmiana sprawia, że ​​prawie zupełnie inny program, a nasz kod jest teraz wielokrotny! Oba echo przetwarzają mniej więcej w tym samym czasie, a niewielkie opóźnienie w systemie operacyjnym nadal musi wykonać drugi przebieg pętli (echo „2”).

Możesz pomyśleć I w podobny sposób ; z różnicą I Powiedz systemowi operacyjnego, aby „nadal uruchamiają następne polecenie, kontynuuj przetwarzanie kodu”, podczas gdy ; czeka na bieżące polecenie wykonujące (zakończone przez ;) Aby zakończyć / zakończyć przed powrotem do wiersza polecenia / przed kontynuowaniem przetwarzania i wykonania następnego kodu.

Zbadajmy teraz dane wyjściowe. Widzimy:

[1] 223561 1 [2] 223562 2 USD 

Początkowo, a następnie:

[1]- gotowe echo $ i [2]+ gotowe echo $ i $ 

I istnieje również pusta linia pomiędzy, która jest wynikiem procesów tła, które wciąż działa, czekając na następne wejście polecenia (wypróbuj to polecenie kilka razy w wierszu poleceń, a także pewne warianty światła, a otrzymasz poczuć, jak to działa).

Pierwsze wyjście ([1] 223561) pokazuje nam, że rozpoczął się proces w tle, z PID 223561 i numer identyfikacyjny 1 otrzymał to. Następnie, już zanim skrypt osiągnął drugi echo (echo prawdopodobnie jest drogim instrukcją kodu do uruchomienia), wyjście 1 został pokazany.

Nasz proces w tle nie zakończył się całkowicie, ponieważ następne wyjście wskazuje, że uruchomiliśmy drugą subshell/wątek (jak wskazuje [2]) z PID 223562. Następnie drugi proces wyświetla 2 („Współczynnik”: mechanizmy OS mogą na to wpłynąć), zanim drugi wątek sfinalizuje.

Wreszcie w drugim bloku wyjściowym widzimy, że dwa procesy kończą się (jak wskazuje Zrobione), a także to, co wykonywali ostatnie (jak wskazano echo $ i). Zauważ, że te same liczby 1 i 2 są używane do wskazania procesów tła.

Więcej multipreading w Bash

Następnie wykonajmy trzy polecenia snu, wszystkie zakończone przez I (więc zaczynają jako procesy w tle) i pozwól nam zmieniać czas snu, abyśmy mogli wyraźniej zobaczyć, jak działa przetwarzanie tła.

$ Sleep 10 & Sleep 1 & Sleep 5 i [1] 7129 [2] 7130 [3] 7131 $ [2]- Done Sleep 1 $ [3]+ Done Sleep 5 $ [1]+ Done Sleep 10 

Dane wyjściowe w tym przypadku powinno być samorozprawie. Wiersz poleceń natychmiast powraca po naszym spać 10 i śpij 1 i sleep 5 & Pokazane są komendy i 3 procesy w tle, z odpowiednimi PID. Wchodzę kilka razy pomiędzy. Po 1 sekundzie pierwsze polecenie ukończone, uzyskując Zrobione dla identyfikatora procesu [2]. Następnie trzeci i pierwszy proces zakończył się, zgodnie z ich czasami snu. Zwróć również uwagę, że ten przykład wyraźnie pokazuje, że wiele zadań jest skutecznie uruchomionych, jednocześnie w tle.

Być może również odebrałeś + Zaloguj przykłady wyjściowe powyżej. Chodzi o kontrolę pracy. Przyjrzymy się kontroli pracy w następnym przykładzie, ale na razie ważne jest, aby to zrozumieć + Wskazuje to zadanie, które będzie kontrolowane, jeśli mielibyśmy używać/wykonywać polecenia kontroli zadań. Zawsze jest to praca, która została ostatnio dodana do listy pracujących miejsc pracy. To jest domyślne zadanie, które zawsze jest to ostatnio dodawane do listy miejsc pracy.

A - Wskazuje zadanie, które stałoby się następnym domyślnym dla poleceń kontroli zadania, jeśli bieżące zadanie (zadanie z + znak) zakończy. Kontrola zadań (lub innymi słowy; obsługa wątków tła) może początkowo wydawać się nieco zniechęcające, ale jest to bardzo przydatne i łatwe w użyciu, gdy się do tego przyzwyczaisz. Zanurzmy się!

Kontrola pracy w Bash

$ Sleep 10 & Sleep 5 i [1] 7468 [2] 7469 $ Jobs [1]- Bieganie snu 10 i [2]+ bieganie snu 5 i $ FG 2 Sleep 5 $ FG 1 Sen 10 $ 

Tutaj umieściliśmy dwa snu w tle. Po ich uruchomieniu zbadaliśmy aktualnie uruchomione zadania, korzystając z Oferty pracy Komenda. Następnie drugi wątek został umieszczony na pierwszym planie za pomocą FG polecenie, a następnie numer zadania. Możesz tak myśleć tak; I w Sen 5 Dowództwo zostało przekształcone w ;. Innymi słowy, proces w tle (nie czekany) stał się procesem na pierwszym planie.

Następnie czekaliśmy na Sen 5 polecenie do sfinalizowania, a następnie umieścić sen 10 polecić na pierwszym planie. Zauważ, że za każdym razem, gdy to zrobiliśmy, musieliśmy czekać, aż proces na pierwszym planie zakończy się, zanim otrzymamy nasz wiersz poleceń, co nie jest w przypadku korzystania tylko z procesów tła (ponieważ dosłownie „działają w tle”).

Kontrola pracy w Bash: przerwanie pracy

$ Sleep 10 ^z [1]+ Zatrzymaj spać 10 $ BG 1 [1]+ Sleep 10 & $ FG 1 Sleep 10 $ 

Tutaj naciskamy Ctrl+Z, aby przerwać bieżący sen 10 (który zatrzymuje się, jak wskazano Zatrzymany). Następnie umieszczamy proces w tle i wreszcie umieszczamy go na pierwszym planie i czekamy na zakończenie.

Kontrola pracy w Bash: przerwanie pracy

$ sleep 100 ^z [1]+ Zatrzymał sen 100 $ zabójstwo %1 $ [1]+ Zakończony sen 100 

Po rozpoczęciu 100 sekund spać, Następnie przerywamy proces uruchamiania przez Ctrl+Z, a następnie zabijamy pierwszy rozpoczęty/uruchomiony proces w tle za pomocą użycia zabić Komenda. Zwróć uwagę, jak używamy %1 W tym przypadku zamiast po prostu 1. Dzieje się tak, ponieważ teraz pracujemy z narzędziem, który nie jest natywnie powiązany z procesami w tle, jak FG I BG Czy. Tak więc, aby wskaż zabić, że chcemy wpłynąć na pierwszy proces w tle, używamy % a następnie numer procesu tła.

Kontrola zadań w Bash: Process Disnen

$ sleep 100 ^z [1]+ Zatrzymał spać 100 $ BG %1 [1]+ Sleep 100 & $ Odpadek 

W tym ostatnim przykładzie ponownie zakończymy bieganie spać, i umieść go w tle. Wreszcie wykonujemy zapierać się Polecenie, które możesz odczytać jako: Odłącz wszystkie procesy w tle (zadania) od bieżącej powłoki. Będą działać, ale nie są już „własnością” przez obecną powłokę. Nawet jeśli zamkniesz obecną powłokę i wylogowanie, procesy te będą działać, dopóki naturalnie zakończą.

Jest to bardzo potężny sposób przerwania procesu, umieszczenie go w tle, odrzucenie go, a następnie wyloguj się z używanego maszyny, pod warunkiem, że nie będziesz musiał już wchodzić w interakcje z procesem. Idealny dla tych długotrwałych procesów w stosunku do SSH, których nie można przerwać. Po prostu ctrl+z Proces (który tymczasowo go przerywa), umieść go w tle, odrzuć wszystkie zadania i wyloguj się! Idź do domu i życzę miłego, zrelaksowanego wieczoru, wiedząc, że Twoja praca będzie działać!

Przykłady wiersza poleceń wielowarstwowych i zarządzania procesami

Wniosek

W tym samouczku widzieliśmy, jak wdrożyć jedno-strefowe liniowce BASH bezpośrednio z wiersza dowodzenia, i zbadaliśmy, dlaczego kodowanie wielowociarni często zwiększa wydajność twoich skryptów. Zbadaliśmy również, jak działają procesy tła i pierwszego planu, i manipulowaliśmy kolejki pracy. Wreszcie zbadaliśmy, jak odrzucić naszą kolejkę pracy z bieżącego procesu, zapewniając nam dodatkową kontrolę nad uruchamianiem procesów. Ciesz się nowymi znalezionymi umiejętnościami i zostaw nam komentarz poniżej swoich doświadczeń związanych z kontrolą pracy!

Powiązane samouczki Linux:

  • Wprowadzenie do automatyzacji, narzędzi i technik Linuksa
  • Rzeczy do zainstalowania na Ubuntu 20.04
  • Rzeczy do zrobienia po zainstalowaniu Ubuntu 20.04 Focal Fossa Linux
  • Mastering Bash Script Loops
  • Bash Tła zarządzanie procesami
  • Zagnieżdżone pętle w skryptach Bash
  • Ubuntu 20.04 Przewodnik
  • Rzeczy do zrobienia po zainstalowaniu Ubuntu 22.04 JAMMY Jellyfish…
  • Przydatne przykłady i sztuczki
  • Samouczek debugowania GDB dla początkujących