Skrypty w powłoce UNIX: procesy równoległe

Dlaczego procesy równoległe?

Domyślnym zachowaniem powłoki jest sekwencyjne przetwarzanie wszystkich wierszy skryptu powłoki. Podobnie oddzielanie poleceń średnikiem gwarantuje przetwarzanie sekwencyjne (seryjne). A co jeśli mamy np. procesor czterordzeniowy i chcemy, aby skrypt powłoki działał jednocześnie na wszystkich czterech rdzeniach - wielowątkowość? Rzućmy okiem.

Co powiesz na procesy równoległe?

Istnieje prosty sposób wykonywania procesów równoległych w systemie Unix. Wystarczy zastosować „sztuczkę” polegającą na uruchamianiu programów w tle rozmowy, wpisując ampresand & po istniejącym poleceniu. Jeśli uruchomisz polecenia w ten sposób, powłoka nie będzie czekać na zakończenie polecenia w tle, co daje korzyść w postaci przetwarzania równoległego.

Jak je śledzić?

Jak mogę sprawdzić, czy wszystkie polecenia uruchomione w tle zostały zakończone? Po uruchomieniu polecenia w tle należy zachować zawartość zmiennej $!, w której powłoka automatycznie zapisuje PID (Process ID) ostatniego skryptu, który był uruchamiany w tle w tej instancji powłoki. Jeśli mam więcej takich procesów, można je wszystkie po kolei przechowywać w tablicy powłoki.

Jak poczekać na zakończenie procesów równoległych?

Wystarczy do tego prosta pętla Until, w której określamy, że skrypt będzie „uśpiony” do czasu zakończenia wszystkich procesów z pola powłoki.

Marián Knězek