Narzędzia użytkownika

Narzędzia witryny


materialy:podstawy-administracji:procesy

Zarządzanie procesami

Procesy

ps

Komenda ps służy do wyświetlania informacji o uruchomionych procesach (ang. processes).

ps

Komenda przyjmuje wiele parametrów i argumentów opisanych w dokumentacji. Parametry te pozwalają wyświetlić listę procesów w wybranym lub zdefiniowanym przez użytkownika formacie. Możliwe jest również filtrowanie wyświetlonych procesów aby wyświetlić tylko procesy określonego użytkownika lub posortować wg określonego kryterium.

Lista wszystkich procesów

ps aux
ps -ef

Pierwsza komenda wyświetli listę procesów w tzw. formacie systemów BSD, druga w standardowym formacie. Każda z nich wyświetli wszystkie działające procesy.

Lista procesów konkretnego użytkownika

ps u -U root

wyświetli listę procesów roota.

Lista procesów dla konkretnej komendy

ps u -C screen

wyświetli listę wszystkich uruchomionych procesów komendy screen.

Lista wszystkich procesów posortowana od najbardziej obciążającego procesor

ps aux --sort -pcpu

Minus przed pcpu oznacza kolejność sortowania (malejąco), dla rosnącego sortowania należy użyć +.

Lista wszystkich procesów posortowana po wykorzystaniu pamięci RAM

ps aux --sort -rss

Znaczenie kolumn

Wynik komendy ps oprócz nazwy procesu i jego identyfikatora pokazuje więcej informacji. Znaczenie najpopularniejszych kolumn:

  • USER - właściciel
  • PID – Process ID - unikalny identyfikator procesu (nie ma dwóch procesów o tym samym identyfikatorze w tym samym czasie)
  • %CPU – użycie CPU
  • %MEM – użycie pamięci
  • VSZ – przydzielona pamięć wirtualna w KiB
  • RSZ – przydzielona pamięć fizyczna w kB
  • STAT – status procesu
  • START – czas uruchomienia
  • TIME – użycie procesora wyrażona w czasie
  • COMMAND – nazwa komendy / procesu
  • NI – wartość priorytetu nice

Symbole statusów i ich znaczenie:

  • R – uruchomiony (running)
  • S – śpi, czeka na pracę do wykonania (sleep)
  • T – zatrzymany (stopped, np. CTRL-Z)
  • Z – zombie process (nie działa, ale nie został wyczyszczony przez proces rodzica)

Więcej przykładów użycia ps i opisów można znaleźć w dokumentacji:

man ps

pgrep

Aby znaleźć określony program wśród procesów najczęściej wywoływana jest:

ps aux | grep komenda

Można również alternatywnie użyć programu pgrep, który wykona podobną pracę i domyślnie zwrócić PID wszystkich procesów o których nazwę podamy w argumencie. Przykładowo poniższa komenda wyświetli wszystkie PID uruchomionych procesów ssh wraz z ich pełnymi nazwami:

pgrep -l ssh

top, htop oraz load average

Komenda ps wyświetla informacje statycznie. Aby obserwować listę procesów na bieżąco można wykorzystać funkcjonalność komendy watch, aby na przykład ps był wywoływany automatycznie co 5 sekund:

watch -n 5 ps u -C screen

Istnieją jednak programy wygodniejsze do tego celu, które domyślnie wyświetlają dynamicznie informacje o uruchomionych procesach.

Najpopularniejsze z nich to

top [-i]

oraz

htop

Z obu powyższych programów wychodzi się przy użyciu klawisza q (quit). Każdy z nich posiada wewnętrzną listę komend aby sterować formatem wyświetlanych informacji. Listę możliwych komend możemy obejrzeć w obu programach po naciśnięciu klawisza ?.

Przykładowo, aby w top zmienić kolumnę po której dokonywane jest sortowanie należy użyć klawiszy < oraz >. Aby ograniczyć listę procesów do określonego użytkownika należy nacisnąć klawisz u. htop posiada na dole ekranu menu z przypisanymi klawiszami funkcyjnym. I tak, aby zmienić pole sortowania należy nnaacisnąć klawisz F6, aby wyszukać na liście konkretny proces należy nacisnąć F3.

Komenda top oprócz listy procesów wyświetla:

  • Uptime systemu (czas działania systemu od ostatniego restartu/uruchomienia)
  • Liczbę zalogowanych użytkowników
  • Load average (miara obciążenia systemu - opisana niżej)
  • Statystyki procesów (ile uruchomionych, ile śpi, ile jest zombie)
  • Procentowy udział użycia CPU w rozbiciu na kategorie:
    • us – obsługa procesów użytkownika (user)
    • sy – obsługa procesów systemu (system)
    • ni – obsługa procesów niskiego priorytetu (nice)
    • id – niewykorzystany czas procesora (idle)
    • wa – oczekiwania na I/O (wait)
    • hi – obsługa przerwań sprzętowych (hardware interrupts)
    • si – obsługa przerwań programowych (software interrupts)
  • Mem – wykorzystanie pamięci fizycznej
    • total - wielkość pamięci
    • used - użytej
    • free - wolnej
    • buffers - wykorzystanej jako bufor metadanych (uprawnienia plików, lista plików w katalogu itp.)
    • cache - wykorzystanej jako cache plików z dysku
  • Swap – wykorzystanie pamięci wymiany

free

Komenda free, podobnie do top, wyświetla parametry wykorzystania pamięci RAM przez procesy i przestrzeni wymiany (swap):

free -m #wyświetla wartości w megabajtach
free -g #wyświetla wartości w gigabajtach

pstree

Listę procesów można wyświetlić równiez w postaci drzewa z procesami potomnymi, dzięki czemu widać zależności pomiędzy potomkami a rodzicami:

pstree [-p] | less

load average

Oba programy - top i htop - wyświetlają wartościowe dla analizy obciążenia systemu parametry zwane „load average” w postaci trzech liczb, przykładowo: 1,1 0,5 0,2

Te trzy wartości dają administratorowi informację jak średnio system był obciążony przez ostatnią minutę, 5 minut i 15 minut. Wartość oznacza siłę obciążenia wyrażoną w liczbie corów. Jeśli uruchomiona maszyna oparta jest o jeden procesor dwurdzeniowy to przy podanych wcześniej wartościach system był obciążony:

  • przez ostatnią minutę średnio w 55% (1.1/2)
  • przez ostatnie 5 minut średnio w 25% (0.5/2)
  • przez ostatnie 15 minut średnio w 10% (0.2/2)

Do testowania obciążenia można użyć komendy stress - poniższe obciąży 6 corów systemu przez 90 sekund (można podać wyższą liczbę corów niż jest fizycznie w systemie aby symulować przeciążenie).

stress -c 6 -t 90

Przy przeciążonych systemach load average może pokazać wartość większą niż jest zainstalowanych corów w maszynie. Przykładowo - jeśli system oparty jest o jeden procesor dwurdzeniowy i jest non stop przeciążony przez ostatnią minutę to wartość load average dla tej minuty może być większy niż 2. Jest to informacja dla administratora, że procesory nie są w stanie przetworzyć obliczeniowo wszystkich zadań. Wartość parametru podpowiada administratorowi o ile przeciążony jest system. Jeśli load average pokazuje wartość 3 przy 2 corach systemu to oznacza, że system jest obciążony w 150%. Aby wyeliminować problem należałoby dołożyć do systemu przynajmniej jeden core aby CPU nie było wąskim gardłem działania aplikacji w systemie albo zoptymalizować aplikację.

„Load average” podaje również komenda uptime wyświetlająca przede wszystkim informację jak długo system działa po ostatnim restarcie/włączeniu:

uptime

Więcej informacji o wpływie obciążenia CPU, operacji I/O na dyskach oraz obciążenia interfejsów sieciowych na wartości load average można przeczytać w artykule Understanding Linux Load Average.

Uruchamianie programu w tle oraz pauzowanie

Czasami komendy bardzo długo się wykonują (np. kopiowanie dużych plików w systemie). W tym czasie nie można wywoływać kolejnych komend równolegle w tej samej konsoli. Istnieje możliwość uruchomienia kolejnego terminala, zalogowanie się do kolejnej sesji ssh lub też użycie wygodnego narzędzia screen. Jednak standardowo Linux pozwala użytkownikowi od razu uruchomienie komendy w tle, dzięki czemu może on na jednej konsoli uruchamiać wiele komend równolegle i je później monitorować.

Aby zaraz po wywołaniu komenda pracowała w tle, należy na końcu linii komend wpisać znak ampresand.

komenda &

Przykłady:

ping www.itmz.pl > wynik.ping.log &
find / -type f -perm /u+s > /tmp/suid-files.raport & 

Aby zweryfikować, czy ping działa w tle i dopisuje linie do pliku wynik.ping.log:

tail -f wynik.ping.log

Jeśli program działa w pierwszym planie, jak standardowo każda uruchomiona komenda, można go zatrzymać z możliwością późniejszego wznowienia (pauza) - w trakcie działania programu w konsoli należy nacisnąć kombinację klawiszy CTRL+Z. Ta kombinacja klawiszy nie działa na programy działające w tle.

Listę zatrzymanych komend i tych pracujących w tle można uzyskać po wpisaniu:

jobs

Powyższa komenda wyświetla numer id przypisany do każdego programu (nazwijmy go nr-joba). Nie jest to PID procesu. Służy on jedynie do odwoływania się do zawieszonego lub działającego w tle programu.

jobs może przyjmować następujące przydatne parametry:

  • -l wyświetl dodatkowo PID procesów
  • -s wyświetl tylko procesy zatrzymane (pauza)
  • -r wyświetl tylko procesy działające w tle i nie zatrzymane

Jeśli program został zatrzymamy można wznowić jego pracę. Wznowienie pracy zatrzymanej komendy i wprowadzenie jej od razu w tło (ang. background):

bg %nr-joba

Aby zapauzowana komenda lub ta obecnie działająca w tle zaczęły działać w pierwszym planie (ang. foreground):

fg %nr-joba

Wymuszenie zakończenia zatrzymanej komendy lub tej działającej w tle:

kill %nr-joba

Porady:

  • Z uwagi na to, że CTRL+Z nie działa na procesach z tła, aby zatrzymać (pauza) taki proces trzeba najpierw przerzucić go na pierwszy plan - fg - a następnie zatrzymać wspomnianą kombinacją klawiszy.
  • Podczas działania komendy w tle wysyła ona nadal informacje na stdout i stderr, dlatego uruchamiając komendę w tle warto zapewnić sobie, aby stdout i/lub stderr były odpowiednio przekierowane (np. do pliku).

Praca programu po wylogowaniu

Każda ręcznie wywoływana komenda jest uruchamiana w terminalu. Gdy terminal zostanie zamknięty to automatycznie wszystkie programy w nim uruchomione zostaną zakończone. Aby tego uniknąć należy komendę uruchomić z użyciem nohup. Przykładowo:

nohup ping www.itmz.pl > ping.out.log

Wysyłanie sygnałów do procesów

Każdy uruchomiony proces ma przydzielony swój niepowtarzalny identyfikator (Process ID), którego wartość można sprawdzić przy użyciu komend ps, top lub htop. Możliwość wysyłania sygnałów do procesów jest formą dodatkowego interfejsu do procesu. Sygnały wysyła się do konkretnego procesu, więc najczęściej adresem będzie PID procesu.

Wysyłanie sygnałów do procesów wykonuje się poprzez komendę kill:

kill [-SYGNAŁ] PID

Obsługa sygnałów najczęściej odbywa się po stronie oprogramowania - to znaczy programista powinien odpowiednio obsłużyć działanie programu w przypadku wysłania do niego określonych sygnałów. Najważniejsze SYGNAŁy jakie można wysłać do procesu:

  • SIGINT (-2) – ekwiwalent CTRL-C (najczęściej, choć może się różnić w różnych implementacjach) – żądanie zakończenia działania programu w sposób najbardziej łagodny;
  • SIGTERM (-15) – wysłanie prośby o zakończenie działania, proces powinien zakończyć swoje działanie po jego otrzymaniu (jest to domyślnie wysyłany sygnał przez komendę kill, jeśli nie podamy żadnej nazwy sygnału jako argument komendy);
  • SIGKILL (-9) – zabija proces „bez jego udziału”, najczęściej używany gdy proces nie reaguje na sygnały SIGINT lub SIGTERM;
  • SIGHUP (-1) – hang up – sygnał najczęściej powoduje wymuszenie odczytania ponownie konfiguracji przez demony - serwisy działające w tle.

W nawisach podano numery sygnałów, gdyż można się do nich odwoływać również w tej formie.

Sygnały zakończenia działania procesu

Komenda kill przyjęła taką nazwę, gdyż najczęściej jest używana do „zabijania procesów” gdy nie ma już możliwości wykonania tej operacji z poziomu samego programu.

Aby zakończyć działanie uruchomionego programu najczęściej wystarczy nacisnąć kombinację klawiszy CTRL+C (jest to wysłanie sygnału SIGINT do procesu). Czasami jednak program działa w tle (nie wobec niego zastosować CTRL+C) lub jest uruchomiony w zupełnie innym terminalu do którego nie mamy dostępu (program uruchomiony przez innego użytkownika). W takim przypadku można wysłać do niego sygnał, aby zakończył swoje działanie za pomocą wspomnianej komenedy kill.

kill PID

Przy pomocy komend pkill lub killall istnieje możliwość podania zamiast numer PID nazwy komendy i wysłanie do niej odpowiedniego sygnału (domyślnie SIGINT):

pkill mcedit
killall firefox

Przy używaniu pkill lub killall należy być ostrożnym, gdyż wysyłają one żądanie zakończenia procesu do wszystkich uruchomionych programów w systemie o podanej nazwie. Jeśli administrator wykona powyższe komendy z przykładu, wszystkie włączone edytory mcedit oraz przeglądarki firefox użytkowników zakończą swoje działanie. Znacznie bezpieczniejsze jest używanie komendy kill z numerem PID konkretnego, jednego procesu.

Zamykanie "siłowe" (brute force) procesów

Jeśli program nie odpowiada na żądanie zamknięcia (kombinacja klawiszy CTLR+C) lub wywołanie komend kill lub pkill. Można zmusić program poprzez „siłowe” zakończenie procesu wysyłając sygnał KILL (-9):

kill -9 PID
pkill -9 mcedit

Priorytety procesów

W systemie uruchomionych jest wiele procesów. Aby przypisać określonemu procesowi więcej lub mniej czasu procesora, należy użyć komend nice lub renice. Jako argument podaje się liczbę całkowitą z przedziału < -20, 19 > i oznacza ona priorytet. Im niższy numer priorytetu, tym ważniejszy proces - jest mniej „miły” (ang. nice) dla pozostałych procesów → przydzielane mu jest więcej czasu procesora. Programy są uruchomiane domyślnie z priorytetem 0. Jeśli uruchamiany proces ma być ważniejszy niż te standardowo uruchamiane trzeba użyć ujemnej liczby dla nice.

Przykłady uruchamiania programów ze zmodyfikowanym priorytetem nice:

nice -n -5 ping localhost > ping.log &
nice -n 10 grep -r nameserver /etc/*

Przy powyższych wywołaniach program ping będzie miał wyższy priorytet niż grep i większość programów w systemie. System posiada ważne ograniczenie ustalania priorytetów - tylko root może ustanawiać wartości priorytetów poniżej 0.

Wyświetlanie priorytetu nice dla działających procesów:

ps axl #kolumna NI
top #kolumna NI

Przy pomocy komendy renice można zmienić priorytet działającego już programu

renice ­-n PRIORYTET ­p PID
renice ­-n 7 -­p 8898
renice ­-n 19 `pgrep firefox`

Dla renice system również wprowadza ważne ograniczenie - tylko root może zmniejszyć liczbę NI (priorytet), czyli określić, aby jakiś program był bardziej uprzywilejowany. Jeśli zwykły użytkownik zwiększy wartość NI z 0 na 10 nie będzie mógł powrócić do wartości mniejszej od 10 dla tego samego procesu.

Priorytety procesów mogą być również modyfikowane z użyciem htop.

materialy/podstawy-administracji/procesy.txt · ostatnio zmienione: 2015/01/07 00:45 przez mzalewski

(C) 2017 ITMZ Mariusz Zalewski