Temat : Procesy, zmienne, programy, pliki, standardowe wyjscie i wejscie Czas realizacji zajęć: 180 min. Zakres materiału, jaki zostanie Pojęcie procesu, procesy w systemie, usuwanie procesów, priorytety zrealizowany podczas zajęć: procesów, zarządzanie procesami, status zakończenia procesu, uruchamianie procesów w tle. Mechanizmy wejscia/wyjscia, sposoby wyswietlania plików tekstowych i wyszukiwania informacji, podstawowe operacje na plikach tekstowych, zmienne srodowiskowe. Wykorzystane polecenia: more plik - wyswietla tekst zajmujacy wiecej niz jeden ekran less plik- podobnie jak more, lecz z mozliwoscia przewijania tekstu tail plik - wyswietla ostatni fragment pliku tekstowego (standardowo 10 linii) grep tekst plik - wypisuje wiersz pliku zawierajacy podany fragment tekstu head plik - podobnie jak tail, lecz wyswietla poczatek chmod [opcje] plik- zmienia prawa dostepu do pliku chown uzytkownik.grupa plik - zmienia wlasciciela pliku grep - wyszukuje w pliku podany fragment tekstu i wyswietla linie zawierajace ten fragment echo komunikat - wyswietla komunikat na ekranie set - wyswietla zmienne srodowiskowe oraz ich wartosci ps - wyswietla procesy obecne w systemie top - wyswietla procesy CPU cal - wyswietla kalendarz find - wyszukuje pliki wedlug podanego wzorca kill - wysyla odpowiedni sygnal do procesu & - dodane na koncu polecenia uruchamia proces w tle fg - przenosi proces na pierwszy plan unset - czysci wartosc zmiennej, nie usuwajac jej readonly - ustawia wartosc zmiennej tylko do odczytu $? - zwraca kod zakonczenia polecenia pierwszoplanowego Procesy Każdy uruchomiony w systemie Unix program nosi nazwę procesu. Na proces składają się następujące elementy: 1. 2. 3. Kod binarny procesu załadowany z pliku. Dane programu: struktury danych zadeklarowane w programie dynamicznie przydzielona do procesu w trakcie jego działania. Dane systemowe: informacja o procesie utrzymywana przez system. oraz pamięć Dodatkowo, podczas tworzenia opisujące proces, które następnie danych systemowych należą: procesu system inicjalizuje systemowe struktury danych są aktualizowane podczas wykonania tego procesu. Do str. nr 1/10
Laboratorium systemów operacyjnych ćwiczenie nr 3. 1. 2. 3. 4. 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. Oprócz procesów, w systemie Unix, jak w większości nowoczesnych systemów, wyróżnia się wątki (ang. thread), będące najmniejszymi aktywnymi elementami systemu. Wątek jest rodzajem procesu, który dzieli przestrzeń adresową z innym procesem każdemu wątkowi jest więc przydzielony niezależny identyfikator. Proces to inaczej mówiac program dzialajacy w systemie. W systemie Linux mozliwe jest uruchomienie wielu procesów, procesy moga byc uruchomione w tle, moga tez posiadac priorytety dzieki którym zyskuja odpowiednio duzo czasu procesora na swoje dzialanie. Do wyswietlenia procesów dzialajacych w systemie sluzy polecenie ps. ps - wyswietla procesy uzytkownika ps -a - wyswietla procesy uruchomione na wszystkich konsolach ps -ax - wyswietla procesy na wszystkich konsolach lacznie z procesami ukrytymi. W pierwszej kolumnie wyswietlany jest identyfikator procesu (pid) %ps PID TTY 14285 14286 TIME pts/0 pts/0 0:00 0:00 CMD -csh ps numer procesu terminal czas aktywności nazwa Pełne informacje o procesach aktualnej powłoki podaje polecenie ps -f (ang. full) %ps -f USER Piotr Piotr PID PPID 14285 14267 14286 14285 C STIME 0 14:44:00 7 14:44:27 TTY TIME pts/0 0:00 pts/0 0:00 CMD -csh ps nazwa właściciela numer procesu numer czas procesu nadrzędnego uruchamiania terminal czas nazwa procesu str. nr 2/10
- Laboratorium systemów operacyjnych ćwiczenie nr 3. Pełne informacje o wszystkich procesach uzyskamy łącząc opcję -f z -e (ang. every process). Poniżej podano inne przydatne przełączniki polecenia ps: a (ang. all) wyświetla listę wszystkich procesów (także tych należących do innych użytkowników) -l (ang. long) pozwala wyświetlić dodatkowe informacje o każdym procesie -x (ang. long) dołącza do listy informacje o procesach nie dołączonych do terminali (procesy demony) -u powoduje dodanie nazwy użytkownika na początku listy -w powoduje rozszerzenie wyświetlanej listy. Użycie przełącznika -l pozwala na wyświetlenie większej liczby szczegółów dotyczących procesów. W rezultacie wyświetlane są dodatkowe kolumny zawierające następujące informacje: S status procesu ( S proces jest uśpiony; R proces jest aktualnie wykonywany) UID identyfikator właściciela procesu PPID identyfikator procesu macierzystego PRI i NI opisują priorytety procesów WCHAN pozwala sprawdzić jaką funkcję systemową jądra wywołał proces Wiele z procesów uruchamianych jest przy starcie systemu, pozostałe są uaktywniane przez użytkowników w momencie zlecenia wywołania programów. Dowolny proces może uruchomić kolejny proces potomny i stać się macierzystym (nadrzędnym) wobec tego procesu potomnego. W momencie zarejestrowania się użytkownika w systemie uruchomiony zostaje jego pierwszy proces, czyli powłoka interpretująca polecenia użytkownika. Wszystkie procesy pracujące w systemie tworzą hierarchiczną strukturę, na szczycie której stoi proces init, będący rodzicem wszystkich procesów. Proces init ma zawsze wartość PID równą 1. Hierarchię procesów można obserwować korzystając z programu pstree. Istnieje także interaktywna wersja komendy ps program top. Top oprócz wartości zwracanych przez polecenie ps wyświetla też inne informacje: aktualną liczbę użytkowników w systemie (linia pierwsza), liczbę procesów (linia druga), obciążenie procesora (linia trzecia) i informację nt. dostępnej pamięci w systemie (linie czwarta i piąta). Usuwanie procesó w Dowolny proces może zostać usunięty z systemu przez jego właściciela. Służy do tego polecenie kill, wysyłające do procesu o podanym identyfikatorze sygnał przerwania pracy: kill [ -nazwa_lub_numer_sygnału ] identyfikator_procesu str. nr 3/10
Domyślnie, jeśli nie podano numeru sygnału, wysłany zostanie sygnał TERM, powodujący zatrzymanie procesu. Aktualnie uruchomiony proces można również przerwać naciskając kombinację Ctrl-C, co również powoduje wysłanie sygnału TERM. Gdy wysłanie sygnału TERM jest niewystarczające do zatrzymania procesu, należy wtedy wysłać sygnał KILL, który powoduje bezwarunkowe przerwanie procesu. kill -KILL identyfikator_procesu Sygnały mają przypisane numeryczne identyfikatory. Identyfikator sygnału TERM wynosi 2, natomiast sygnału KILL jest równy 9. W poleceniu kill można korzystać także z wartości numerycznych synałów: kill -9 identyfikator_procesu Zatrzymanie wszystkich Przykładowo: procesów o danej nazwie powoduje polecenie killall. killall find powoduje zatrzymanie wszystkich programów find. Szczegółową listę sygnałów wraz z ich wartościami pomocy systemowej signal(7). numerycznymi zawiera strona Priorytety procesów Każdy proces wykonywany w systemie posiada przypisany mu priorytet, który można odczytać w wyniku wywołania polecenia ps z przełącznikiem -l. Kolumna PRI wyświetlana w wyniku tego polecenia zawiera informacje o wartości priorytetu określonego procesu, nadanej mu poprzez system operacyjny. Wartość ta nie może być bezpośrednio zmieniana przez użytkownika. Jednakże użytkownik może wpłynąć na wartość PRI, zmieniając tzw. liczbę nice, której aktualna wartość znajduje się w kolumnie NI. Wartość liczby nice należy do przedziału: od -20 do 19 i początkowo przyjmuje wartość 0. Im mniejsza wartość liczby nice tym wyższy priorytet procesu. Dla działającego procesu liczbę nice można zmienić poleceniem: renice zmiana_priorytetu [ -p ] pid [ -u użytkownik ] Na przykład: renice +10 3442 zwiększa liczbe nice o 10, co powoduje zmniejszenie priorytetu tego zadania. Zwykli użytkownicy mogą jedynie zwiększać liczbę nice, czyli obniżać priorytet wykonania swoich zadań, natomiast użytkownik root jest uprawniony do wykonywania wszelkich zmian na wartości nice. Możliwe jest uruchamianie nowych procesów z ustawionym już nowym priorytetem: nice -n zmiana_priorytetu polecenie str. nr 4/10
Laboratorium systemów operacyjnych ćwiczenie nr 3. Zarządzanie procesami Procesy uruchamiane z klawiatury terminala są nazywane pierwszoplanowymi. Powłoka czeka na zakończenie wykonywania procesu i dopiero wtedy jest gotowa na przyjęcie kolejnych poleceń od użytkownika. Proces można jednak uruchomić w tle. Wówczas powłoka utworzy nowy proces potomny, będący powłoką, której nakaże wykonanie zadanego polecenia, a sama powróci do stanu gotowości na kolejne polecenia. W rezultacie proces, który został uruchomiany w tle zaczyna pracować równolegle z interpreterem poleceń. Warto zaznaczyć, że praca w tle ma sens jedynie w przypadku programów nieinteraktywnych, czyli takich, które do swojej pracy nie potrzebują interakcji za strony użytkownika. W przypadku uruchamiania programu w tle interpreter poleceń natychmiast przechodzi w stan oczekiwania na następne zlecenie, czyli rozpoczyna czytanie danych z klawiatury. Podobnie, programy działające w tle nie powinny wypisywać informacji na ekranie, bo będą one wypisywane asynchronicznie w stosunku do aktualnie wykonywanych operacji. W tym przypadku, rozwiązaniem tego problemu może być przekierowanie wyników działania takiego programu do pliku i jego późniejsza analiza. Polecenie jest uruchomione w tle, jeśli po ostatnim parametrze następuje znak &: polecenie & Aktualnie uruchomiony proces można także zatrzymać wciskając kombinację Ctrl Z. Spowoduje to wstrzymanie tego procesu. Wstrzymany proces istnieje w systemie, ale nie jest dla niego przydzielany procesor. Zastopowany proces można wprowadzić do wykonania (kontynuacji) w tle poleceniem bg (ang. background), a nawet przywrócić po dowolnym czasie z powrotem na pierwszy plan poleceniem fg (ang. foreground), pod warunkiem jednak, że pomiędzy tymi poleceniami nie uruchomimy w tle innego procesu. Listę aktualnie kontrolowanych zadań można wyświetlić poleceniem jobs. Jeśli wstrzymano więcej niż jedno zadanie, niezbędna będzie ich identyfikacja. Interpreter poleceń wewnętrznie przydziela swoje identyfikatory i za pomocą polecenia jobs można wyświetlić ich wartości. Do konkretnego procesu można odwołując się korzystając z identyfikatora poprzedzonego znakiem %. %jobs [1]- [2]+ %fg 1 Stopped Stopped vim praca.html find /usr -name signal.h Status zakończenia procesu Każdy proces w systemie Unix po zakończeniu swojej pracy przekazuje do systemu informację o tym jak zakończyło się przetwarzanie, określaną statusem zakończenia procesu. Status zakończenia jest liczbą jednobajtową, przy czym przyjęto, że wartość 0 oznacza poprawne zakończenie przetwarzania. Wartości różne od 0 oznaczają błąd. Status zakończenia ostatnio wykonywanego programu można uzyskać w następujący sposób: %echo $? str. nr 5/10
Status zakończenia procesu można wykorzystać do warunkowego uruchomiania poleceń. Fakt, że polecenie_2 można wykonać tylko gdy polecenie_1 zakończyło się sukcesem zapisujemy następująco: %polecenie_1 && polecenie_2 Laboratorium systemów operacyjnych ćwiczenie nr 3. Natomiast gdy polecenie_2 może być wykonane polecenie_1 zakończyło się niepowodzeniem: tylko wtedy gdy polecenie %polecenie_1 polecenie_2 Ponadto w systemie UNIX możemy jednym poleceniem oddzielając poszczególne z nich średnikiem: %polecenie_1; polecenie_2; polecenie_3 uruchomić kilka procesów, Taką sekwencję można również wprowadzić w tło: %(polecenie_1; polecenie_2; polecenie_3) & Zmienne. W systemie Linux mozna tworzyc zmienne, które pózniej moga byc wykorzystane w poleceniach lub skryptach. Ustanowienie wartosci zmiennej uzyskuje sie przez proste przypisanie: ZMIENNA= Na przyklad tekst aby odwolac sie do zmiennej nalezy jej nazwe poprzedzic znakiem $. Na przyklad echo $ZMIENNA Przyjelo sie, ze nazwy zmiennych pisane sa duzymi literami. Zmiennych mozna uzywac w linii polecen jako parametry, opcje. Wtedy zamiast zmiennej zostanie podstawiona jej wartosc. Wydajac polecenie: unset ZMIENNA wyzerujemy jej wartosc. Natomiast readonly ZMIENNA spowoduje, ze wartosc zmiennej bedzie tylko do odczytu i nie bedzie mozna jej zmienic. str. nr 6/6
Uruchamianie programów. Do uruchomienia pliku znajdujacego sie w dowolnej lokalizacji okreslonej w zmiennej srodowiskowej PATH wystarczy podanie jego nazwy. Jesli chcemy uruchomic jakis program lub polecenie, a nie ma do niego ustalonej sciezki w zmiennej srodowiskowej PATH to nalezy podac cala sciezke dostepu do pliku. Nawet jesli znajdujemy sie w katalogu, w którym znajduje sie program, który chcielibysmy uruchomic nalezy przed nazwa podac symbol sciezki biezacej, czyli:./program W jednej linii komend mozna wydac kilka polecen od razu. Nalezy je wtedy rozdzielic od siebie srednikiem. Na przyklad: ls *s2* ; mkdir dokum ; cp /home/kat1/*./ ; rm -f /home/kat/* Standardowe wyjscie i wejscie. Z kazdym poleceniem systemu Linux jest zwiazane standardowe wyjscie (stdout), standardowe wejscie (stdin) oraz standardowe wyjscie bledu (stderr). Standardowe wejscie to zródlo pobierania danych, wyjscie to miejsce wyswietlania wyników, wyjscie bledu - miejsce wyswietlania komunikatów o wykonaniu polecenia. Standardowe wyjscie/wejscie moze byc zmienione za pomoca pewnych symboli: Oto skierowanie standardowego wyjscia do pliku w dwóch równowaznych postaciach: polecenie >plik polecenie 1>plik - alternatywna postac z jawnym podaniem deskryptora Skierowanie standardowego wyjscia na koniec pliku (dopisanie): polecenie >>plik Skierowanie komunikatów o bledach do pliku: polecenie 2>plik Skierowanie komunikatów o bledach na standardowe wyjscie: polecenie 2>&1 polecenie 2>/dev/stdout Powiazanie standardowego wejscia z plikiem (pobranie danych z pliku): polecenie polecenie <plik polecenie 0<plik - alternatywna postac z jawnym podaniem deskryptora, polecenie /dev/stdin<plik - alternatywna postac z wyspecyfikowaniem pliku Zauwaz, ze kolejnosc przekierowan jest znaczaca. Na przyklad ls > plik 2>&1 skieruje zarówno standardowe wyjscie jak i wyjscie bledu do pliku plik, zas str. nr 7/10
ls 2>&1 > plik skieruje tylko standardowe wyjscie do pliku plik, poniewaz wyjscie bledu jest zduplikowane jako standardowe wyjscie przed przekierowaniem do pliku. Bash w sposób specjalny traktuje niektóre pliki: /dev/stdin - duplikuje deskryptor pliku 0 /dev/stdout - duplikuje deskryptor pliku 1 /dev/stderr - duplikuje jest deskryptor pliku 2 /dev/fd/fd - oznacza deskryptor pliku fd, gdzie fd jest poprawna liczba calkowita /dev/tcp/host/port - bash otwiera polaczenie TCP do odpowiedniego gniazda, gdzie host jest poprawna nazwa hosta lub adresem internetowym, a port jest liczba calkowita okreslajaca numer portu /dev/udp/host/port- jak wyzej, tylko ze otwiera polaczenie UDP. Dzieki mozliwosci przenoszenia standardowego wyjscia i wejscia mozliwe jest przetwarzanie potokowe. Wyniki dzialania jednego polecenia moga byc zródlem danych dla kolejnego. Na przyklad: ls less spowoduje wyswietlenie listy plików w programie less. Przetwarzanie potokowe mozna wykorzystac w programach, które nie potrzebuja pliku jako swojego parametru Prawa dostepu do pliku. Do zmiany praw dostepu do pliku sluzy polecenie chmod. Jego format to: chmod [ugo][+-][xwr] plik Jako parametry uzywane sa litery (grupy parametrów można powtórzyć, oddzielając je przecinkiem): u - wlasciciel pliku g - grupa o - inni x - prawo do wykonywania w - prawo do zapisu r - prawo do odczytu + - nadaje uprawnienia - - zdejmuje uprawnienia Na przyklad: chmod ug+xr-w,o+r plik2 spowoduje nadanie wlascicielowi pliku oraz grupie prawo do wykonania oraz odczytu pliku. Zdejmie natomiast dla nich prawo do zapisu dla właściciela i doda prawo odczytu dla innych. Uprawnienia mozna tez nadawac podajac odpowiednia liczbe ósemkowo. Na przyklad chmod 777 plik2 str. nr 8/10
Spowoduje nadanie pelnych uprawnien dla wszystkich. kazda cyfra okresla jedna grupe uprawnien rwx kolejno dla wlasciciela, grupy i innych. Kazda z liter ma nastepujaca wage: r - 4 w - 2 x - 1 rwx = 4+2+1=7 Uprawnienia rwxr-x--- beda przedstawione w postaci liczbowej jako 750 Cwiczenia. 1. Przeczytaj pomoc man dla wszystkich polecen wykorzystanych w cwiczeniu. 2. Wyswietl plik /etc/fstab. 3. Wyswietl wszystkie procesy obecne w systemie (polecenie ps). Jakie parametry sa potrzebne do takiego wyswietlenia. 4. Utwórz w katalogu domowym pliki o nazwie informacja, wprowadz do niego swoja nazwe uzytkownika. Ustaw prawa do odczytu i zapisu tylko dla wlasciciela pliku. Spróbuj odczytac pliki informacja z katalogów domowych innych uzytkowników. Jaki skutek? 5. Ustaw prawo do odczytu i zapisu pliku informacja dla wszystkich za pomoca zapisu ósemkowego. 6. Utwórz pliki o nazwach studia, informatyka, linux. Dla pierwszego pliku ustaw prawa na rwxr-xr-- dla drugiego na rw-rw-rw dla trzeciego r--r-----. Wykonaj to za pomoca polecenia chmod i parametrów tekstowych. 7. Utwórz pliki o nazwach uniwersytet, lublin. Dla pierwszego pliku ustaw prawa na rw-rw-r-- dla drugiego na rw-r--r--. Wykonaj to za pomoca polecenia chmod i parametru w postaci liczby ósemkowej. 8. Utwórz katalog o nazwie cwiczenie3, przenies do niego pliki z powyzszych dwóch punktów. Zmien prawa dostepu dla katalogu na rw------- Czy jestes w stanie przejrzec zawartosc katalogu? 9. Dodaj uprawnienia do wykonywania dla katalogu cwiczenie3. Jednak przy poleceniu chmod omin opcje dotyczace uzytkowników. Jaki efekt? 10. Postaraj sie zmienic uprawnienia dla wszystkich plików w katalogu cwiczenie3 jednoczesnie. Czy udalo sie to zrobic? 11. Wykonaj polecenie man man >stud Jaki dalo efekt? Wyświetl zawartość pliku stud 12. Spróbuj zmienic wlasciciela katalogu /sbin na student. Jaki efekt? Jesli byl jakis komunikat o bledzie wyprowadz go do pliku err 13. Utwórz plik o nazwie wlasciciel w swoim katalogu. Zmien wlasciciela na root. Czy operacje zmiany wlasciciela moze wykonywac kazdy uzytkownik? 14. Wyswietl pierwsze 7 linii pliku /etc/services 15. Wyswietl ostatnie 15 linii pliku /etc/services 16. Pokaz wszystkie linie zawierajace tekst http w pliku /etc/services 17. Sprawdz przy pomocy ps i grep (przetwarzanie potokowe) czy w uruchomionych procesach w systemie sa procesy o nazwie bash. 18. Uzyj polecenia ps -ax i postaraj sie zakonczyc proces o numerze 100. 19. Uruchom w tle program top. Zakoncz go uzywajac polecenia kill. str. nr 9/10
20. Uruchom w tle program top. Przenies go na pierwszy plan za pomoca fg. Wyjscie z programu top po wcisnieciu klawisza q. 21. Wyswietl plik /etc/passwd uzywajac polecen cat, more, less 22. Zapisz do pliku zawartosc katalogu /usr/doc. Do tego samego pliku dolacz zawartosc katalogu /usr/local. Zobacz plik z wynikami. 23. Sprawdz zawartosc zmiennej TERM za pomoca echo oraz set i grep. Jakie sa róznice w wynikach? 24. Wyswietl kalendarz na rok 2015 i pokaz wszystkie linie zawierajace wyrazy Su, December, January. 25. Stwórz zmienna o dowolnej nazwie oraz wartosci. Wyswietl jej wartosc i wyprowadz ja do pliku. 26. Czy wsród zmiennych srodowiskowych istnieja zmienne USER, UID, DIR, HOSTNAME, PWD. Jesli tak wyprowadz ich wartosc oraz nazwy do pliku (polecenia set i grep). 27. Wyswietl komunikat Test dzialania polecenia echo 28. Sprawdz dzialanie polecenia top. Jaki proces zuzywa najwiecej czasu procesora? 29. Za pomoca man znajdz opis polecenia find i wyszukaj wszystkie pliki w katalogu domowym zawierajace litere s. Wyniki przeslij do pliku o nazwie lista 30. Utwórz plik o dowolnej nazwie i nadaj mu uprawnienia do wykonywania. Uruchom go. Jaki efekt? 31. Usun wszystkie pliki z katalogu domowego (oprócz ukrytych). Czy udalo sie usunac wszystkie pliki? Jesli nie to zmien odpowiednie uprawnienia i usun. Pytania: 1. Jaka komenda wyswietlic wszystkie procesy dzialajace w systemie. 2. Jak zapisac bledy powstale w wyniku dzialania polecenia? 3. Czy w linii komend moze znajdowac sie tylko jedno polecenie? 4. Jaka komenda mozna sprawdzic który proces najbardziej obciaza procesor. 5. Czy polecenie cat plik1 > plik2 da taki sam efekt jak cp plik1 plik2? 6. Czy polecenie cat $Z wyswietli wartosc zmiennej Z? Dlaczego? 7. Jak wyswietlic plik zawierajacy ilosc tekstu nie mieszczaca sie na jednym ekranie. str. nr 10/ 10