Narzędzia użytkownika

Narzędzia witryny


Pasek boczny

so:users_chmod

To jest stara wersja strony!


Użytkownicy, uprawnienia do plików

Użytkownicy i grupy

W uniksopodobnych systemach istnieją użytkownicy i grupy.
Użytkownicy identyfikowani są po numerycznych identyfikatorach uid (user identifier), które są mapowane na nazwy użytkowników.
Podobnie grupy mają identyfikatory numeryczne o nazwie gid (group identifier), które też są mapowane na nazwy grup.

Każdy użytkownik jest w jednej podstawowej grupie (nazywanej jego grupą podstawową, primary group) i może należeć do dowolnie wielu grup (nazywanych jego grupami dodatkowymi, supplementary groups).

Lista dostępnych użytkowników i grup oraz powiązania uid/gid z nazwami zwykle są czytane z plików /etc/passwd i /etc/groups, ale po odpowiedniej konfiguracji może być pobierana też z innych źródeł.
Np. można wykorzystać serwer LDAP, czy kontroler domeny AD za pośrednictwem programu winbindd. Więcej informacji na tutaj.
Hasła lokalnych użytkowników i grup są przechowywane w /etc/shadow i /etc/gshadow

W systemie plików zapisane są uidy i gidy (a nie nazwy użytkowników), stąd np. podłączenie dysku z jednego komputera do drugiego przypisze pliki innym nazwom użytkowników i grup jeżeli mapowania uid/gid na nazwy nie są identyczne na obu systemach.
To dotyczy również kontenerów (sic!).

Dla procesów uniksopodobne systemy przechowują efektywny, zapisany i rzeczywisty uid (analogicznie gid).
Dla zwykłych procesów te identyfikatory są równe, dla procesów które zmieniały użytkownika mogą być różne. Więcej informacji na tutaj.
W tej chwili zakres uid'ów i gid'ów w Linuksie to 0÷(232-2)

Użytkownik o uid równym 0 nazywany jest superużytkownikiem (superuser) i ma zwyczajowo nadaną nazwę root.

Żeby sprawdzić swoją nazwę użytkownika, można skorzystać z komendy whoami.
Do sprawdzenia listy grup służy komenda groups [użytkownik]. Bez argumentów wyświetla grupy bieżącego użytkownika.

Zadanie 1 Przetestuj działanie komendy whoami.

Zadanie 2 Sprawdź listę grup w której jesteś. Sprawdź listę grup w której jest użytkownik student.

Komenda id [użytkownik] wyświetla nazwy i numery użytkownika, jego grupy podstawowej i grup dodatkowych.

Informację o użytkowniku można wyciągnąć poleceniem getent passwd użytkownik, o grupach – getent group grupa.

Zadanie 3 Sprawdź jaki masz uid i gid, zarówno poleceniem id jak i getent.

Zmiana hasła użytkownika jest wykonywana przy pomocy komendy passwd.
Root może przy pomocy passwd user ustawić hasło każdego użytkownika, może też zmienić czas ważności hasła bądź zablokować konto.

Podstawowe komendy administracyjne do zarządzania użytkownikami to:

  • dodawanie nowego użytkownika: useradd [-m] [-g grupa] nazwa
  • dodawanie nowej grupy: groupadd nazwa
  • dodanie użytkownika do grupy: gpasswd -a użytkownik grupa
  • zmiana/usunięcie użytkownika/grupy: usermod / userdel / groupmod / groupdel

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.

Historię logowań można wyświetlić używając polecenia last [-n ile_ostatnich] [username].

Zadanie 4 Zaloguj się po ssh na polluksa. Sprawdź jacy inni użytkownicy są zalogowani.

Zadanie 5 Na polluksie sprawdź jacy trzej użytkownicy logowali się ostatnio.

Zadanie 6 Na polluksie sprawdź kiedy ostatnio logował się użytkownik root.

Zadanie 7 Sprawdź jacy użytkownicy byli zalogowaniu na polluksie w chwili 2023-03-03 13:30

Komendą write użytkownik [terminal] można wysłać tekst do wybranego użytkownika (kończąc wpisany tekst przez EOF, zwykle Ctrl+d).
Spowoduje to wyświetlenie mu podanego testu poprzedzonego komunikatem "message from…" w terminalu.
Otrzymywanie takich wiadomości można zablokować (bądź odblokować) komendą mesg {n|y}.

Można też wysłać wiadomość do wszystkich użytkowników komendą wall.

Zadanie 8 Napisz do sąsiada wiadomość. Zobacz na własnym ekranie wiadomość wysłaną od kogoś.

Istnieje też komenda talk użytkownik pozwalająca na rozmowę między dwoma użytkownikami.

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.

Komenda su [-] [użytkownik] po autoryzacji uruchamia domyślną powłokę dla podanego użytkownika (domyślnie roota).
Komenda su -c komenda [-] [użytkownik] po autoryzacji uruchamia w domyślnej powłoce dla podanego użytkownika (domyślnie roota) podaną komendę.
su jest dostępna w każdym uniksopodobnym systemie. W domyślnych ustawieniach Linuksa komenda su wymaga podania hasła użytkownika docelowego (i w niektórych dystrybucjach przynależności do odpowiedniej grupy, zwykle wheel).

Na wielu dystrybucjach instalowana jest też komenda sudo która ma na celu zezwolenie wybranym użytkownikom na wykonywanie wybranych komend z uprawnieniami wskazanych użytkowników. Do autoryzacji sudo wykorzystuje hasło bieżącego bądź docelowego użytkownika. W niektórych dystrybucjach komenda sudo jest nadużywana do zastąpienia komendy su.

Zadanie 9 Zaloguj się na podany przez prowadzącego serwer przez ssh (prawdopodobnie ssh userN@fe80::1%br0). Zmień użytkownika na root. Zmień użytkownika na innego userN.

Root może też korzystać z komend runuser i setpriv do uruchamiania komend z innym uid/gid/uprawnieniami.

Uprawnienia dostępu do plików

Rodzaje i zapis uprawnień

W uniksopodobnych systemach dostęp do pliku określają trzy podstawowe uprawnienia: odczytu (read), zapisu (write) i wykonania (execute).
Każde z tych uprawnień jest przyznawane osobno właścicielowi pliku (user), grupie pliku (group) i pozostałym użytkownikom (others).
Dodatkowo można ustawić trzy uprawnienia specjalne: set-user-id (suid, s), set-group-id (sgid, s) i sticky (t).

Prawo do wykonania dla pliku oznacza możliwość uruchomienia go (jako skrypt, program etc.), dla katalogu – wejścia do niego.

Suid/sgid nadany zwykłym plikom oznacza, że po uruchomieniu proces będzie działać z efektywnym uid/gid właściciela pliku.
Zauważ że skrypt są interpretowane przez inny program, nie uruchamiane. Nadanie skryptowi suid/sgid nie ma wpływu na jego działanie.
Suid pozwala np. zwykłemu użytkownikowi zmienić hasło (czyli zmienić plik /etc/shadow do którego zwykły użytkownik nie ma dostępu).
Sgid pozwala np. zwykłemu użytkownikowi uruchamiać maszyny wirtualne w VirtualBoxie czy analizować pakiety sieciowe w Wiresharku.

Sticky bit nadany katalogowi D oznacza, że plik X z katalogu D może usunąć tylko właściciel pliku X bądź katalogu D.
Sticky bit ustawiany jest w katalogu /tmp i innych, gdzie każdy użytkownik może tworzyć pliki o to, by tylko właściciel (bądź root) mogli usunąć pliki.

Suid/sgid dla innych plików niż zwykłe i sticky bit dla innych plików niż katalogi nie mają spójnego znaczenia w uniksopodobnych systemach.

Przy montowaniu systemu plików można ustawić opcję nosuid która wyłącza działanie suid/sgid

Uprawnienia są przechowywane jako liczba, gdzie wartości kolejnych bitów oznaczają (od najstarszego bitu): prawa specjalne (w kolejności suid, sgid, sticky), i prawa dla użytkownika, grupy, innych (w kolejności odczyt, zapis, wykonanie).
Numerycznie uprawnienia zapisuje się w systemie ósemkowym, np: 4751 gdzie kolejne cyfry oznaczają uprawnienia specjalne (tutaj: suid), użytkownika (tutaj: wszystkie), grupy (tutaj: odczyt i wykonanie) i innych (tutaj: wykonanie).

Tekstowo uprawnienia zapisuje się jako: rwxrwxrwx, gdzie kolejne trójki to właśnie uprawnienia użytkownika, grupy i innych.
Brak danego uprawnienia zapisuje się przez -.
Zwykle przed tak zapisanymi uprawnieniami pojawia się dodatkowa litera określająca typ pliku.
Uprawnienia specjalne zapisuje się na pozycji uprawnień wykonania: suid i prawo do wykonanie to s, suid i brak prawa do wykonania to S na pozycji użytkownika. Analogicznie prezentowany jest sgid na pozycji grupy, i sticky bit z literami t i T na pozycji pozostałych.
Przykładowo: rw-r--r-- oznacza że użytkownik ma prawo zapisu i odczytu, a grupa i pozostali tylko do odczytu (równoważne 644),
a rwx--x--x pozwalają właścicielowi na odczyt, zapis i wykonanie pliku, a grupie i pozostałym tylko na wykonanie (711).

Aby zobaczyć szczegółowe informacje o pliku, w tym uprawnienia, można wykonać stat plik.
Uprawnienia są też wyświetlane w wynikach ls -l i tree -p.
Wszystkie powyższe polecenia dodają na początek uprawnień literę określającą rodzaj pliku.

Zadanie 10 Sprawdź jakie uprawienia mają (na twoim komputerze):

  • twój katalog domowy
  • podkatalog .ssh w twoim katalogu domowym
  • plik .bash_history w twoim katalogu domowym
  • plik /etc/passwd i /etc/shadow
  • katalog /tmp
  • plik /usr/bin/passwd i /usr/bin/write

Zadanie 11 Sprawdź jakie mają uprawnienia i jakim są rodzajem plików:

  • /var/run
  • /dev/sda lub /dev/nvme0n1
  • /dev/null
  • /run/initctl
  • /run/rpcbind.sock

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).

Do zmiany uprawnień służy komenda chmod uprawnienia plik.
chmod przyjmuje uprawnienia w postaci ósemkowej, np. chmod 644 plik lub w postaci symbolicznej.
Postać symboliczna to oddzielone przecinkami wyrażenia na które składa się:

  • litera u, g, o lub a (user, group, others lub all - wszyscy)
  • operacja +, - lub = (dodaj, usuń lub ustaw te prawa)
  • uprawnienia r, w, x, s lub t.

Przykładowo u+x,o= doda użytkownikowi prawo do zapisu i ustawi brak praw dla innych.
Pominięcie litery [ugoa] przed operacją ma specjalne znaczenie, szczegóły w podręczniku systemowym.

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.

Tylko root może zmienić właściciela (i grupę) pliku poleceniem chown [właściciel][:[grupa]] plik.

Zarówno chmod, chgrp i chown przyjmują przełączniki -R (--recursive) dla rekursywnej zmiany i --reference=plik dla ustawienia uprawnień/grupy/właściciela identycznego jak we wskazanym pliku.

Ćwiczenia wykonuj na podanym przez prowadzącego serwerze.
Do tworzenia plików możesz wykorzystać np. komendę
fortune > plik.

Zadanie 12 Stwórz plik. Ustaw takie prawa dostępu, żeby tylko właściciel mógł odczytać plik.
Sprawdź poprawność nadanych praw przełączając się na innych użytkowników.

Zadanie 13 Stwórz plik. Ustaw korzystając z ósemkowego zapisu takie prawa dostępu, żeby właściciel mógł zmodyfikować i odczytać plik, a grupa mogła tylko odczytać plik. Sprawdź poprawność nadanych praw.

Zadanie 14 Stwórz plik. Ustaw korzystając z symbolicznego zapisu takie prawa dostępu, żeby właściciel mógł zmodyfikować i odczytać plik, a grupa mogła tylko odczytać plik.

Zadanie 15 Zmień grupę pliku z poprzedniego zadania.

Zadanie 16 Stwórz plik. Ustaw takie prawa dostępu, żeby tylko właściciel i pozostali mogli odczytać plik. Sprawdź czy osoba należąca do grupy pliku może go odczytać.

Zadanie 17 Stwórz katalog ze zwykłym plikiem w środku. Odbierz prawo do wykonywania katalogu. Spróbuj wylistować katalog, wejść do katalogu i wyświetlić plik bez wchodzenia do katalogu.

Zadanie 18 Zmień prawa dostępu katalogu na u=rwx,go=rx. Stwórz w tym katalogu zwykły plik. Wyświetl plik jako inny użytkownik. Wyświetl zawartość katalogu jako inny użytkownik.
Następnie zmień prawa do katalogu u=rwx,go=x. Spróbuj ponownie wyświetlić plik i zawartość katalogu jako inny użytkownik.

Zadanie 19 Stwórz katalog z prawami dostępu 777 i stwórz w nim dwa pliki. Jednemu z nich ustaw prawa 600. Z innego użytkownika spróbuj usunąć oba pliki.

Zadanie 20 W katalogu użytkownika A z prawami dostępu 777 stwórz jako użytkownik B dwa katalogi: jeden pusty, jeden z plikiem w środku. Spróbuj usunąć te katalogi jako użytkownik A.

Zadanie 21 Czy możesz zmienić nazwę katalogu K który nie dał się usunąć w poprzednim zadaniu? Czy możesz przenieść katalog K do innego? Czy możesz przenieść katalog zawierający K do innego?

Zadanie 22 Stwórz plik i katalog z plikiem w środku i odbierz wszystkim trzem wszystkie uprawnienia. Zmień użytkownika na root i spróbuj wyświetlić oba pliki.

Zadanie 23 Z roota zmień właściciela wybranego pliku. Następnie zmień grupę innego pliku na www-data.

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.
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.

Polecenie stat plik pokazuje te czasy.

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ć.
Jeśli plik docelowy nie istnieje, domyślnie komenda touch go stworzy. Jest to często używane do tworzenia pustych plików.

Zadanie 24 Sprawdź daty dla pliku /var/log/wtmp

Zadanie 25 Zmień daty do swojego katalogu domowego.

Zadanie 26 Zmień datę zmiany zawartości wybranego pliku na 13:30 PDT Saturday month ago.

Edycja linii poleceń

Bash (i wiele innych programów) korzysta do odczytywania komend ze standardowego wejścia biblioteki readline.
Część programów z przyczyn licencyjnych wybiera do tego samego celu 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:

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.)

Do wygodnego przeglądania historii można też użyć programu hstr

Zadanie 27 Jakim skrótem czyści się ekran?

Zadanie 28 Jakimi skrótami wyszukuje się wstecz w historii?

Zadanie 29 Jakim skrótem przesuwa się kursor o jedno słowo?

Zadanie 30 Jakim złożeniem skrótów przesuwa się kursor o 5 słów?

Zadanie 31 Jakim skrótów wstawia się ostatnie słowo z poprzedniego polecenia w historii?

Zadanie 32 Jakim złożeniem skrótów wstawia się trzecie od końca słowo z poprzedniego polecenia w historii?

Zadanie 33 Jakim skrótem zamienia się kolejnością to słowo z poprzednim?

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.

vi jest wpisane w standard POSIX.
Jest też częścią minimalistycznych zestawów narzędzi takich jak busybox i toybox.

Zadanie 34 Przejdź całą pierwszą lekcję w vimtutor.

Zadanie 35 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

Emacs jest odwiecznym rywalem vima w konkurencji programów do edytowania tekstu w konsoli.

Po wpisaniu emacs możesz wybrać tutorial skrótem Ctrl+h t.

Inne

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.
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.

Komenda time polecenie [argumenty]... uruchamiana podane polecenie z argumentami i mierzy czas jego wykonania.

Komenda timeout czas polecenie [argumenty]... uruchamiana podane polecenie i przerywa je po upłynięciu wskazanego czasu.

Zadanie 36 Wykonaj komendę która śpi przez 2 sekundy.

Zadanie 37 Zmierz ile czasu trwa wykonanie komendy z poprzedniego zadania.

Zadanie 38 Zmierz ile czasu trwa wykonanie komendy openssl dhparam -text 1536.

Zadanie 39 Wykonaj komendę openssl dhparam -text 2048 z limitem czasu 5s.

Procesy

Proces a program

Program jest sekwencją instrukcji1). 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 (poza pierwszym procesem, o identyfikatorze 1, zwanym init, uruchamianym przez jądro systemu operacyjnego przy starcie.

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 zombie.

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ę sierotą (orphan process) i jego rodzicem zostaje proces init.

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
  • -H sortuje hierarchicznie i rysuje (wcięciami w polu komenda) dzieci

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.

Zadanie 40 Wyświetl listę procesów poleceniem ps (bez argumentów).

Zadanie 41 Wyświetl listę procesów poleceniem ps zmieniając format wyników (kolumny) tak żeby było więcej szczegółów.

Zadanie 42 Wyświetl listę wszystkich procesów w systemie.

Zadanie 43 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 44 Wyświetl drzewo procesów.

Zadanie 45 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 46 Wyświetl zawartość pliku /proc/self/status. Informacje o jakim procesie zostały wyświetlone?

Zadanie 47 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 kompresją wewnątrz RAMu

Zużycie pamięci próbuje sensownie pokazać program smem; sprawdź opcje -p i -t.

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 48 Uruchom top. Naciśnij h żeby dostać się do pomocy. Zmień kolumnę po której są sortowane dane.

Zadanie 49 Co oznaczają stany procesu R, S, D, t i Z? Sprawdź w man ps.

Program htop został stworzony jako wygodny i bardziej funkcjonalny top.
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.

Zadanie 50 W programie htop zmień kolumnę sortowania.

Zadanie 51 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.

Wyszukiwanie procesów

Programy pgrep i pidof 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.

Program pidof nazwa wyświetli pidy procesów których nazwa (przycięta do 15 znaków) jest identyczna z podaną.

Zadanie 52 Uruchom program sleep 1h. W innym terminalu znajdź jego pid.

Zadanie 53 W jednym terminalu uruchom program sleep 1337h, w drugim sleep 42h. Znajdź pid tego pierwszego.

Zadanie 54 Znajdź pid procesu gdm wiedząc, że na twoim komputerze są też inne procesu mające na początku nazwy ciąg liter gdm.

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. Sygnał może być dostarczony w dowolnie niewygodnym momencie

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 SIGX, 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,
  • ALRM – proces poprosił o sygnał po upływie jakiegoś czasu i ten czas właśnie minął,
  • SEGV – proces próbował dostać się do pamięci niezwiązanej z procesem,
  • USR1 – sygnał bez określonego znaczenia, do dowolnego użycia programisty,
  • HUP – wysyłany przy zamykaniu (pseudo)terminala – tzn. przy zamknięciu emulatora terminala lub rozłączeniu sesji SSH; 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.

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
Nazwy i numery sygnałów można sprawdzić komendą kill -l lub kill -L.
Komenda kill przyjmuje tylko pid – numeryczny identyfikator procesu.
Podanie ujemnej wartości pid ma konkretne znaczenie; więcej w man kill

Zadanie 55 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.

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.

Zadanie 56 W jednym terminalu uruchom sleep 1h. Z innego terminala zabij ten proces używając pkill.

Zadanie 57 Uruchom program mousepad. Wyślij do niego sygnał STOP. Sprawdź jak działa mousepad. Potem wyślij do niego sygnał CONT.

Zadanie 58 Uruchom w jednym terminalu komendą named -g -c <(:) serwer DNS. Z drugiego terminalu wyślij sygnał HUP do nameda.

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 ([1], [2]).

Procesor

Procesy w uniksopodobnych systemach mają 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.

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).

Zadanie 59 Uruchom komendę sleep 1h z niceness 10. Sprawdź jej nicneness (np. w ps / htop).

Zadanie 60 Uruchom komendę sleep 1h i potem zmień jej niceness na 15.

Zadanie 61 W dwóch konsolach wykonaj taskset -pc 0 $$ (która zmieni listę dozwolonych procesorów tego shella na pierwszy).
Następnie w obu wykonaj openssl dhparam -text $((2**14)) [dowolny tekst] (co uruchomi procesorożerne szukanie dużych liczb pierwszych).
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?

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 (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.

1) 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
so/users_chmod.1678789376.txt.gz · ostatnio zmienione: 2023/03/14 11:22 (edycja zewnętrzna)