Proces – egzemplarz wykonywanego programu. Aplikacja może składać się z większej liczby procesów. Każdy nowo powstały proces otrzymuje unikatowy numer, który go jednoznacznie identyfikuje, tzw. PID (od ang. process identifier).
W celu wykonania programu system operacyjny przydziela procesowi zasoby (pamięć, czas procesora i inne – szczegółowa lista zasobów znajduje się dalej), ale także może być konieczne współbieżne wykonywanie pewnych fragmentów programu. Aby to zrealizować, program może zażądać utworzenia określonej liczby wątków, wykonujących wskazane części programu – o ich współbieżne wykonanie dba system operacyjny (albo sam program, wówczas mówi się o zielonych wątkach). Wątki współdzielą prawie wszystkie zasoby zarezerwowane dla danego procesu, wyjątkiem jest czas procesora, który jest przydzielany indywidualnie każdemu wątkowi.
Za zarządzanie procesami odpowiada jądro systemu operacyjnego, sposób ich obsługi jest różny dla różnych systemów operacyjnych. W systemie operacyjnym każdy proces posiada proces nadrzędny, z kolei każdy proces może, poprzez wywołanie funkcji systemu operacyjnego, utworzyć swoje procesy potomne; w ten sposób tworzy się swego rodzaju drzewo procesów. Każdy proces otrzymuje od systemu operacyjnego odrębne zasoby, w tym odrębną przestrzeń adresową, listę otwartych plików, urządzeń itp.
W systemie Centos proces z PID 1 nazywa się systemd. To on jest rodzicem wszystkich procesów w systemie.
Lista procesów w GNU/Linux
Nadszedł czas, aby zapoznać się z podstawowymi poleceniami do zarządzania procesami.
Na początek pstree. Dzięki niemu zobaczysz zależności pomiędzy procesami, czyli kto jest dzieckiem a kto rodzicem.
Każdy proces może znaleźć się w jednym z 4 stanów.
- Running – proces działa poprawnie.
- Sleeping – proces znajduje się w pamięci RAM, ale nie jest aktywny (nie działa).
- Stopped – proces został zatrzymany przy pomocy Ctrl-Z, może zostać ponownie aktywowany przy pomocy polecenia fg .
- Zombie – proces został uszkodzony i nie będzie działał już poprawnie.
Specjalnym typem procesu jest demon (ang. daemon), jest to proces uruchamiany automatycznie po starcie systemu, np. serwer www.
Dwoma głównymi poleceniami, które możesz wykorzystać do monitorowania procesów są top oraz ps.
Narzędzie top odświeża listę procesów co 5 sekund, dzięki czemu otrzymujesz najświeższe informacje o stanie systemu.
Jak widzisz top jest stosunkowo rozbudowane, poniżej krótki przegląd właściwości w nim dostępnych.
- top – bieżąca godzina,
- up – jak długo działa system,
- user – ilu użytkowników obecnie jest zalogowanych,
- load average – średnie obciążenie z 1, 5 oraz 15m,
- tasks – liczba działających zadań (procesów) w systemie, z podziałem na ich typy (running, sleeping, stopped, zombie),
- %CPU – obciążenie procesora, z dokładnym podziałem na kolejne właściwości: us – obciążenie od użytkownika, sy – obciążenie przez system, ni – procesy, których priorytet został dostosowany za pomocą nice, id – procesy zawieszone w systemie, wa – poziom systemu w trybie oczekiwania, hi – ilość czasu, w której system obsługuje sprzęt (sterowniki), zbyt wysoka wartość oznacza problem ze sterownikami, si – czas w którym system obsługiwał przerwania systemowe, st – ilość czasu procesora, który został przeznaczony na maszyny wirtualne,
- MiB Mem – całkowita wielkość pamięci RAM, obecnie wolna, obecnie używana, cache dla operacji read/write,
- MiB Swap – te same parametry w odniesieniu do swap (pliku wymiany)
Kolejnymi parametrami odnoszącymi się bezpośrednio do procesów są.
- PID – unikalny numer procesu w systemie,
- USER – nazwa użytkownika, który wystartował proces,
- PR – każdy proces posiada swój priorytet, który można zmienić w zależności od potrzeb,
- NI – procesy z tymi samymi priorytetami i tak muszą zostać wykonane w konkretnej kolejności i właśnie NI daje taką możliwość,
- VIRT – wirtualna ilość przydzielonej pamięci do procesu, nie jest ona w żaden sposób powiązana z pamięcią fizyczną. Wszystkie procesy w systemie GNU/Linux mogą przydzielić do 32TB takiej pamięci,
- RES – przydział pamięci (VIRT) z której proces obecnie korzysta,
- SHARE – odnosi się do pamięci współdzielonej. Zazwyczaj są to biblioteki używane przez konkretny proces jak również przez inne procesy,
- S – kolumna podaje status procesu,
- % CPU – ta kolumna pokazuje procent cykli procesora, który był używany przez proces. Jest to również kolumna, która domyślnie sortuje u góry, najbardziej aktywny proces znajduje się na górze listy.
- % MEM – odnosi się do procentu pamięci używanej przez proces.
- TIME – Wskazuje skumulowany czas rzeczywisty, kiedy proces wykorzystywał procesor przez cały okres od jej rozpoczęcia,
- COMMAND – Wskazuje polecenie, które zostało użyte do uruchomienia tego procesu
Drugim przydatnym poleceniem jest ps.
Polecenia ps używa się głównie z dwoma zestawami przełączników.
ps aux – pokazuje wszystkie procesy w systemie (a – pokaże wszystkie procesy, u – pokaże użytkownika lub właściciela procesu, x – pokaże procesy, które nie były wykonane w terminalu )
ps -ef – wynik będzie identyczny jak w przypadku ps aux
Parametr | Opis |
USER | Użytkownik który uruchomił proces |
PID | Unikalny numer procesu (ID) |
%CPU | Użycie CPU dla tego procesu (w procentach) |
%MEM | Użycie fizycznej pamięci przez proces (w procentach) |
VSZ | Użycie pamięci wirtualnej przez proces ( w bajtach) |
RSS | Niewymienna pamięć fizyczna używana przez ten proces (w KiB) |
TTY | Terminal, z którego ten proces jest uruchamiany. Znak zapytania (?) Oznacza, że ten proces nie jest uruchamiany z terminala. |
STAT | Stan procesu |
START | Czas i data rozpoczęcia procesu |
TIME | Całkowity czas procesora używany przez proces |
COMMAND | Nazwa polecenia ze wszystkimi argumentami, które rozpoczęły ten proces |
Poniżej dostępne kody statusu wraz z opisem
D | Proces jądra systemu, który wykonuje I/O |
R | Proces uruchomiony |
S | Proces oczekuje na ponowne uruchomienie |
T | Proces zatrzymany |
t | Proces zatrzymany przez debugger |
w | Stronicowanie (nieważne od jądra 2.6.xx) |
x | Proces w trybie „dead” (nie powinien być widoczny na liście) |
Z | Proces zombie, bez rodzica |
< | Wysoki priorytet procesu |
N | Niski priorytet procesu |
L | Blokada w pamięci dla I/O |
s | Lider sesji |
l | Proces wielowątkowy |
+ | Proces pierwszoplanowy |
Jednak nie musisz przebijać się przez wszystkie strony z wynikiem, aby otrzymać informacje odnośnie procesów konkretnego użytkownika lub grupy.
ps -U root -u root – pokaże wszystkie procesy użytkownika root na podstawie rzeczywistego ID użytkownika, efektywnego ID lub na podstawie nazwy użytkownika.
ps -FG syslog – lista procesów dla konkretnej grupy (-G) z dodatkowymi szczegółami(-F)
ps -eo pid, user, cmd – ps pozwala również filtrować dane, wskaż które kolumny Cię interesują przy pomocy -eo
Zarządzanie procesami w GNU/Linux
Fajnie, ale co gdy coś się „wykrzaczy”? Wtedy trzeba wiedzieć w jaki sposób wycinać procesy, które się po prostu zawiesiły.
Przydadzą się do tego 3 polecenia: kill, pkill, killall. Potrzebne będą również sygnały, które polecenia te wysyłają do procesu.
Nazwa | Wartość | Opis |
SIGHUP | 1 | Wymusza ponowne odczytanie konfiguracji bez faktycznego zatrzymywania procesu. Użyj go, aby zastosować zmiany w plikach konfiguracyjnych. |
SIGKILL | 9 | Kończy proces natychmiast po otrzymaniu sygnału. Ryzykujesz utratę danych z otwartych plików podczas korzystania z tego sygnału. Używaj go tylko wtedy, gdy proces nie zatrzymuje się po wysłaniu sygnału 15. |
SIGTERM | 15 | Prosisz proces, aby się zakończył, jednak często jest to nie wystarczające. |
SIGUSR1 | 30 | Wysyła do procesu określony sygnał zdefiniowany przez użytkownika. Działa tylko wtedy, gdy zostało zdefiniowane w poleceniu. |
Wiesz już jak wyświetlić procesy, jak możesz je zatrzymać, więc teraz wykorzystanie oraz różnice pomiędzy trzema poleceniami o których wcześniej wspomniałem.
kill [-9] 2345 2500 3090 – w taki sposób poprosisz ładnie o zamknięcie procesów (domyślny sygnał 15), jeżeli chcesz zrobić to natychmiast, użyj dodatkowo przełącznika -9 (bez nawiasów).
killall -u root – takie podejście pozwala na wyłączenie wszystkich procesów, które należą do konkretnego użytkownika (w tym przypadku root).
pkill – u root – zamknie wszystkie procesy dla użytkownika root, podobnie jak killall.
pkill -P 2090 – zamknie proces 2090 oraz co ważniejsze wszystkie jego pod procesy (dzieci).
Priorytety procesów
Czy można zmienić ważność procesu? Tak, przy pomocy polecenia (re)nice możesz dowolnie zarządzać priorytetem procesu. Zakres sterowania ważnością procesów, który możesz wykorzystać to przedział -20 do (+)19. Proces -20 jest zupełnie nie ważny, natomiast (+)19 jest najważniejszy. Takie podejście zmniejsza lub zwiększa przydział zasobów dla procesu.
UWAGA
Jeżeli proces już działa warto użyć polecenia renice, jeżeli dopiero ma wystartować bez problemu sprawdzi się polecenie nice.
nice -n 4 top – ważność procesu top zostanie zwiększony o 4.
renice -5 -u root – obniżenie od 5 priorytetu dla procesów użytkownika, w tym przypadku root.
renice -5 1891 – do zmiany priorytetu możesz użyć również PID.
Podsumowanie
Wpis oczywiście nie wyczerpuje tematu, ale mam nadzieję, że informacje w nim zawarte będą dla Ciebie przydatne. Zarządzanie procesami jest istotne w codziennej pracy, także warto się z tym zagadnieniem dobrze zapoznać.
Dziękuję Ci, za poświęcony czas na przeczytanie tego artykułu. Jeśli był on dla Ciebie przydatny, to gorąco zachęcam Cię do zapisania się na mój newsletter, jeżeli jeszcze Cię tam nie ma. Proszę Cię także o “polubienie” mojego bloga na Facebooku oraz kanału na YouTube – pomoże mi to dotrzeć do nowych odbiorców. Raz w tygodniu (niedziela punkt 17.00) otrzymasz powiadomienia o nowych artykułach / projektach zanim staną się publiczne. Możesz również pozostawić całkowicie anonimowy pomysł na wpis/nagranie.
Link do formularza tutaj: https://beitadmin.pl/pomysly
Pozostaw również komentarz lub napisz do mnie wiadomość odpisuję na każdą, jeżeli Masz jakieś pytania:).