Z każdym `programem' uruchomionym w Linuksie związany jest proces (przynajmniej jeden). Aby zobaczyć listę działających procesów możesz w terminalu wpisać polecenie ps
Jak widać poprzednie polecenie nie zwróciło zbyt długiej listy a to dlatego, że samo polecenie ps zwraca listę procesów `związanych' z aktualnym terminalem (uruchomionych z w danym terminalu).
Przeprowadźmy mały test. Uruchom drugi terminal i sprawdź listę uruchomionych procesów poleceniem z p.1. Na drugim terminalu uruchom edytor nano ale w tle
Sprawdź teraz wynik polecenia z punktu 1. na obu terminalach. Czy widzisz różnicę.
Dodając odpowiednią opcję do polecenia ps możesz wyświetlić wszystkie działające procesy skojarzone' z jakimś terminalem.
(uwaga u Ciebie wynik na ekranie może być inny ale proces nano powinien być widoczny)
Pierwsza kolumna w powyższym wyniku to tzw. identyfikator procesu (PID), druga kolumna pokazuje z którym terminalem proces jest `skojarzony' (jak widać nano jest skojarzony z 2. pseudoterminalem pts/1 bo na tym terminalu go uruchomiłem). Opcja -a nie wyświetla procesów nie skojarzonych z żadnym terminalem i nie wyświetla session leader'ów
Zadanie
Sprawdź jak działa opcja -e wyświetlająca wszystkie procesy uruchomione nie koniecznie skojarzone z jakimś terminalem.
Odszukaj w manualu do polecenia ps opcje -a i -e i sprawdź ich opisy.
Jeśli zamiast -a użyjemy a wtedy wynik może być trochę dłuższy
Pojawiły m.in. procesy typu session leader (procesy które w kolumnie STAT mają m.in. literę `s').
Zadanie
- Odszukaj helpie co oznaczają wpisy w kolumnach STAT, TIME i COMMAND. Nie przejmuj się jeśli nie wszystko zrozumiesz. To przychodzi z czasem .
Procesy mogą rodzić inne procesy. Za pomocą opcji f możesz sprawdzić który proces kogo urodził (kolejne zagłębienia określają relację rodzic-dziecko)
Czasami przychodzi taka potrzeba, żeby znaleźć proces który nie jest `skojarzony' z żadnym terminalem i wtedy można na przykład dodać opcję x (zauważ że procesy nie skojarzone z żadnym terminalem w kolumnie TTY mają ?). Przykład
(wszystkie procesy których właścicielem jest użytkownik uruchamiający dane polecenie ps)
(wszystkie procesy)
Zadanie
- Sprawdź jak działa ps z użyciem opcji fx, ax
- Skoro już ustaliliśmy, że między procesami może zachodzić relacja rodzic-dziecko, sprawdź jak się nazywa rodzic wszystkich procesów czyli proces o najniższym numerze PID.
- Znajdź w manualu opcję o polcenia ps i za pomocą niej spróbuj zdefiniować swój własny format wyniku wyświetlających PID procesu, PID rodzica procesu, status procesu i polecenie którym proces został uruchomiony
- Jeśli jest zainstalowany program pstree i sprawdź jak działa.
PID'y procesów mogą posłużyć do wysyłania procesom sygnałów. Można na przykład zatrzymać proces, który się `zawiesił' wysyłając mu sygnał KILL, na przykład możemy zatrzymać nasz proces nano (aczkolwiek nie jest on procesem, który się zawiesił). Sygnały wysyłamy za pomocą polecenia kill (z tym że wysłanie sygnału nie zawsze oznacza `ubijanie' procesu)
Na drugim terminalu uruchom polecenie
Na pierwszy terminal i sprawdź listę aktywnych procesów skojarzonych z dowolnym terminalem. Zwróć uwagę na wartość w kolumnie STAT przy procesie ping.
Wyślij procesowi ping sygnał STOP.
(u Ciebie pewnie PID będzie inny, zanim wyślesz sygnał musisz odnaleźć PID procesu)
Czy polecenie ping wciąż działa w terminalu drugim terminalu? Wśród działających procesów wciąż powinno występować tyle że z innych statusem niż poprzednio. Wysyłając sygnał STOP spowodowałeś że proces jest w `stanie zawieszenia'. Wciąż działa ale nie otrzymuje czasu procesora.
Taki zawieszony proces można zatrzymać wysyłając sygnał KILL lub wznowić jego działanie na przykład wysyłając sygnał CONT. Wyślij sygnał CONT procesowi ping. Powinieneś zauważyć że polecenie znów działa. Wyślij sygnał TERM aby zatrzymać proces.
Uruchom jeszcze raz polecenie ping i wciśnij CTRL+Z (znowu wysłałeś sygnał STOP tyle że nie za pomocą polecenia kill tylko skrótem klawiaturowym). Sprawdź, że proces wciąż jest uruchomiony tyle że jest w stanie zawieszenia. Teraz już powinieneś wiedzieć, że CTRL+Z nie zatrzymuje procesu (możliwe że tak wcześniej myślałeś). Zatrzymaj proces ping.
Uruchom procesy nano i ping localhost i obu wyślij sygnał STOP w dowolny sposób.
Teraz już masz dwa procesy w stanie `zawieszenia'. Listę takich `zawieszonych' procesów dla aktualnej konsoli możesz wyświetlić poleceniem jobs
Każdy z takich procesów możesz wznowić albo wysyłając sygnał CONT albo za pomoca polecenia fg.
Polecenie fg przyjmuje jako parametr numer (NIE PID )`uśpionego' procesu poprzedzony znakiem %. Numer procesu możesz odczytać z pierwszej kolumny wyniku polecenia jobs (u nas nano ma numer 1. a vim numer 2.). Przywróć do działania proces Nano
I zakończ poprawnie działanie edytora za pomocą sekwencji CTRL+X
Sprawdź że teraz polecenie jobs zwróci tylko jeden proces
Ponieważ proces jest tylko jeden więc wystarczy wpisać samo fg aby go przywrócić do działania. Zrób to i zakończ proces za pomocą sekwencji CTRL+C. Sprawdź, że oba procesy się zakończyły.
Przejrzyj manual opisujący listę dostępnych sygnałów
Przejrzyj manual dla poleceń ps, kill, jobs, fg.
Przejrzyj manual dla polecenia top. Polecenie zostanie omówione na zajęciach.
Na zajęciach powiemy tez o procesach zombie.