Różnice między wybraną wersją a wersją aktualną.
| Nowa wersja | Poprzednia wersja | ||
|
so:ps_kill [2023/03/20 10:34] jkonczak utworzono |
so:ps_kill [2026/03/24 19:08] (aktualna) jkonczak |
||
|---|---|---|---|
| Linia 1: | Linia 1: | ||
| ===== Spanie, mierzenie i limitowanie czasu ===== | ===== Spanie, mierzenie i limitowanie czasu ===== | ||
| - | Komenda ''sleep //czas//'' śpi podany czas. | + | Komenda ''sleep //czas//'' śpi podany (w sekundach) czas. |
| \\ | \\ | ||
| - | Domyślną jednostką czasu są sekundy (''s''), ale można podać też ''m'', ''h'' i ''d''. | + | <small> |
| + | Duża część implementacji wspiera podawanie czasu z jednostką - ''s'', ''m'', ''h'' i ''d'', | ||
| + | jak również słowo kluczowe ''infinity''. | ||
| \\ | \\ | ||
| - | <small>''sleep 1d'' jest równoważne ''sleep 24h'' i ''sleep 1440m'' i ''sleep 86400[s]''. | + | ''sleep 1d'' jest równoważne ''sleep 24h'' i ''sleep 1440m'' i ''sleep 86400[s]''. |
| + | Interwały można łączyć, np. ''sleep 1m 30s'' poczeka 90 sekund. | ||
| \\ | \\ | ||
| - | Niektóre implementacje sleep rozumieją ułamki dziesiętne, np. ''sleep 0.05m'' będzie spać 3s.</small> | + | Niektóre implementacje ''sleep'' rozumieją ułamki dziesiętne, np. ''sleep 0.05m'' będzie spać 3s.</small> |
| Komenda ''time //polecenie// [//argumenty//]...'' uruchamiana podane polecenie z argumentami i mierzy czas jego wykonania. | Komenda ''time //polecenie// [//argumenty//]...'' uruchamiana podane polecenie z argumentami i mierzy czas jego wykonania. | ||
| + | \\ | ||
| + | Komenda ''time'' jest zwykle wbudowana w powłokę, stąd opisu jej działania należy | ||
| + | szukać w dokumentacji powłoki. | ||
| + | \\ | ||
| + | <small> | ||
| + | Implementacja GNU time (często obecna w dystrybucjach Linuksa jako ''/usr/bin/time'') | ||
| + | dodatkowo podaje zużycie pamięci i ilość operacji I/O. | ||
| + | </small> | ||
| <small> | <small> | ||
| Linia 22: | Linia 33: | ||
| <small> | <small> | ||
| ~~Zadanie.#~~ Zmierz ile czasu trwa wykonanie komendy: | ~~Zadanie.#~~ Zmierz ile czasu trwa wykonanie komendy: | ||
| + | <html><div style="margin-top:-1.2em"></div></html> | ||
| * ''openssl dhparam -text 1536'' | * ''openssl dhparam -text 1536'' | ||
| * ''dd if=/dev/zero of=/dev/null bs=1 count=2M'' | * ''dd if=/dev/zero of=/dev/null bs=1 count=2M'' | ||
| Linia 30: | Linia 42: | ||
| </small> | </small> | ||
| + | ++++Przykład:|{{page>so:ps_kill:sleep&inline}}++++ | ||
| ===== Procesy ===== | ===== Procesy ===== | ||
| Linia 40: | Linia 53: | ||
| Na proces poza sekwencją instrukcji (załadowaną do pamięci operacyjnej) składa | Na proces poza sekwencją instrukcji (załadowaną do pamięci operacyjnej) składa | ||
| - | się wszystko co opisuje stan jego wykonania – np. zawartość rejestrów procesora, | + | się wszystko co opisuje stan jego wykonania – np. zawartość rejestrów procesora (w |
| - | stan pamięci operacyjnej. | + | tym informacja którą instrukcję programu jako kolejną wykona proces), stan pamięci |
| + | operacyjnej (w tym stos wywołań i wartości zmiennych), czy lista otwartych plików | ||
| + | i połączeń sieciowych. | ||
| Uruchamiając ten sam program (tą samą aplikację) wielokrotnie tworzy się wiele | Uruchamiając ten sam program (tą samą aplikację) wielokrotnie tworzy się wiele | ||
| Linia 51: | Linia 66: | ||
| proces <small>(poza pierwszym procesem, o identyfikatorze 1, zwanym | proces <small>(poza pierwszym procesem, o identyfikatorze 1, zwanym | ||
| [[https://en.wikipedia.org/wiki/Init|init]], uruchamianym przez jądro systemu | [[https://en.wikipedia.org/wiki/Init|init]], uruchamianym przez jądro systemu | ||
| - | operacyjnego przy starcie</small>. | + | operacyjnego przy starcie)</small>. |
| Określenie **procesy potomne** procesu //x// (//child processes//) opisuje procesy | Określenie **procesy potomne** procesu //x// (//child processes//) opisuje procesy | ||
| Linia 58: | Linia 73: | ||
| **Rodzic** (//parent process//) procesu //x// to proces który uruchomił //x//. | **Rodzic** (//parent process//) procesu //x// to proces który uruchomił //x//. | ||
| - | Procesy są identyfikowane przez **pid** (//process identifier//). | + | Procesy są identyfikowane przez (numeryczny) **pid** (//process identifier//). |
| \\ | \\ | ||
| Dla każdego procesu utrzymywany jest identyfikator rodzica – **ppid** (//parent pid//). | Dla każdego procesu utrzymywany jest identyfikator rodzica – **ppid** (//parent pid//). | ||
| Linia 64: | Linia 79: | ||
| Kiedy kończy się proces potomny, system operacyjny utrzymuje proces do czasu aż | Kiedy kończy się proces potomny, system operacyjny utrzymuje proces do czasu aż | ||
| jego wartość wyjściowa zostanie zebrana (//reap//) przez rodzica. | jego wartość wyjściowa zostanie zebrana (//reap//) przez rodzica. | ||
| + | <small>Zauważ że np. w C kończysz program przez ''return 0;'' z funkcji ''main'' | ||
| + | lub przez ''exit(0)'' – właśnie to 0 (czy inna wartość) to wartość wyjściowa.</small> | ||
| \\ | \\ | ||
| Proces który się zakończył, ale jego wartość nie została zebrana przez rodzica, | Proces który się zakończył, ale jego wartość nie została zebrana przez rodzica, | ||
| Linia 90: | Linia 107: | ||
| Wybór użytecznych opcji dla ''ps'': | Wybór użytecznych opcji dla ''ps'': | ||
| * ''-e'' wybiera wszystkie procesy w systemie | * ''-e'' wybiera wszystkie procesy w systemie | ||
| - | * ''-l|-f|-F'' wybiera długi, pełny lub ekstra pełny format wyjścia | + | * ''-l'', ''-f'' albo <small>''-F''</small> wybiera długi, pełny lub <small>ekstra pełny</small> format wyjścia |
| - | * ''-L|-T'' pokazuje wątki | + | * ''-L'' albo ''-T'' pokazuje wątki |
| * <small>''-H'' sortuje hierarchicznie i rysuje (wcięciami w polu komenda) dzieci</small> | * <small>''-H'' sortuje hierarchicznie i rysuje (wcięciami w polu komenda) dzieci</small> | ||
| + | <html><div style="margin-top:-1.4em"></div></html> | ||
| + | <small>Opcje ''-F'', ''-L'', ''-T'' oraz ''-H'' nie są w standardzie POSIX (są specyficzne dla Linuksa).</small> | ||
| + | |||
| <small> | <small> | ||
| Linia 109: | Linia 129: | ||
| ~~Zadanie.#~~ Wyświetl listę wszystkich procesów i wątków w systemie. Znajdź na niej dwa wątki tego samego procesu. | ~~Zadanie.#~~ Wyświetl listę wszystkich procesów i wątków w systemie. Znajdź na niej dwa wątki tego samego procesu. | ||
| + | |||
| + | <small> | ||
| + | ~~Zadanie.#~~ Uruchom polecenie | ||
| + | ''%%python3 -c 'import os; print(os.popen("/usr/bin/uname -a").readline(),end=""); os.read(0,1)'%%'' | ||
| + | które "wyprodukuje" proces zombie i zatrzyma się oczekując na wpisanie danych z klawiatury. | ||
| + | W kolejnym terminalu znajdź ten proces zombie na liście procesów. | ||
| + | </small> | ||
| Lista procesów w formie drzewa może być wyświetlona komendą **''pstree''**. | Lista procesów w formie drzewa może być wyświetlona komendą **''pstree''**. | ||
| \\ | \\ | ||
| - | W ''pstree'' przełącznik ''-p'' dodaje pidy, ''-u'' użytkownika, a ''a'' | + | W ''pstree'' przełącznik ''-p'' dodaje pidy, ''-u'' użytkownika, a ''-a'' |
| pokazuje argumenty z jakimi został uruchomiony proces. | pokazuje argumenty z jakimi został uruchomiony proces. | ||
| Linia 119: | Linia 146: | ||
| ~~Zadanie.#~~ Wyświetl drzewo procesów z pidem każdego procesu. | ~~Zadanie.#~~ Wyświetl drzewo procesów z pidem każdego procesu. | ||
| - | Pseudo system plików ''procfs'', zamontowany standardowo w ''/proc'', pozwala | + | ++++Przykłady - listowanie procesów|{{page>so:ps_kill:examples#ps_pstree&inline&noheader}}++++ |
| - | odczytać informacje o procesach przez dostęp do plików. | + | ++++Przykłady - procesy zombie|{{page>so:ps_kill:examples#zombie&inline&noheader}}++++ |
| + | |||
| + | W Linuksie pseudo system plików ''procfs'', zamontowany standardowo w ''/proc'', | ||
| + | pozwala odczytać informacje o procesach przez dostęp do plików. | ||
| Katalog ''/proc/self'' zawiera szczegółowe informacje o procesie który próbuje | Katalog ''/proc/self'' zawiera szczegółowe informacje o procesie który próbuje | ||
| je przeczytać. | je przeczytać. | ||
| \\ | \\ | ||
| - | W ''man 5 proc'' znajdziesz szczegółowe informacje. | + | W ''man 5 proc'' znajdziesz skrótowe informacje o ''procfs'', a w |
| + | [[https://docs.kernel.org/filesystems/proc.html#process-specific-subdirectories|dokumentacji jądra]] | ||
| + | szczegóły. | ||
| ~~Zadanie.#~~ Wyświetl zawartość pliku ''/proc/self/status''. Informacje o jakim procesie zostały wyświetlone? | ~~Zadanie.#~~ Wyświetl zawartość pliku ''/proc/self/status''. Informacje o jakim procesie zostały wyświetlone? | ||
| <small> | <small> | ||
| - | ~~Zadanie.#~~ Doczytaj w podręczniku i sprawdź co jeszcze jest w katalogach ''/proc/****//pid//****/''. | + | ~~Zadanie.#~~ Doczytaj w dokumentacji i sprawdź co jeszcze jest w katalogach ''/proc/****//pid//****/''. |
| Określenie zużycia pamięci przez proces jest trudne.\\ | Określenie zużycia pamięci przez proces jest trudne.\\ | ||
| Linia 150: | Linia 182: | ||
| Ale co z swapem i [[https://en.wikipedia.org/wiki/Zram|kompresją wewnątrz RAMu]]… | Ale co z swapem i [[https://en.wikipedia.org/wiki/Zram|kompresją wewnątrz RAMu]]… | ||
| - | Zużycie pamięci próbuje sensownie pokazać program ''smem''; sprawdź opcje ''-p'' i ''-t''. | + | Zużycie pamięci próbuje sensownie pokazać program ''smem''; sprawdź opcje ''-p'' i ''-t -k''. |
| </small> | </small> | ||
| Linia 184: | Linia 216: | ||
| Poza programem ''htop'', istnieje wiele narzędzi wzorowanych na ''top'' pokazujących | Poza programem ''htop'', istnieje wiele narzędzi wzorowanych na ''top'' pokazujących | ||
| - | stan systemu i procesów. Są to m. in.. ''iotop'' (użycie I/O), ''atop'', ''glances''. | + | stan systemu i procesów. |
| + | \\ | ||
| + | Są to m. in.. ''iotop'' (użycie I/O), ''atop'', ''glances'', ''btm''(''bottom''), ''btop''. | ||
| </small> | </small> | ||
| + | |||
| + | ++++Przykłady|<asciicast so:tops.cast 80>++++ | ||
| === Wyszukiwanie procesów === | === Wyszukiwanie procesów === | ||
| Linia 255: | Linia 291: | ||
| Sygnał można zapisać jako jego numer, np. ''kill -3 //pid//'' lub nazwę, np. ''kill -INT //pid//'' | Sygnał można zapisać jako jego numer, np. ''kill -3 //pid//'' lub nazwę, np. ''kill -INT //pid//'' | ||
| \\ | \\ | ||
| - | <small>Nazwy i numery sygnałów można sprawdzić komendą ''kill -l'' lub ''kill -L''.</small> | + | <small>Nazwy i numery sygnałów można sprawdzić komendą ''kill -l'' (lub, w bashu, ''kill -L'').</small> |
| \\ | \\ | ||
| Komenda ''kill'' przyjmuje tylko pid – numeryczny identyfikator procesu. | Komenda ''kill'' przyjmuje tylko pid – numeryczny identyfikator procesu. | ||
| Linia 279: | Linia 315: | ||
| </small> | </small> | ||
| - | ~~Zadanie.#~~ Uruchom program ''mousepad''. Wyślij do niego sygnał STOP. Sprawdź jak działa mousepad. Potem wyślij do niego sygnał CONT. | + | ~~Zadanie.#~~ Uruchom program ''mousepad'' lub ''glxgears''. Wyślij do niego sygnał STOP. Sprawdź jak działa mousepad. Potem wyślij do niego sygnał CONT. |
| <small> | <small> | ||
| - | ~~Zadanie.#~~ Uruchom w jednym terminalu komendą ''named -g -c <(:)'' serwer DNS. Z drugiego terminalu wyślij sygnał HUP do ''named''a. | + | ~~Zadanie.#~~ Uruchom w jednym terminalu komendą ''/usr/sbin/named -g -c <(:)'' serwer DNS. Z drugiego terminalu wyślij sygnał HUP do ''named''a. |
| </small> | </small> | ||
| + | |||
| + | ++++Przykłady|<asciicast so:pkill.cast 81>++++ | ||
| ==== Kontrola zadań w powłoce ==== | ==== Kontrola zadań w powłoce ==== | ||
| Linia 296: | Linia 334: | ||
| Zwykle skrót **//Ctrl+z//** jest domyślnie skonfigurowany do wysłania sygnału | Zwykle skrót **//Ctrl+z//** jest domyślnie skonfigurowany do wysłania sygnału | ||
| - | STOP do bieżącego procesu. | + | TSTP (który nieobsłużony przez proces działa identycznie jak sygnał STOP) do |
| + | bieżącego procesu. | ||
| Listę zatrzymanych i działających w tle procesów powłoki (tzw. tablicę zadań) | Listę zatrzymanych i działających w tle procesów powłoki (tzw. tablicę zadań) | ||
| Linia 328: | Linia 367: | ||
| ~~Zadanie.#~~ Uruchom w tle ''sleep 1h'' oraz ''sleep 15s''. Poczekaj poleceniem ''wait'' na zakończenie drugiego ''sleep''a. | ~~Zadanie.#~~ Uruchom w tle ''sleep 1h'' oraz ''sleep 15s''. Poczekaj poleceniem ''wait'' na zakończenie drugiego ''sleep''a. | ||
| + | |||
| + | ++++Przykłady|<asciicast so:jobs.cast 80>++++ | ||
| ==== Proces a planiści ==== | ==== Proces a planiści ==== | ||
| Linia 372: | Linia 413: | ||
| </small> | </small> | ||
| + | |||
| + | ++++Przykłady|<asciicast so:niceness.cast 80>++++ | ||
| ~~Zadanie.#~~ Uruchom komendę ''sleep 1h'' z niceness 10. Sprawdź jej nicneness (np. w ''ps'' / ''htop''). | ~~Zadanie.#~~ Uruchom komendę ''sleep 1h'' z niceness 10. Sprawdź jej nicneness (np. w ''ps'' / ''htop''). | ||
| Linia 378: | Linia 421: | ||
| ~~Zadanie.#~~ W dwóch konsolach wykonaj ''taskset -pc 0 $$'' (<small>która zmieni listę dozwolonych procesorów tego shella na pierwszy</small>).\\ | ~~Zadanie.#~~ W dwóch konsolach wykonaj ''taskset -pc 0 $$'' (<small>która zmieni listę dozwolonych procesorów tego shella na pierwszy</small>).\\ | ||
| - | Następnie w obu wykonaj ''openssl dhparam -text %%$((2**14))%% [//dowolny tekst//]'' | + | Następnie w jednym wykonaj ''openssl dhparam 9000'', w drugim ''openssl dhparam 9001'' |
| (<small>co uruchomi procesorożerne szukanie dużych liczb pierwszych</small>).\\ | (<small>co uruchomi procesorożerne szukanie dużych liczb pierwszych</small>).\\ | ||
| W trzeciej konsoli uruchom ''htop'' i obserwuj zużycie CPU. \\ | W trzeciej konsoli uruchom ''htop'' i obserwuj zużycie CPU. \\ | ||
| Linia 418: | Linia 461: | ||
| na procesorach z węzła //x// i pamięci z węzła //y//. | na procesorach z węzła //x// i pamięci z węzła //y//. | ||
| - | </small> | ||
| - | |||
| - | ===== Edycja linii poleceń ===== | ||
| - | |||
| - | Bash (i wiele innych programów) korzysta do odczytywania komend ze standardowego wejścia biblioteki [[https://en.wikipedia.org/wiki/GNU_Readline|readline]]. | ||
| - | \\ | ||
| - | Część programów z przyczyn licencyjnych wybiera do tego samego celu [[https://thrysoee.dk/editline/|libedit]]. | ||
| - | |||
| - | Readline pozwala na wygodną edycję linii poleceń i tworzenie historii poleceń. | ||
| - | |||
| - | Lista sensownych skrótów klawiszowych do edycji linii poleceń jest tutaj: https://readline.kablamo.org/emacs.html | ||
| - | \\ | ||
| - | Pełna lista komend i przypisanych do nich skrótów jest w podręczniku systemowym (''man readline'' i ''man bash''). | ||
| - | \\ | ||
| - | Konwencja zapisu skrótów klawiszowych to: | ||
| - | * ''^//x//'' lub ''C-//x//'' to //Ctrl+x// (uwaga:''^//X//'' lub ''C-//X//'' to //Ctrl+Shift+x//), | ||
| - | * ''M-//x//'' to zwykle //Alt-x// (patrz: https://en.wikipedia.org/wiki/Meta_key), | ||
| - | * ''//a// //b//'' to wciśnięcie po skrócie //a// skrótu //b//. | ||
| - | |||
| - | Bash domyślnie dopisuje historię wykonanych poleceń do pliku ''~/.bash_history'' w momencie wyjścia z powłoki. | ||
| - | \\ | ||
| - | Historię (tą z pliku połączoną z bieżącą) można wyświetlić komendą ''history''. (W ''man bash_builtins'' znajduje się opis przełączników.) | ||
| - | |||
| - | <small> | ||
| - | |||
| - | Do wygodnego przeglądania historii można też użyć programu [[https://dvorka.github.io/hstr/|hstr]] | ||
| + | Komenda ''lstopo'' z paczki ''[[https://www.open-mpi.org/projects/hwloc/|hwloc]]'' | ||
| + | pozwala zwizualizować topologię zasobów maszyny. | ||
| </small> | </small> | ||
| - | |||
| - | ~~Zadanie.#~~ Jakim skrótem czyści się ekran? | ||
| - | |||
| - | ~~Zadanie.#~~ Jakimi skrótami wyszukuje się wstecz w historii? | ||
| - | |||
| - | ~~Zadanie.#~~ Jakim skrótem przesuwa się kursor o jedno słowo? | ||
| - | |||
| - | <small> | ||
| - | |||
| - | ~~Zadanie.#~~ Jakim złożeniem skrótów przesuwa się kursor o 5 słów? | ||
| - | |||
| - | ~~Zadanie.#~~ Jakim skrótów wstawia się ostatnie słowo z poprzedniego polecenia w historii? | ||
| - | |||
| - | ~~Zadanie.#~~ Jakim złożeniem skrótów wstawia się trzecie od końca słowo z poprzedniego polecenia w historii? | ||
| - | |||
| - | ~~Zadanie.#~~ Jakim skrótem zamienia się kolejnością to słowo z poprzednim? | ||
| - | |||
| - | </small> | ||
| - | |||
| - | ===== Edycja plików w konsoli ===== | ||
| - | |||
| - | === vi i vim === | ||
| - | |||
| - | ''vi'' jest często jedynym domyślnie instalowanym edytorem tekstowym. | ||
| - | |||
| - | ''vim'' to ulepszona wersja ''vi''. | ||
| - | |||
| - | Żeby nauczyć się ''vim'', uruchom ''vimtutor''. | ||
| - | |||
| - | |||
| - | <small> | ||
| - | |||
| - | ''vi'' jest wpisane w standard [[https://pubs.opengroup.org/onlinepubs/9699919799/utilities/vi.html|POSIX]]. | ||
| - | \\ | ||
| - | Jest też częścią minimalistycznych zestawów narzędzi takich jak busybox i toybox. | ||
| - | |||
| - | </small> | ||
| - | |||
| - | ~~Zadanie.#~~ Przejdź całą pierwszą lekcję w ''vimtutor''. | ||
| - | |||
| - | <small> | ||
| - | |||
| - | ~~Zadanie.#~~ Przejdź pozostałe lekcje w ''vimtutor''. | ||
| - | |||
| - | === nano === | ||
| - | |||
| - | Nano jest stosunkowo prostym edytorem tekstowym. | ||
| - | |||
| - | Podstawowe skróty są wyświetlone na dole ekranu. | ||
| - | |||
| - | Więcej na: https://www.nano-editor.org/docs.php | ||
| - | |||
| - | === Emacs === | ||
| - | |||
| - | [[https://www.gnu.org/software/emacs/|Emacs]] jest [[https://en.wikipedia.org/wiki/Editor_war|odwiecznym rywalem]] ''vim''a w konkurencji programów do edytowania tekstu w konsoli. | ||
| - | |||
| - | Po wpisaniu ''emacs'' możesz wybrać tutorial skrótem //Ctrl+h t//. | ||
| - | |||
| - | === Inne === | ||
| - | |||
| - | * [[https://joe-editor.sourceforge.io/joe]] | ||
| - | * mcedit – edytor zintegrowany z [[https://en.wikipedia.org/wiki/Midnight_Commander|mc]] | ||
| - | * [[https://micro-editor.github.io/|micro]] | ||
| - | * [[https://neovim.io/|neovim]] | ||
| - | * [[https://helix-editor.com/|hx]] | ||
| - | | ||
| - | </small> | ||
| - | |||
| - | |||
| - | |||