Narzędzia użytkownika

Narzędzia witryny


so:users_chmod

Różnice

Różnice między wybraną wersją a wersją aktualną.

Odnośnik do tego porównania

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 [2024/03/13 13:59] (aktualna)
jkonczak [Zmiana uprawnień, grupy i użytkownika pliku]
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 57: Linia 55:
 <​html></​small></​html>​ <​html></​small></​html>​
   ​   ​
-==== Użytkownicy w systemie, historia logowania, komunikacja ====+===== 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 89:
 <​html></​small></​html>​ <​html></​small></​html>​
  
-==== Przełączenie się na innego użytkownika ====+===== 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 104:
  
 <​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/​9699919799/​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 114:
 <​html></​small></​html>​ <​html></​small></​html>​
  
-==== Uprawnienia dostępu do plików ====+===== Uprawnienia dostępu do plików ​=====
  
-=== Rodzaje i zapis uprawnień ===+==== 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 123:
 \\ \\
 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 189:
   * ''/​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 200:
   * 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. ''​chown 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 240:
 ~~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 ====+===== 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 246:
 <​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 254: Linia 264:
  
 <​html></​small></​html>​ <​html></​small></​html>​
- 
-===== 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.) 
- 
-<​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>​ 
  
  
Linia 726: Linia 270:
 language = pl language = pl
 ~~ ~~
- 
so/users_chmod.1678789376.txt.gz · ostatnio zmienione: 2023/03/14 11:22 (edycja zewnętrzna)