Moduł 4: Strumienie, potoki, sterowanie procesami Strumienie i potoki Standardowe strumienie są podstawowymi kanałami komunikacji pomiędzy komputerem a otoczeniem. Do podstawowych strumieni należą Standard input standardowy strumień wejścia oraz Standard output standardowy strumień wyjścia. Standardowy strumień wejścia stdin - to dane przekazywane do programu zwykle w formie tekstu. Pobiera dane używając funkcji read. Nie wszystkie programy wymagają danych wejściowych i wykonują się nie pobierając żadnych danych z stdin. Jeżeli dane nie są przekierowane to zostają pobierane z terminala. Przykłady: #ls - wyświetla listę plików #man ls - opisuje działanie komendy ls #cat < przyklad.txt wyświetlenie zawartości pliku przykład.txt Standardowy strumień wyjścia stdout strumień, do którego są zapisywane dane wynikowe przez program. Wykorzystuje funkcje write, niektóre programy nie zwracają danych wynikowych, jeżeli zostaną przeprowadzone prawidłowo to nie wypisują żadnego wyniku. Jeżeli dane nie są przekierowane to są wysyłane do terminala, z którego uruchomiono program. Przykłady: #mkdir nazwa_forderu - tworzenie folderu nazwa_folderu #rmdir nazwa_forderu - usunięcie folderu nazwa_folderu #touch plik.txt wstawia plik plik.txt #cat plik.txt wyświetla zawartość pliku plik.txt Przekierowanie strumieni umożliwia przeniesienie wyniku np. do pliku tekstowego. Wyróżniamy 3 sposoby przekierowania danych: > umożliwia przekierowanie strumienia danych do pliku. W przypadku, gdy plik już istnieje to jego zawartość zostaje usunięta >> podobnie jak w przypadku > z tą różnicą, że jeżeli plik istnieje to wynik komendy zostaje dopisany do końca pliku < Umożliwia pobranie z pliku danych i przetworzenia ich przez polecenie Przykłady: #ls > plik1.txt wpisze wynik polecenia ls do pliku #ls >> plik1.txt dopisze wynik polecenia ls na koniec pliku #cat < plik1.txt wypisze zawartość pliku
Przetwarzanie potokowe pozwala za pomocą znaku łączyć wyjścia jednego polecenia z wejściem innego. Umożliwia to wymianę danych pomiędzy procesami. Przykład: #touch procesy.txt #cat > procesy.txt << EOF >Wykaz procesów, które nie zawierają w sobie wzorca sh >EOF #ps grep v sh cat >> procesy.txt #cat procesy.txt Sterowanie procesami Rysunek 1. Zawartość pliku procesy.txt Każdy program, który jest uruchomiony w systemie nosi nazwę procesu. Proces składa się z następujących elementów: Kod binarny procesu załadowany z pliku Dane programu struktury danych, pamięć dynamicznie przydzielona w trakcie działania procesu Dane systemowe informacja o procesie utrzymywania przez system Podczas tworzenia procesu system inicjalizuje systemowe struktury danych opisujące proces. Podczas działania procesu dane są aktualizowane. Wyróżniamy następujące dane systemowe: Identyfikator procesu (PID) unikalna liczba całkowita jednoznacznie identyfikująca proces Identyfikator procesu macierzystego (PPID) - wartość PID procesu, który stworzył dany proces Środowisko procesu zbiór zmiennych środowiskowych. Każdy proces ma swoje niezależne od innych procesów środowisko wykonania, które początkowo jest kopiowane z procesu-rodzica, a następnie jest modyfikowane niezależnie od innych procesów Standardowe strumienie danych Komenda ps komenda wyświetla listę wszystkich aktywnych procesów. Domyślnie komenda wyświetla poniższe dane: Rysunek 2. Lista procesów wyświetlona po wykonaniu komendy ps. PID numer procesu TTY terminal, z którego została wykonana komenda
TIME czas aktywności CMD nazwa komendy, która została wykonana Więcej informacji o procesie aktualnej powłoki można uzyskać za pomocą polecenia #ps f UID ID właściciela PPID C numer procesu nadrzędnego STIME czas uruchomiania Rysunek 3. Więcej informacji na temat procesów Jeżeli chcemy uzyskać wszystkie dostępne informacje o procesie używamy komendy #ps l Rysunek 4. Wszystkie informacje na temat procesów F flaga procesu S status procesu PRI priorytet procesu NI wartość NI ADDR adres pamięci przedstawiony w systemie szesnastkowym SZ rozmiar w KB WCHAN adres pamięci dla śpiących procesów Gdy jesteśmy zalogowani, jako administrator to możemy wyświetlić listę procesów, które są aktualnie uruchomione na całym komputerze za pomocą komendy #ps-a. Rysunek 5. Fragment listy procesów uruchomionych na maszynie Bardziej szczegółowy opis procesów można uzyskać podobnie jak w poprzednich przypadkach dołączając do komendy literkę f. Rysunek 6. Bardziej szczegółowa lista procesów uruchomionych na maszynie Komenda #ps c wyświetla klasę(cls) procesu i priorytet.
Rysunek 7. Wynik polecenia ps -c Opis skonfigurowanych klas można uzyskać dzięki poleceniu #priocntl l Rysunek 8. Skonfigurowane klasy Analogicznie jak w przypadku #ps Af, można łączyć też polecenie wyświetlania procesów szczegółowo wraz z klasami poleceniem #ps -cf. Aby wyświetlić listę procesów aktualnie wykonywanych używamy polecenia #ps g 0. Rysunek 9. Lista procesów aktualnie wykonywanych Aby wyświetlić identyfikator sesji (SID) wykorzystujemy polecenie #ps -j. Rysunek 10. Wyświetlenie danych o procesach wraz z SID Komenda sleep komenda usypiająca proces na podany czas. Są dwie opcje użycia polecenia sleep : #date;sleep 10;date wyświetlenie daty w danym momencie i po upływie polecenia sleep Rysunek 11. Efekt wywołania polecenia sleep
#(sleep 10; date) & - Wyświetlenie daty po upływie 10 sekund i możliwość wykonywania w tym czasie innych komend dzięki ustawieniu pracy w tle za pomocą znaku & na końcu komendy. Dodatkowo po wpisaniu znaku & na końcu komendy otrzymujemy od razu jego ID. Rysunek 12. Efekt wykonana polecenia sleep pracującego w tle Komenda kill komenda umożliwiająca usunięcie procesu. Przykład: #ps wyświetlenie listy procesów #sleep 120 & - uruchomienie sleep w tle #ps wyświetlenie listy procesów #kill 2207 usunięcie procesu 2207 #ps ponowne wyświetlenie listy procesów Rysunek 13. Przykład wykorzystania polecenia "kill" Sterowanie zadaniami przez używaną powłokę (procesy pierwszo i drugoplanowe) Procesy interakcyjne dzielimy na dwa rodzaje: Procesy pierwszoplanowe związane z terminalem (np. ls) Procesy drugoplanowe wykonywane w tle Aby program był wykonywany w tle wystarczy na końcu polecenia dodać znak & Przykład: #(sleep 10; date) & - wyświetli datę po 10 sekundach #gedit & uruchamia edytor treści w tle
Przykład zarządzania zadaniami w powłoce znajduje się w następnym rozdziale, gdzie będzie uruchamiany edytor treści gedit, a następnie będziemy go przenosić z pierwszego planu do tła i odwrotnie. Wstrzymywanie procesów Aby uruchomić wybrany proces wpisujemy w konsoli jego nazwę, przykładowo będzie to edytor tekstu gedit. Polecenie jobs polecenie wyświetla aktualnie wykonywane zadania oraz ich status Polecenie ^Z oznacza w rzeczywistości skrót klawiszowy CTRL + Z i jego zadaniem jest przerwanie wykonywanego zadania. Polecenie ^C polecenie zamyka uruchomiony proces Polecenie bg %id lub bg przenosi jeden lub wszystkie zatrzymane procesy do tła, a następnie je uruchamia Polecenie fg %id przywraca proces z tła, blokując w ten sposób konsolę Polecenie kill ID kończy proces o podanym ID Przykłady: #gedit uruchamia edytor tekstu ^Z zatrzymuje działanie edytora #jobs l wyświetla status programu #bg przenosi program do tła i uruchamia #jobs l wyświetla status programu #fg %1 przywraca edytor z tła i blokuje w ten sposób terminal ^C zamyka uruchomiony program Rysunek 14. Uruchamianie poleceń #gedit & - uruchamia programik w tle #jobs l wyświetla informacje o procesie #fg %1 przywraca proces z tła ^Z zatrzymuje działanie procesu odblokowując terminal #jobs l wyświetla informacje o procesie
Rysunek 15. Uruchamianie poleceń cd. #kill 1487 usuwa proces Monitorowanie procesów Monitorowanie procesów może się odbywać za pomocą każdej z poniższych komend Tabela 1. Komendy monitorowania procesów Komenda ps pgrep prstat preap pstop prun pwait pwdx pargs pfiles pldd ptree pstack truss svcs Działanie Wyświetla status i informacje na temat procesów Szuka PID procesów Wyświetla statystyki wszystkich procesów Wyłapuje procesy Zombie Zatrzymuje tymczasowo procesy Kontynuuje wcześniej zatrzymane procesy Czeka aż skończy się proces Pokazuje folder, w którym działa proces Wypisuje argumenty i wartości procesu Wypisuje listę opisów procesu Lista dynamicznych bibliotek procesu Wypisuje drzewo procesu Debuguje wynik procesu Śledzi wezwania i sygnały systemowe dla procesu Z opcją -p komenda wyświetla listę procesów należących do instancji usługi Komenda pgrep sprawdza aktywne procesy w systemie i sporządza raport ID procesów, których atrybuty spełniają kryteria wpisane w komendzie. Może być używany do zmiany połączenia komend grep i ps w celu pobrania PID.
Rysunek 16. Przykład użycia pgrep Komenda prstat- wyświetla interwałowo informacje na temat wszystkich procesów. #prstat 1 wyświetla, co sekundę informacje(crtl + c, aby przerwać). Komenda preap czyści niedziałające procesy lub procesy zombie, które są bezużyteczne a pobierają zasoby systemu. #ps efl greap Z wyszuka wadliwe procesy #preap PID usunie proces o identyfikatorze PID Komendy pstop PID i prun PID zatrzymują i uruchamiają podany proces. Komenda pwait PID usypia konsole do czasu zakończenia wskazanego procesu Komenda pwdx Pokazuje lokalizację wybranego procesu Rysunek 17. Wyświetlenie wybranej lokalizacji procesu Komenda pargs wyświetla informacje o procesach bez limitu w porównaniu do komendy ps Rysunek 18. Wynik użycia komendy pargs dla procesu 1237 Komenda pfiles wyświetla listę plików otwartych podczas działania procesu
Rysunek 19. Efekt działania polecenia pfiles Komenda pldd lista bibliotek wykorzystywanych przez proces Rysunek 20. Lista bibliotek wykorzystywanych przez proces Komenda ptree wyświetla wszystkie dzieci i rodziców danego procesu Rysunek 21. Efekt działania ptree
Komenda pstack śledzi uruchomiony proces Rysunek 22. Wynik komendy pstack Komenda truss jedna z najbardziej pożytecznych komend, śledzi wezwania i sygnały systemu wygenerowane przez proces. Przykładowo można śledzić wybrany proces: Rysunek 23. Przykładowy wynik śledzenia procesu 333 Zadania do samodzielnego rozwiązania Po uruchomieniu klikamy prawym przyciskiem na pulpicie i wybieramy opcję Open Terminal. Zad.1 Podstawowe wykorzystanie strumieni oraz potoków. Wyświetl listę plików i folderów #ls Rysunek 24. Lista plików i folderów Utwórz folder Lab_procesy i sprawdź czy folder został utworzony Rysunek 25. Lista z nowo utworzonym folderem
Przejdź do utworzonego folderu, a następnie upewnij się że jesteś w utworzonym folderze Utwórz plik lista_procesow.txt Rysunek 26. Przejście do utworzonego folderu Sprawdź czy został utworzony plik Rysunek 27. Tworzenie nowego pliku Rysunek 28. Lista plików Dodaj treść do pliku Lista aktywnych procesów: Sprawdź zawartość pliku lista_procesow.txt Rysunek 29. Dodawanie treści do pliku Rysunek 30. Wyświetlenie zawartości pliku Wyświetl listę procesów, następnie dodaj ją do pliku usuwając jeden z procesów o wybranym identyfikatorze PID Wyświetl zawartość pliku Rysunek 31. Zapisywanie listy procesów do pliku
Zad.2. Operacje na procesach(sleep, kill, &) Rysunek 32. Zawartość pliku "lista_procesow.txt" Utwórz proces który wyświetli aktualną datę i datę po 10 sekundach Rysunek 33. Wyświetlanie daty z opóźnieniem Po wykonaniu poprzedniego zadania konsola została zablokowana na 10 sekund, przekształć poprzednie polecenie tak, aby można było po wykonaniu polecenia użyć komendy ls Rysunek 34. Uruchomienie procesu sleep w tle Wyświetl listę procesów, a następnie utwórz proces jak w poprzednim poleceniu ustawiając go na 2 minuty. Sprawdź ponownie listę procesów i sprawdź czy znajduje się tam uruchomiony przez ciebie proces. Następnie usuń proces wykorzystując jego PID i ponownie sprawdź listę procesów
Rysunek 35. Usuwanie utworzonego procesu Zad.3. Sterowanie procesami(jobs, ^Z, ^C, bg, fg, kill) Uruchom z poziomu terminala edytor tekstu gedit Rysunek 36. Uruchomienie edytora tekstu Po uruchomieniu edytora tekstu nie można wpisywać komend w terminalu dopóki proces działa jako pierwszoplanowy. Zatrzymaj działanie programu(ctrl + Z) Rysunek 37. Zatrzymanie działania programu
Następnie wyświetl status uruchomionych zadań Rysunek 38. Lista uruchomionych zadań Uruchom ponownie program w tle i wyświetl jego status Rysunek 39. Przeniesienie procesu na drugi plan Przywróć program do działania w trybie pierwszoplanowym posługując się jego numerem z polecenia jobs, a następnie poleceniem CTRL + C zakończ działanie programu Rysunek 40. Przywrócenie programu na pierwszy plan Uruchom ponownie program gedit w tle i wyświetl działające zadania Rysunek 41. Uruchamianie procesu w tle Przenieś proces z tła do pierwszego planu używając jego numeru i zatrzymaj jego działanie Rysunek 42. Przeniesienie procesu z tła na pierwszy plan
Wyświetl listę aktywnych procesów i usuń proces gedit Rysunek 43. Lista aktywnych procesów Rysunek 44. Usuwanie procesu