Różnice między wybraną wersją a wersją aktualną.
Both sides previous revision Poprzednia wersja Nowa wersja | Poprzednia wersja | ||
so:users_chmod [2023/03/14 11:22] jkonczak [Uprawnienia dostępu do plików] |
so:users_chmod [2025/03/31 14:28] (aktualna) jkonczak |
||
---|---|---|---|
Linia 1: | Linia 1: | ||
- | ===== Użytkownicy, uprawnienia do plików ===== | + | ===== Użytkownicy i grupy ===== |
- | + | ||
- | ==== Użytkownicy i grupy ==== | + | |
W uniksopodobnych systemach istnieją użytkownicy i grupy. \\ | W uniksopodobnych systemach istnieją użytkownicy i grupy. \\ | ||
Linia 56: | Linia 54: | ||
| | ||
<html></small></html> | <html></small></html> | ||
- | | + | |
- | ==== Użytkownicy w systemie, historia logowania, komunikacja ==== | + | ++++ Przykłady: | {{section>so:users_chmod:examples#id&inline&noheader}} ++++ |
+ | |||
+ | ===== Użytkownicy w systemie, historia logowania, komunikacja ===== | ||
Listę osób bieżąco używających systemu można wyświetlić komendą **''w -n''** oraz ''who''. | Listę osób bieżąco używających systemu można wyświetlić komendą **''w -n''** oraz ''who''. | ||
Linia 91: | Linia 91: | ||
<html></small></html> | <html></small></html> | ||
- | ==== Przełączenie się na innego użytkownika ==== | + | ++++ Przykłady: | {{section>so:users_chmod:examples#who&inline&noheader}} ++++ |
+ | |||
+ | ===== Przełączenie się na innego użytkownika ===== | ||
Posiadając odpowiednie uprawnienia i/lub znając odpowiednie hasło (w zależności od ustawień systemu) można przełączyć się na innego użytkownika bądź wykonać komendę jako inny użytkownik. | Posiadając odpowiednie uprawnienia i/lub znając odpowiednie hasło (w zależności od ustawień systemu) można przełączyć się na innego użytkownika bądź wykonać komendę jako inny użytkownik. | ||
Linia 106: | Linia 108: | ||
<html><small></html> | <html><small></html> | ||
+ | |||
+ | Do zmiany (w bieżącej sesji powłoki) grupy podstawowej można użyć komendy ''newgrp'' lub ''sg''. Komenda ''sg'' może też (podobnie jak ''su'') uruchomić wskazane polecenie ze zmienioną grupą podstawową. \\ | ||
+ | Komenda ''newgrp'' jest [[https://pubs.opengroup.org/onlinepubs/9799919799/utilities/newgrp.html|w standardzie POSIX]], ale część systemów uniksopodobnych jej nie dostarcza. ''sg'' jest specyficzne dla Linuksa. \\ | ||
+ | Po wykonaniu komendy ''newgrp'' / ''sg'' lista grup do których użytkownik należy zostaje bez zmian, więc efektywne prawa dostępu do plików są identyczne niezależnie od bieżącej grupy podstawowej. | ||
+ | Zmiana grupy podstawowej ma wpływ m. inn. na to do jakiej grupy należą nowo tworzone pliki i procesy. | ||
Root może też korzystać z komend ''runuser'' i ''setpriv'' do uruchamiania komend z innym uid/gid/[[https://linux.die.net/man/7/capabilities|uprawnieniami]]. | Root może też korzystać z komend ''runuser'' i ''setpriv'' do uruchamiania komend z innym uid/gid/[[https://linux.die.net/man/7/capabilities|uprawnieniami]]. | ||
Linia 111: | Linia 118: | ||
<html></small></html> | <html></small></html> | ||
- | ==== Uprawnienia dostępu do plików ==== | + | ++++ Przykłady: | {{section>so:users_chmod:examples#su&inline&noheader}} ++++ |
- | === Rodzaje i zapis uprawnień === | + | ===== Uprawnienia dostępu do plików ===== |
+ | |||
+ | ==== Rodzaje i zapis uprawnień ==== | ||
W uniksopodobnych systemach dostęp do pliku określają trzy podstawowe uprawnienia: odczytu (__**r**__ead), zapisu (__**w**__rite) i wykonania (e__**x**__ecute). | W uniksopodobnych systemach dostęp do pliku określają trzy podstawowe uprawnienia: odczytu (__**r**__ead), zapisu (__**w**__rite) i wykonania (e__**x**__ecute). | ||
Linia 120: | Linia 129: | ||
\\ | \\ | ||
Dodatkowo można ustawić trzy uprawnienia specjalne: set-user-id (suid, __**s**__), set-group-id (sgid, __**s**__) i sticky (__**t**__). | Dodatkowo można ustawić trzy uprawnienia specjalne: set-user-id (suid, __**s**__), set-group-id (sgid, __**s**__) i sticky (__**t**__). | ||
+ | |||
+ | Przy dostępie do pliku, jeżeli plik należy do bieżącego użytkownika, brane są pod uwagę tylko uprawnienia użytkownika.\\ | ||
+ | Jeżeli plik nie należy do użytkownika, ale użytkownik należy do grupy pliku, brane są pod uwagę tylko uprawnienia grupy.\\ | ||
+ | Jeżeli plik nie należy do użytkownika i użytkownik nie należy do grupy pliku, brane są pod uwagę tylko uprawnienia pozostałych.\\ | ||
+ | <small>Zauważ że jeśli plik ma ustawione prawo do odczytu dla grupy ale nie ma prawa odczytu dla użytkownika, to właściciel pliku nie może wyświetlić tego pliku nawet jeśli należy do grupy pliku.</small> | ||
Prawo do wykonania dla pliku oznacza możliwość uruchomienia go (jako skrypt, program etc.), dla katalogu – wejścia do niego. | Prawo do wykonania dla pliku oznacza możliwość uruchomienia go (jako skrypt, program etc.), dla katalogu – wejścia do niego. | ||
Linia 181: | Linia 195: | ||
* ''/run/rpcbind.sock'' | * ''/run/rpcbind.sock'' | ||
| | ||
- | === Zmiana uprawnień, grupy i użytkownika pliku === | + | ==== Zmiana uprawnień, grupy i użytkownika pliku ==== |
Domyślnie uprawnienia nadawane plikom i katalogom określa maska którą można odczytać poleceniem ''**umask**'' (i zmienić dla bieżącej powłoki poleceniem ''umask //oktalnie//''). | Domyślnie uprawnienia nadawane plikom i katalogom określa maska którą można odczytać poleceniem ''**umask**'' (i zmienić dla bieżącej powłoki poleceniem ''umask //oktalnie//''). | ||
Linia 192: | Linia 206: | ||
* operacja ''+'', ''-'' lub ''='' (dodaj, usuń lub ustaw te prawa) | * operacja ''+'', ''-'' lub ''='' (dodaj, usuń lub ustaw te prawa) | ||
* uprawnienia ''r'', ''w'', ''x'', ''s'' lub ''t''. | * uprawnienia ''r'', ''w'', ''x'', ''s'' lub ''t''. | ||
- | Przykładowo ''u+x,o='' doda użytkownikowi prawo do zapisu i ustawi brak praw dla innych. | + | Np. ''chmod u+x,o= //plik//'' doda użytkownikowi prawo do zapisu i ustawi brak praw dla innych (a prawa grupy zostaną bez zmian). |
\\ | \\ | ||
<small>Pominięcie litery ''[ugoa]'' przed operacją ma specjalne znaczenie, szczegóły w podręczniku systemowym.</small> | <small>Pominięcie litery ''[ugoa]'' przed operacją ma specjalne znaczenie, szczegóły w podręczniku systemowym.</small> | ||
+ | |||
+ | Uprawnienia dostępu może zmieniać tylko właściciel pliku (i root). | ||
Właściciel pliku będący w kliku grupach może użyć komendy ''**chgrp** //grupa// //plik//'' do zmiany grupy do której należy plik. | Właściciel pliku będący w kliku grupach może użyć komendy ''**chgrp** //grupa// //plik//'' do zmiany grupy do której należy plik. | ||
Linia 230: | Linia 246: | ||
~~Zadanie.#~~ Z roota zmień właściciela wybranego pliku. Następnie zmień grupę innego pliku na ''www-data''. | ~~Zadanie.#~~ Z roota zmień właściciela wybranego pliku. Następnie zmień grupę innego pliku na ''www-data''. | ||
- | ==== Data utworzenia, modyfikacji, dostępu ==== | + | <html><style>.wrap_nomargin{margin:0} .wrap_nomargin p{margin:0}</style></html> |
+ | <WRAP nomargin> | ||
+ | Przykłady: | ||
+ | ++++ umask | {{section>so:users_chmod:examples#umask&inline&noheader}} ++++ | ||
+ | ++++ manipulacja uprawnieniami | {{section>so:users_chmod:examples#chmod&inline&noheader}} ++++ | ||
+ | ++++ user, group czy others | {{section>so:users_chmod:examples#ugo&inline&noheader}} ++++ | ||
+ | ++++ uprawnienia tylko do zapisu, odczytu | {{section>so:users_chmod:examples#write_only&inline&noheader}} ++++ | ||
+ | ++++ tworzenie/usuwanie wpisów w katalogach | {{section>so:users_chmod:examples#dir_create_remove&inline&noheader}} ++++ | ||
+ | </WRAP> | ||
+ | ++++ suid i sgid | {{section>so:users_chmod:examples#suid_sgid&inline&noheader}} ++++ | ||
+ | |||
+ | ===== Data utworzenia, modyfikacji, dostępu ===== | ||
Linuksowe system plików zwykle przechowują datę zmiany metadanych (//change//, ctime), zmiany treści (//modify//, mtime) i ostatniego dostępu (//access//, atime) dla każdego pliku. Niektóre systemy plików dodatkowo przechowują też czas utworzenia pliku. | Linuksowe system plików zwykle przechowują datę zmiany metadanych (//change//, ctime), zmiany treści (//modify//, mtime) i ostatniego dostępu (//access//, atime) dla każdego pliku. Niektóre systemy plików dodatkowo przechowują też czas utworzenia pliku. | ||
Linia 236: | Linia 263: | ||
<small>Montując system plików często wyłącza się rejestrowanie czasu ostatniego dostępu podając opcję ''noatime'' lub ustawia zmianę tego czasu tylko w szczególnych przypadkach podając opcję ''relatime''. Komenda ''mnt'' i ''findmnt'' wyświetlają z jakimi opcjami zamontowano system plików.</small> | <small>Montując system plików często wyłącza się rejestrowanie czasu ostatniego dostępu podając opcję ''noatime'' lub ustawia zmianę tego czasu tylko w szczególnych przypadkach podając opcję ''relatime''. Komenda ''mnt'' i ''findmnt'' wyświetlają z jakimi opcjami zamontowano system plików.</small> | ||
- | Polecenie ''stat //plik//'' pokazuje te czasy. | + | Polecenie ''**stat** //plik//'' pokazuje te czasy. |
- | Komenda ''touch //plik//'' ustawia czas dostępu i modyfikacji pliku, domyślnie na teraz. | + | Komenda ''**touch** //plik//'' ustawia czas dostępu i modyfikacji pliku, domyślnie na teraz. |
\\ | \\ | ||
Podając ''-d //data//'' lub ''--reference=//plik//'' można wybrać inną datę, a ''-a'', ''-c'' i ''-m'' wybierają który czas zmodyfikować. | Podając ''-d //data//'' lub ''--reference=//plik//'' można wybrać inną datę, a ''-a'', ''-c'' i ''-m'' wybierają który czas zmodyfikować. | ||
Linia 255: | Linia 282: | ||
<html></small></html> | <html></small></html> | ||
- | ===== Edycja linii poleceń ===== | + | ++++ Przykłady: | {{section>so:users_chmod:examples#touch&inline&noheader}} ++++ |
- | + | ||
- | 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.) | + | |
- | + | ||
- | <html><small></html> | + | |
- | + | ||
- | Do wygodnego przeglądania historii można też użyć programu [[https://dvorka.github.io/hstr/|hstr]] | + | |
- | + | ||
- | <html></small></html> | + | |
- | + | ||
- | ~~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? | + | |
- | + | ||
- | <html><small></html> | + | |
- | + | ||
- | ~~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? | + | |
- | + | ||
- | <html></small></html> | + | |
- | + | ||
- | ===== 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''. | + | |
- | + | ||
- | + | ||
- | <html><small></html> | + | |
- | + | ||
- | ''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. | + | |
- | + | ||
- | <html></small></html> | + | |
- | + | ||
- | ~~Zadanie.#~~ Przejdź całą pierwszą lekcję w ''vimtutor''. | + | |
- | + | ||
- | <html><small></html> | + | |
- | + | ||
- | ~~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]] | + | |
- | + | ||
- | <html></small></html> | + | |
- | + | ||
- | + | ||
- | ===== Spanie, mierzenie i limitowanie czasu ===== | + | |
- | + | ||
- | Komenda ''sleep //czas//'' śpi podany czas. | + | |
- | \\ | + | |
- | Domyślną jednostką czasu są sekundy (''s''), ale można podać też ''m'', ''h'' i ''d''. | + | |
- | \\ | + | |
- | <small>''sleep 1d'' jest równoważne ''sleep 24h'' i ''sleep 1440m'' i ''sleep 86400[s]''. | + | |
- | \\ | + | |
- | 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. | + | |
- | + | ||
- | <small> | + | |
- | Komenda ''timeout //czas// //polecenie// [//argumenty//]...'' uruchamiana podane | + | |
- | polecenie i przerywa je po upłynięciu wskazanego czasu. | + | |
- | </small> | + | |
- | + | ||
- | ~~Zadanie.#~~ Wykonaj komendę która śpi przez 2 sekundy. | + | |
- | + | ||
- | ~~Zadanie.#~~ Zmierz ile czasu trwa wykonanie komendy z poprzedniego zadania. | + | |
- | + | ||
- | + | ||
- | <small> | + | |
- | ~~Zadanie.#~~ Zmierz ile czasu trwa wykonanie komendy ''openssl dhparam -text 1536''. | + | |
- | + | ||
- | ~~Zadanie.#~~ Wykonaj komendę ''openssl dhparam -text 2048'' z limitem czasu 5s. | + | |
- | </small> | + | |
- | + | ||
- | + | ||
- | ===== Procesy ===== | + | |
- | + | ||
- | ==== Proces a program ==== | + | |
- | + | ||
- | Program jest sekwencją instrukcji((zwykle uzupełnionym o opis tego, w jakim | + | |
- | środowisku je uruchomić – początkowy stan pamięci włączając stan zmiennych | + | |
- | globalnych i załadowane biblioteki dynamiczne)). | + | |
- | Proces to uruchomienie (instancja) programu. | + | |
- | + | ||
- | 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, | + | |
- | stan pamięci operacyjnej. | + | |
- | + | ||
- | Uruchamiając ten sam program (tą samą aplikację) wielokrotnie tworzy się wiele | + | |
- | procesów. | + | |
- | + | ||
- | === Rodzice, dzieci, zombie… === | + | |
- | + | ||
- | W uniksopodobnych systemach nowy proces może być uruchomiony tylko przez inny | + | |
- | proces <small>(poza pierwszym procesem, o identyfikatorze 1, zwanym | + | |
- | [[https://en.wikipedia.org/wiki/Init|init]], uruchamianym przez jądro systemu | + | |
- | operacyjnego przy starcie</small>. | + | |
- | + | ||
- | Określenie **procesy potomne** procesu //x// (//child processes//) opisuje procesy | + | |
- | uruchomione przez //x//. | + | |
- | \\ | + | |
- | **Rodzic** (//parent process//) procesu //x// to proces który uruchomił //x//. | + | |
- | + | ||
- | Procesy są identyfikowane przez **pid** (//process identifier//). | + | |
- | \\ | + | |
- | Dla każdego procesu utrzymywany jest identyfikator rodzica – **ppid** (//parent pid//). | + | |
- | + | ||
- | Kiedy kończy się proces potomny, system operacyjny utrzymuje proces do czasu aż | + | |
- | jego wartość wyjściowa zostanie zebrana (//reap//) przez rodzica. | + | |
- | \\ | + | |
- | Proces który się zakończył, ale jego wartość nie została zebrana przez rodzica, | + | |
- | nazywany jest [[https://en.wikipedia.org/wiki/Zombie_process|zombie]]. | + | |
- | + | ||
- | <small> | + | |
- | Rodzic procesu dostaje sygnał SIGCHLD kiedy coś się stanie z procesem potomnym, | + | |
- | np. kiedy proces potomny się zakończy. | + | |
- | + | ||
- | Jeśli proces //a// uruchomi //b//, proces //b// uruchomi //c//, to po zakończeniu | + | |
- | //b// proces //c// staje się [[https://en.wikipedia.org/wiki/Orphan_process|sierotą]] | + | |
- | (//orphan process//) i jego rodzicem zostaje proces init. | + | |
- | + | ||
- | <html> <!-- | + | |
- | "Kill process or sacrifice child" znikło już z kernela? | + | |
- | https://github.com/torvalds/linux/commit/5989ad7b5ede38d605c588981f634c08252abfc3#diff-268fe084429e2dda106503d80d590ac28f341bcf5969eaed6c09891eea0ca466L863 | + | |
- | --> </html> | + | |
- | </small> | + | |
- | + | ||
- | ==== Wyświetlanie informacji o procesach ==== | + | |
- | + | ||
- | === Lista procesów === | + | |
- | + | ||
- | Do wyświetlenia listy procesów i wątków w systemie można użyć komendy **''ps''**. | + | |
- | \\ | + | |
- | Wybór użytecznych opcji dla ''ps'': | + | |
- | * ''-e'' wybiera wszystkie procesy w systemie | + | |
- | * ''-l|-f|-F'' wybiera długi, pełny lub ekstra pełny format wyjścia | + | |
- | * ''-L|-T'' pokazuje wątki | + | |
- | * <small>''-H'' sortuje hierarchicznie i rysuje (wcięciami w polu komenda) dzieci</small> | + | |
- | + | ||
- | <small> | + | |
- | Program ''ps'' posiada dwie składnie poleceń – jedną spójną z typową dla systemu | + | |
- | UNIX (powyższa), drugą pochodzącą z systemów BSD. | + | |
- | \\ | + | |
- | Powszechnie spotykane ''ps aux'' to wywołanie ''ps'' z opcjami zapisanymi w | + | |
- | stylu BSD pokazujące wszystkie procesy w systemie w konkretnym formacie. | + | |
- | </small> | + | |
- | + | ||
- | ~~Zadanie.#~~ Wyświetl listę procesów poleceniem ''ps'' (bez argumentów). | + | |
- | + | ||
- | ~~Zadanie.#~~ Wyświetl listę procesów poleceniem ''ps'' zmieniając format wyników (kolumny) tak żeby było więcej szczegółów. | + | |
- | + | ||
- | ~~Zadanie.#~~ Wyświetl listę wszystkich procesów w systemie. | + | |
- | + | ||
- | ~~Zadanie.#~~ Wyświetl listę wszystkich procesów i wątków w systemie. Znajdź na niej dwa wątki tego samego procesu. | + | |
- | + | ||
- | 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'' | + | |
- | pokazuje argumenty z jakimi został uruchomiony proces. | + | |
- | + | ||
- | ~~Zadanie.#~~ Wyświetl drzewo procesów. | + | |
- | + | ||
- | ~~Zadanie.#~~ Wyświetl drzewo procesów z pidem każdego procesu. | + | |
- | + | ||
- | 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 | + | |
- | je przeczytać. | + | |
- | \\ | + | |
- | W ''man 5 proc'' znajdziesz szczegółowe informacje. | + | |
- | + | ||
- | ~~Zadanie.#~~ Wyświetl zawartość pliku ''/proc/self/status''. Informacje o jakim procesie zostały wyświetlone? | + | |
- | + | ||
- | <small> | + | |
- | ~~Zadanie.#~~ Doczytaj w podręczniku i sprawdź co jeszcze jest w katalogach ''/proc/****//pid//****/''. | + | |
- | + | ||
- | Określenie zużycia pamięci przez proces jest trudne.\\ | + | |
- | System wie jakie zakresy pamięci są dostępne dla procesu, więc można określić | + | |
- | ile bajtów zajmuje pamięć wirtualna procesu (//virtual set size//). | + | |
- | Ale system operacyjny nie ładuje wszystkiego czego proces zażądał od razu do | + | |
- | pamięci (część danych jest ładowana dopiero przy próbie dostępu do nich). | + | |
- | \\ | + | |
- | System wie za to do czego proces ma w tej chwili dostęp w RAMie | + | |
- | (//resident set size//). | + | |
- | Ale to nie wlicza swapa, a i bez tego jeżeli jakiś plik jest współdzielony przez | + | |
- | wiele procesów (np. biblioteka do rysowania okienek), to suma RSSów nie będzie | + | |
- | równa zajętości pamięci. | + | |
- | \\ | + | |
- | Mając odpowiednie uprawnienia, można w Linuksie określić do jakiej pamięci ma | + | |
- | dostęp tylko ten proces (//unique set size//), a rozmiary współdzielonych plików | + | |
- | można proporcjonalnie doliczyć do tej pamięci dostając w miarę rozsądną metrykę | + | |
- | zajętości pamięci (//proportional set size//). | + | |
- | \\ | + | |
- | 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''. | + | |
- | </small> | + | |
- | + | ||
- | === Monitory procesów === | + | |
- | + | ||
- | Komenda **''top''** jest dostępnym w wielu systemach narzędziem pokazującym na | + | |
- | bieżąco listę procesów i podstawowe informacje o obciążeniu systemu. | + | |
- | + | ||
- | ~~Zadanie.#~~ Uruchom ''top''. Naciśnij ''h'' żeby dostać się do pomocy. | + | |
- | Zmień kolumnę po której są sortowane dane. | + | |
- | + | ||
- | ~~Zadanie.#~~ Co oznaczają stany procesu ''R'', ''S'', ''D'', ''t'' i ''Z''? | + | |
- | Sprawdź w ''man ps''. | + | |
- | + | ||
- | Program **''[[https://htop.dev/|htop]]''** został stworzony jako wygodny i bardziej | + | |
- | funkcjonalny ''top''. | + | |
- | \\ | + | |
- | <small>Podstawowe skróty w htop są w pasku menu na dole; ''h'' pokazuje pomoc, | + | |
- | ''t'' przełącza między trybem drzewa i zwykłą listą, ''<'' i ''>'' sortują | + | |
- | procesy, ''k'' wysyła sygnał do procesu, ''a'' ustawia na których procesorach | + | |
- | może działać program (affinity), ''i'' ustawia priorytet dostępu do dysku, | + | |
- | ''/'' szuka, a ''\'' filtruje po nazwie, ''u'' filtruje po użytkowniku, //space// | + | |
- | zaznacza procesy, //tab// przełącza między użyciem procesora i pamięci | + | |
- | a użyciem dysku. | + | |
- | \\ | + | |
- | ''htop'' pozwala używać myszy do nawigacji i pozwala łatwo konfigurować zarówno | + | |
- | pasek górny jak i wygląd listy procesów.</small> | + | |
- | + | ||
- | ~~Zadanie.#~~ W programie ''htop'' zmień kolumnę sortowania. | + | |
- | + | ||
- | <small> | + | |
- | ~~Zadanie.#~~ W programie ''htop'' ustaw tryb drzewa i znajdź program ''htop'' w liście procesów. | + | |
- | + | ||
- | 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''. | + | |
- | </small> | + | |
- | + | ||
- | === Wyszukiwanie procesów === | + | |
- | + | ||
- | Programy **''pgrep''** <small>i **''pidof''**</small> pozwalają wyszukiwać pid | + | |
- | procesu na podstawie podanych kryteriów. | + | |
- | + | ||
- | Domyślnie ''pgrep //regex//'' dopasowuje //regex// do nazwy programu. \\ | + | |
- | Z ''-f'' szuka po pełnej linii poleceń (nazwa programu z argumentami). \\ | + | |
- | Inne opcje pozwalają wyszukać procesów potomnych podanego procesu czy procesów | + | |
- | wybranego użytkownika. | + | |
- | + | ||
- | <small>Program ''pidof //nazwa//'' wyświetli pidy procesów których nazwa | + | |
- | (przycięta do 15 znaków) jest identyczna z podaną.</small> | + | |
- | + | ||
- | ~~Zadanie.#~~ Uruchom program ''sleep 1h''. W innym terminalu znajdź jego pid. | + | |
- | + | ||
- | <small> | + | |
- | + | ||
- | ~~Zadanie.#~~ W jednym terminalu uruchom program ''sleep 1337h'', w drugim ''sleep 42h''. Znajdź pid tego pierwszego. | + | |
- | + | ||
- | ~~Zadanie.#~~ Znajdź pid procesu ''gdm'' wiedząc, że na twoim komputerze są też inne procesu mające na początku nazwy ciąg liter ''gdm''. | + | |
- | + | ||
- | </small> | + | |
- | + | ||
- | ==== Sygnały ==== | + | |
- | + | ||
- | Sygnały są dla procesów odpowiednikiem przerwań. | + | |
- | \\ | + | |
- | Posiadając odpowiednie uprawnienia można wysłać sygnał do procesu – tzn. zażądać | + | |
- | od systemu operacyjnego, wykonując wywołanie systemowe ''kill'', dostarczenia | + | |
- | sygnału do procesu. | + | |
- | \\ | + | |
- | System operacyjny dodaje każdy wysłany sygnał do listy oczekujących sygnałów | + | |
- | i jeśli tylko może, to dostarcza go. | + | |
- | \\ | + | |
- | Dla większości sygnałów programista może ustawić czy dany sygnał ma być | + | |
- | dostarczany do programu i która (napisana przez programistę) funkcja ma być | + | |
- | wywołana kiedy sygnał zostanie dostarczony. | + | |
- | \\ | + | |
- | Dostarczenie sygnału przez system operacyjny polega, podobnie jak przy wywołaniu | + | |
- | funkcji, na zapisaniu stanu jednego z wątków, przygotowaniu na stosie informacji | + | |
- | o sygnale i ustawienie licznika rozkazów na funkcję którą programista wskazał | + | |
- | do obsługi sygnału. | + | |
- | <small> Sygnał może być dostarczony w dowolnie niewygodnym momencie </small> | + | |
- | + | ||
- | Sygnały rozróżnia się po numerach i odpowiadających im nazwach (''man 7 signal''). | + | |
- | \\ | + | |
- | Często jako skrót "sygnał //X//" zapisuje się jako SIG//X//, np. sygnał TERM to SIGTERM. | + | |
- | \\ | + | |
- | Sygnały są zwykle używane do informowania procesu o błędach, zewnętrznych | + | |
- | zdarzeniach lub do komunikacji między procesami. | + | |
- | + | ||
- | Przykłady sygnałów: | + | |
- | * INT – prośba o przerwanie procesu, generowane np. przez //Ctrl+c//, | + | |
- | * TERM – prośba o zakończenie procesu, | + | |
- | * KILL – żądanie zabicia procesu; jeden z dwóch sygnałów których programista nie może obsłużyć po swojemu, | + | |
- | * STOP – zatrzymanie (zapauzowania) procesu; drugi z sygnałów których programista nie może obsłużyć po swojemu, \\ CONT – kontynuacja zatrzymanego procesu, | + | |
- | * <small>ALRM – proces poprosił o sygnał po upływie jakiegoś czasu i ten czas właśnie minął,</small> | + | |
- | * <small>SEGV – proces próbował dostać się do pamięci niezwiązanej z procesem,</small> | + | |
- | * <small>USR1 – sygnał bez określonego znaczenia, do dowolnego użycia programisty,</small> | + | |
- | * HUP – wysyłany przy zamykaniu (pseudo)terminala – tzn. przy zamknięciu emulatora terminala lub rozłączeniu sesji SSH; <small>wiele programów serwerowych przeładowuje pliki po odebraniu tego sygnału. \\ Uruchamiając dowolną komendę jako ''nohup //komenda// //argumenty//...'' spowoduje zignorowanie tego sygnału przez uruchomiony proces.</small> | + | |
- | + | ||
- | === Wysyłanie sygnałów === | + | |
- | + | ||
- | Do wysłania sygnału służy komenda ''**kill** [-//sygnał//] //pid//''. | + | |
- | Jeśli nie określono który sygnał wysłać, ''kill'' wyśle TERM. | + | |
- | \\ | + | |
- | 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> | + | |
- | \\ | + | |
- | Komenda ''kill'' przyjmuje tylko pid – numeryczny identyfikator procesu. | + | |
- | \\ | + | |
- | <small>Podanie ujemnej wartości pid ma konkretne znaczenie; więcej w ''man kill''</small> | + | |
- | + | ||
- | ~~Zadanie.#~~ W jednym terminalu uruchom ''sleep 1h''. Z innego terminala zabij ten proces używając ''kill''. | + | |
- | + | ||
- | Komenda ''**pkill**'' działa identycznie jak ''pgrep'', tylko zamiast wyświetlać | + | |
- | identyfikatory, wysyła wskazany (identycznie jak w komendzie ''kill'') sygnał do | + | |
- | pasujących procesów. | + | |
- | + | ||
- | <small> | + | |
- | Komenda ''**killall** //nazwa//'' domyślnie wyśle sygnał do wszystkich procesów | + | |
- | których nazwa (przycięta do 15 znaków) jest identyczna z podaną. \\ | + | |
- | Opcjami można m. inn. dopasować się do wyrażeń regularnych i pełnej nazwy. | + | |
- | </small> | + | |
- | + | ||
- | ~~Zadanie.#~~ W jednym terminalu uruchom ''sleep 1h''. Z innego terminala zabij ten proces używając ''pkill''. | + | |
- | + | ||
- | ~~Zadanie.#~~ Uruchom program ''mousepad''. Wyślij do niego sygnał STOP. Sprawdź jak działa mousepad. Potem wyślij do niego sygnał CONT. | + | |
- | + | ||
- | <small> | + | |
- | ~~Zadanie.#~~ Uruchom w jednym terminalu komendą ''named -g -c <(:)'' serwer DNS. Z drugiego terminalu wyślij sygnał HUP do ''named''a. | + | |
- | </small> | + | |
- | + | ||
- | ==== Proces a planiści ==== | + | |
- | + | ||
- | Przydziałem dostępu do zasobów komputera dla programu zajmuje się system | + | |
- | operacyjny. Użytkownik (administrator) może wpływać na to jakie decyzje | + | |
- | podejmują planiści | + | |
- | ([[https://en.wikipedia.org/wiki/Scheduling_(computing)#Process_scheduler|[1]]], | + | |
- | [[https://en.wikipedia.org/wiki/I/O_scheduling|[2]]]). | + | |
- | + | ||
- | === Procesor === | + | |
- | + | ||
- | Procesy w uniksopodobnych systemach mają //[[https://en.wikipedia.org/wiki/Nice_(Unix)|niceness]]//, | + | |
- | które decyduje o priorytecie przydzielania CPU. | + | |
- | \\ | + | |
- | Niceness jest ustawialne w zakresie od -20 (najwyższy priorytet) do 19 (najniższy) i dziedziczone od rodzica. | + | |
- | \\ | + | |
- | Init startuje procesy z niceness 0. | + | |
- | \\ | + | |
- | Podnieść niceness może każdy, obniżyć – tylko root. | + | |
- | + | ||
- | Wykonując komendę ''**nice** [-n <//N//>] //komenda// [//argumenty//]...'' można uruchomić proces z podanym niceness. | + | |
- | + | ||
- | Można też zmienić niceness działającego procesu komendą ''**renice** [-n]<//N//> //pid//''. | + | |
- | + | ||
- | <small> | + | |
- | + | ||
- | Część dystrybucji Linuksa włącza ''autogroup'' które umieszcza automatycznie | + | |
- | procesy w osobnych grupach (więcej w ''man 7 sched''). Niceness liczy się | + | |
- | tylko między procesami wewnątrz grupy. ''sysctl -ar sched_autogroup_enabled'' | + | |
- | sprawdza czy ta funkcjonalność jest włączona. | + | |
- | + | ||
- | Można też wybrać na których fizycznych wątkach procesora będzie się wykonywać | + | |
- | proces programem **''taskset''**. | + | |
- | + | ||
- | Komenda ''taskset 0x03 //komenda// [//argumenty//]...'' i | + | |
- | ''taskset -c 0,1 //komenda// [//argumenty//]...'' uruchomi proces tylko na | + | |
- | rdzeniach 0 i 1. \\ | + | |
- | Komenda ''taskset -p [-c] //pid//'' wyświetli dozwolone fizyczne wątki dla podanego | + | |
- | pid, a ''taskset -p [-c] //spec// //pid//'' je zmieni na //spec//. | + | |
- | + | ||
- | ''htop'' pozwala zmieniać niceness (skróty //F7//''''/''''//F8//) i wybrać procesory | + | |
- | dla procesu (skrót //a// od affinity). | + | |
- | + | ||
- | </small> | + | |
- | + | ||
- | ~~Zadanie.#~~ Uruchom komendę ''sleep 1h'' z niceness 10. Sprawdź jej nicneness (np. w ''ps'' / ''htop''). | + | |
- | + | ||
- | ~~Zadanie.#~~ Uruchom komendę ''sleep 1h'' i potem zmień jej niceness na 15. | + | |
- | + | ||
- | ~~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//]'' | + | |
- | (<small>co uruchomi procesorożerne szukanie dużych liczb pierwszych</small>).\\ | + | |
- | W trzeciej konsoli uruchom ''htop'' i obserwuj zużycie CPU. \\ | + | |
- | Zmieniaj stopniowo niceness jednego z tych procesów. Jak zmienia się użycie CPU przez te procesy? | + | |
- | + | ||
- | <small> | + | |
- | + | ||
- | === I/O === | + | |
- | + | ||
- | Priorytet dostępu do I/O (dysków) można ustawiać / zmieniać komendą **''ionice''**. | + | |
- | \\ | + | |
- | Są dostępne "trzy" klasy: 1 (realtime), 2 (best-effort) i 3 (idle) oraz 0 (brak | + | |
- | klasy). Klasy 1 i 2 dzielą się na 8 priorytetów (od najwyższego 0 do | + | |
- | najniższego 7). | + | |
- | \\ | + | |
- | Argumenty ''[-c //nr_klasy//] [-n //priorytet//]'' wybierają klasę i priorytet. | + | |
- | \\ | + | |
- | Podobnie jak ''taskset'', można uruchomić polecenie z podaną klasą, bądź z | + | |
- | przełącznikiem ''-p'' wyświetlić / zmienić ustawienia dla podanego pid. | + | |
- | + | ||
- | ''htop'' pozwala zmieniać klasy I/O (skrót //i//). | + | |
- | + | ||
- | === NUMA === | + | |
- | + | ||
- | Sprzęt w których zasoby (głównie pamięć) mają różny koszt dostępu z różnych | + | |
- | procesorów ([[https://en.wikipedia.org/wiki/Non-uniform_memory_access|NUMA]]) | + | |
- | jest przez system dzielony na węzły wewnątrz których dostęp ma równy koszt, ale | + | |
- | między którymi koszt dostępu jest większy. | + | |
- | \\ | + | |
- | Przykład – na płycie głównej z dwoma gniazdami na procesory pamięć DRAM podłączona | + | |
- | do procesora na którym działa proces ma niższy koszt dostępu niż pamięć RAM | + | |
- | podłączona do procesora w drugim gnieździe. | + | |
- | + | ||
- | Polecenie **''numactl''** pozwala kontrolować jak mają być uruchamiane procesy | + | |
- | w takich systemach. | + | |
- | \\ | + | |
- | ''numactl -H'' pokazuje listę węzłów, a | + | |
- | ''numactl -N //x// -m //y// //komenda// [//argumenty//]...'' uruchamia komendę | + | |
- | na procesorach z węzła //x// i pamięci z węzła //y//. | + | |
- | + | ||
- | </small> | + | |
- | + | ||
| | ||
~~META: | ~~META: | ||
language = pl | language = pl | ||
~~ | ~~ | ||
- |