Systemy operacyjne

Opis zajęć i zasad

Zajęcia 2

Komendy ogólnego przeznaczenia *

clear

Polecenie clear czyści okno terminala jeśli to możliwe. Polecenie to ignoruje jakiekolwiek przekazywane parametry. Aby wyczyścić okno terminala, wpisz:

clear

date

Polecenie date pokazuje datę i czas systemowy.

Ważne przełączniki (poczytaj o nich w man) : -d , -s , -u. Przykłady:

date
date -d fri
date -d '2 Nov 2013'
date --date='25 Dec' +%A
date +%B
date --date '1970-01-01 UTC 2147483647 seconds'
Odpowiednio pokazują:
  • Pokazuję datę najbliższego piątku.

  • Pokazuję datę 2 listopada 2013.

  • W jaki dzień wypada w tym roku Boże Narodzenie.

  • Jaki mamy miesiąc.

  • Konwertuje sekundy, które upłynęły od początku epoki uniksa w datę.

Ćwiczenie

Korzystając z formatowania wyjścia, wyświetl napis

Dzisiaj jest 215 dzien roku.

bc

Program bc to proste narzędzie do wykonywania operacji arytmetycznych. Obsługuje wiele operatorów matematycznych, w tym operatory arytmetyczne i logiczne, funkcje matematyczne, instrukcje warunkowe i pętle. Konstrukcja wyrażeń jest zbliżona do tej znanej z języka C. Zapoznaj się z działaniem bc, sprawdzając działanie następujących komend:

$ bc

for (i=1; i<=10; ++i){
        for (j=1; j<=10; ++j)
                print i*j, "\t"
        print "\n"
}

2+5

2.3/(0.779+0.123)

scale=3
2.3/(0.779+0.123)

x=24
y=36
sqrt(x^2+y^2)

quit

cal

Komenda cal pokazuje kalendarz. Sprawdź jego działanie:

cal
cal -3
cal 9 1752
cal -y 2016
cal -d 2015-11
cal -A 5 -B 3

cat

Do obejrzenia zawartości pliku (zawartość wyświetlana w terminalu), bez konieczności otwierania pliku w edytorze tekstowym służy polecenie cat:

touch cat.txt
printf "linia 1 \n\n\n linia 2 \n linia 3 \n" > cat.txt
cat cat.txt
cat -b cat.txt
cat -n cat.txt

Pliki i prawa do plików

Systemy typu UNIX umożliwiają współdzielenie zasobów przez użytkowników. Stąd w systemie operacyjnym Linux każdy plik i katalog posiada zestaw praw określający, kto ma dostęp do pliku i jakie ma prawa. Każdy plik lub katalog może mieć prawo czytania (read), pisania (write), i wykonywania (execute). Prawa dostępu mogą występować w różnych kombinacjach. Aby sprawdzić prawa dostępu, trzeba użyć polecenia ls z opcją -l.

Kolejność praw przy wypisywaniu:

k

rwx

rwx

rwx

identyfikator typu

uprawnienia dla właściciela

uprawnienia dla grupy

uprawnienia dla pozostałych użytkwników

Typy praw:

Prawo

Plik

Katalog

r

Czytania zawartości

Przeszukania zawartości

w

Zmiany zawartości

Zmiany zawartości

x

Uruchomienia

Przejścia do katalogu

> Odczyt dla folderu to odczytanie jego zawartości, czyli odczyt listy plików i folderów, które znajdują się tylko bezpośrednio w jego wnętrzu – bez wchodzenia w podfoldery.

> Zapis dla folderu oznacza uprawnienie do modyfikacji jego wnętrza – tworzenia nowych elementów wewnątrz oraz ich usuwania. Prawo do zapisu do folderu oznacza możliwość modyfikacji jego zawartości, czyli tworzenia i usuwania elementów w jego wnętrzu. Gdy mamy prawo do zapisu do folderu to możemy usuwać z niego pliki, nawet gdy nie mamy praw do tych plików.

> Wykonanie dla folderu oznacza uprawnienie do wejścia do jego środka. Żeby zrobić cokolwiek z plikiem wewnątrz katalogu (nawet gdy mamy pełne prawa do tego pliku) musim wejść do tego folderu, a więc potrzebujemy praw na jego wykonanie. Żeby wejść do podfolderu (nawet gdy mamy do niego pełne prawa) musimy przejść przez folder nadrzędny – więc i tu potrzebujemy praw na jego wykonanie. Stąd jeżeli nie mamy prawa wykonywania dla folderu to nie możemy dokonywać operacji na jego zawartości, bez znaczenia jakie mamy do niej prawa.

Przykład: Folder \tmp pozwala na tworzenia plików w danym folderze, ale nie na usuwanie z niego plików innych niż tylko swoje.

Identyfikator typu :

- zwykły plik

b specjalny plik blokowy

c specjalny plik znakowy

d katalog

l link symboliczny

p potok

s gniazdo

Zinterpretuj prawa dostępu następujących elementów:

-rwxr-xr-x 1 ania   users      164 Feb 21 17:19    program1
-rw-rw---- 1 kamil  students 24250 May 27  2002    dane.txt
-r-----r-- 1 zenon  users    28014 Feb 21 17:43 rysunek.jpg
-rwxrwxrwx 1 patryk students  4563 Mar 8  04:43 strona.html
drwxr--r-- 1 asia   users     4611 Mar 8  04:42     Pasjans

Kolejne informacje o plikach to:

  • uprawnienia do pliku,

  • liczba dowiązań stałych do pliku,

  • nazwa właściciela,

  • nazwa grupy,

  • rozmiar pliku w bajtach,

  • data ostatniej modyfikacji pliku,

  • nazwa pliku.

Pytania

  1. Które pliki mogą być modyfikowane przez użytkownika ania należącego do grup users i students?

  2. Które pliki mogą być czytane przez użytkownika zenon będącego członkiem grupy students?

  3. Kto może wykonywać program program1?

Uwaga

Jedną z unikalnych właściwości systemów Uniksopobnych, jest "wszystko jest plikiem". Pliki z danymi, katalogi, ale także urządzenia fizyczne, takie jak modemy, dyski, klawiatury czy drukarki, oraz wirtualne, takie jak konsole wirtualne, są dostępne w strukturze plików.

Wyróżniamy trzy rodzaje plików:

pliki zwykłe - programy, pliki danych, pliki tekstowe

katalogi - katalog to też plik, tyle że zawiera listę plików które się w nim znajdują

pliki specjalne - czyli np. urządzenia, potoki i tzw. gniazda (ang. sockets)

id

Do wypisania grup, których jestem członkiem służy polecenie

id

chmod

Prawa przypisywane plikom lub katalogom mogą być podawane na dwa sposoby :

Systemem kodów numerycznych : 4 2 1

Systemem kodów znakowych : r w x

I tak, na przykład

4 jest tym samym co r--,

5 to to samo co r-x,

7 oznacza rwx.

Polecenie służące do zmian praw dostępu to chmod. Całe polecenie tworzymy podając:

Symbol oznaczający osoby, których mają dotyczyć zmiany

u — właściciel pliku g — grupa pliku o — pozostali użytkownicy a — wszyscy użytkownicy, alternatywny zapis: ugo

Znak definiujący zmianę uprawnień

+ — nadanie uprawnień - — usunięcie uprawnień = — ustawienie jedynie praw podanych, pozostałe są usuwane

Uprawnienia, które będą zmienione

r — prawo odczytu w — prawo zapisu x — prawo wykonania

Sprawdź działanie:

touch a.txt
ls -l a.txt
chmod u+x a.txt
ls -l a.txt
chmod go+rwx a.txt
ls -l a.txt
chmod go-rwx a.txt
ls -l a.txt
chmod u=rw,g=r,o= a.txt
ls -l a.txt
chmod u=rwx,go-wx a.txt
ls -l a.txt
chmod 771 a.txt
ls -l a.txt

Czasem potrzebujemy zmienić prawa dla katalogu wraz z całą jego zawartością — warto wtedy posłużyć się parametrem -R, który wprowadza zmiany rekursywnie.

Ćwiczenie

mkdir A
touch A/a.txt

ls -l A
ls -l -d A
  • Sprawdź jakie prawa są wymagane do tego, aby wyświetlić zawartość pliku (zmieniaj prawa aż do uzyskania "Permission denied"):

cat a.txt
  • Sprawdź jakie prawa są wymagane do tego, aby zapisać dane do pliku:

echo "Ala ma kota" > a.txt
  • Sprawdź jakie prawa są wymagane do tego, aby wyświetlić zawartość katalogu:

ls -l A/
  • Sprawdź jakie prawa są wymagane do tego, aby przejść do katalogu.

  • Sprawdź jakie prawa są wymagane do utworzenia pliku w katalogu.

  • Sprawdź jakie prawa (i do czego!) są wymagane do zmiany praw dostępu do pliku.

chown

Zmiany właściciela pliku może dokonać tylko użytkownik z uprawnieniami administratora (a więc root, względnie normalny użytkownik mogący korzystać z sudo). Potestuj w domu:

chown username a.txt
chown :grupa a.txt

umask

Każdy nowo utworzony plik czy katalog posiada z góry zdefiniowane wartości właściciela oraz grupy, a także uprawnienia. W przypadku dwóch pierwszych kwestii sprawa jest prosta — właścicielem zostaje użytkownik, który stworzył plik lub katalog, natomiast grupą — domyślna grupa właściciela. Jeśli chodzi o prawa dostępu przypisane automatycznie świeżo tworzonym plikom, definiuje je maska uprawnień. Aktualną wartość maski uzyskamy poleceniem:

umask

Kiedy tworzony jest katalog, domyślnie przypisywane są do niego uprawnienia 777. W przypadku plików jest to 666, ponieważ uprawnienia do wykonywania plików powinny być zawsze nadawane ręcznie. Prawa umask podane są w postaci absolutnej tzn. należy odjąć je od pełnych uprawnień katalogu (777) oraz pliku (666). Dla wyniku działania umask postaci 0022 (pierwsza cyfra odpowiada ona za nieczęsto wykorzystywane prawa specjalne), świeżo utworzone katalogi będą miały pełne uprawnienia dla jego właściciela oraz uprawnienia odczytu (wylistowania zawartości) oraz wejścia do folderu dla pozostałych użytkowników. Przykład:

umask
umask u=,go=wx
umask
umask 000
touch g.txt
ls -l g.txt
rm g.txt
umask 666
touch g.txt
ls -l g.txt
rm g.txt
umask u+r
umask

Dowiązania

Dowiązanie to w pierwszym przybliżeniu inna nazwa tego samego pliku (pewna analogia do skrótów w Windows).

ln

Dowiązania dzielimy na sztywne wykonywane poleceniem:

ln  nazwa_pliku nazwa_dowiazania

i dowiązania miękkie, inaczej zwane symbolicznymi wykonywane poleceniem:

ln –s nazwa pliku nazwa_dowiazania

Dowiązanie pozwala nam zastąpić długą, pełną ścieżkę dostępu do pliku kilkuliterowym "skrótem", na przykład:

touch mojplik1
printf "linia 1 \n linia 2 \n linia 3 \n" > mojplik1
ln mojplik1 skrszt
ln -s mojplik1 skrsym
cat skrszt
cat skrsym
ls -l skrszt skrsym  mojplik1
rm skrszt
rm skrsym
ln mojplik1 skrszt
ln -s mojplik1 skrsym
printf "Zmiana? \n" > skrsym
cat mojplik1
cat skrsym
cat skrszt
printf "Zmiana teraz? \n" > skrszt
cat mojplik1
cat skrsym
cat skrszt
mv mojplik1 inny
cat skrszt
cat skrsym
rm skrszt
ls -l skrsym
rm skrsym
cat inny

Zauważ, że dowiązanie sztywne zachowuje pełne prawa dostępu i właścicieli oryginału. Natomiast dowiązanie symboliczne oferuje pełne prawa wszystkim, a jego właścicielem jest ten co je utworzył.

Dla systemu operacyjnego dowiązanie twarde jest dodatkową nazwą dla zawartości obiektu – plik z n dowiązaniami ma n nazw. Aby obiekt w systemie plików został skasowany, muszą zostać usunięte wszystkie odwołujące się do niego dowiązania.

i-węzeł

i-węzeł jest strukturą, w której jądro systemu przechowuje informacje o pliku. Każdy plik ma dokładnie jeden unikatowy i-węzeł. Każdą nazwę pliku skojarzoną wprost z i-węzłem nazywamy dowiązaniem sztywnym, często dowiązaniem (ang. link). Każdy plik ma co najmniej jedno sztywne dowiązanie. Dowiązanie symboliczne to skojarzenie nazwy pliku nie z jego i-węzłem, lecz z istniejącą już nazwą (ściślej: ścieżką dostępu) pliku. Uwaga: Do katalogów możemy tworzyć tylko dowiązania symboliczne.

W celu podejrzenia identyfikatorów i-węzłów stosujemy komendę:

ls -i

Ćwiczenie

  • Utwórz w swoim katalogu domowym dowolny katalog. Dlaczego są do niego dwa dowiązania stałe? Jak zmieni się liczba dowiązań stałych do katalogu, jeśli w jego wnętrzu utworzysz: (a) plik, (b) katalog?

Odpowiedź

Katalogi mają normalnie dwa dowiązania twarde: tym drugim jest zawarta w nich pozycja '.'

Jeżeli mają podkatalogi, każdy z nich ma też dowiązanie twarde o nazwie '..' do swego katalogu nadrzędnego.

Operacje na plikach

cmp

Polecenie cpm (ang. compare) służy do porównywania dwóch plików. Polecenie cmp porównuje kolejno znak po znaku zawartość plików i zatrzymuje się, gdy napotka pierwszą różnicę.

printf "assa" > new.txt
printf "asba" > new2.txt
cmp new.txt new2.txt

Używając opcji -l (ang. list) powodujemy, że polecenie cmp nie spowoduje zatrzymania przy pierwszej napotkanej różnicy, lecz doprowadzi porównanie plików do końca, z wylistowaniem wszystkich napotkanych różnic (kody ASCII znaków).

printf "asbaasdsa" > new3.txt
cmp -l new.txt new3.txt

diff

diff wyświetla rónice pomiędzy plikami tekstowymi.

printf "dif1\ndif2\ndif3\n" > dif1
printf "dif1\ndif22\ndif33\n" > dif2
diff dif1 dif2
diff -u dif1 dif2
diff -c dif1 dif2

head i tail

Standardowo filtry head i tail wypisują odpowiednio 10 pierwszych lub ostatnich linii danego pliku tekstowego.

ls -l /proc > h.txt
head h.txt
tail h.txt
tail -n 3 h.txt
head -n 15 h.txt
head -c 1500 h.txt

Dla zadanych operacji otrzymamy:

tail -n+10 h.txt  # wypisanie od 10 linii do końca
head -n-10 h.txt  # wypisanie wszystkich procz ostatnich 10 linii
head -n10 h.txt | tail -n+4  # wypisanie linii od 4tej do 10tej

Ćwiczenie

Przetestuj monitorowanie zawartości pliku a.txt uruchamiając w jednym oknie:

tail -f a.txt

a w drugim dodając nowe linie do tego pliku:

echo "Ala ma kota" >> a.txt
ps x >> a.txt

Wejście i wyjście

W programowaniu standardowe strumienie są to kanały komunikacji między programem komputerowym a środowiskiem, w którym program jest uruchamiany (zwykle terminalem). Kanały te są podłączane w początkowym procesie uruchamiania programu. Rozróżniamy trzy standardowe strumienie:

  • standard input (stdin, standardowy strumień wejściowy)

  • standard output (stdout, standardowy strumień wyjściowy)

  • standard error (stderr, standardowy strumień błędów lub standardowy strumień diagnostyczny)

Z pojęciem strumienia związane jest również inne ważne pojęcie – deskryptor pliku. Deskryptor pliku jest to identyfikator używany przez system operacyjny do obsługi operacji wejścia/wyjścia. Każdy proces po uruchomieniu ma standardowo otwarte 3 deskryptory plików:

  • 0 – STDIN

  • 1 – STDOUT

  • 2 – STDERR

Potok (ang. pipe) jest to mechanizm komunikacji międzyprocesowej umożliwiający bezpośrednią wymianę danych między uruchomionymi procesami. Komunikacja ta jest możliwia dzięki podłączeniu standardowego wyjścia jednego procesu do standardowego wejścia drugiego.

W powłoce tekstowej mamy możliwość przekierowania, zamykania, łączenia deksryptorów plików w uruchamianych programach, służą do tego operatory: < oraz >, >>.

Przekierowanie standardowego wejścia

Do przekierowania standardowego wejścia służy operator <, wykorzystujemy go w sytuacji, w której dane wejściowe do programu posiadamy np. w pliku tekstowym. Nie musimy otwierać pliku w edytorze i wklejać zawartości na standardowe wejście programu, wystarczy nam coś takiego:

head < h.txt

Powłoka tekstowa po otrzymaniu takiego polecenia najpierw otworzy plik h.txt w trybie tylko do odczytu, po poprawnym otwarciu uruchomi nasz program (w tym wypadku filtr head) „podpinając” deksryptor pliku o numerze 0 (STDIN) do deskryptora zwróconego przy otwieraniu pliku z danymi.

Przekierowanie standardowego wyjścia

Do przekierowania standardowego wyjścia służy operator >, wykorzystujemy go, gdy wynik (STDOUT) lub wyjście diagnostyczne (STDERR) naszego programu chcemy zapisać w pliku tekstowym.

echo "abc" > wynik.txt

Wykonanie tego polecenia spowoduje podpięcie deskryptora nr 1 (STDOUT) do deskryptora otwartego pliku, tym razem z opcją do zapisu i opcją obcięcia/czyszczenia (jeżeli plik istnieje, zostanie wyczyszczony), tak jak w poprzednim wypadku – nasz program zostanie uruchomiony dopiero po poprawnym otwarciu pliku wyjściowego. Możemy również użyć operatora >> który zachowuje się identycznie jak operator > z tą różnicą że zamiast opcji obcięcia, używana jest opcja dodawania czego efektem jest dopisywanie wyjścia naszego programu na koniec wskazanego pliku (plik nie jest czyszczony).

echo "abc" >> wynik.txt
cat wynik.txt

Potoki

Czasem zachodzi potrzeba, aby standardowe wyjście jednego z programów było traktowane jako standardowe wejście drugiego. Taki przepływ danych nazywamy potokiem. W powłoce Bash potok wprowadza się przy użyciu symbolu |.

ls /etc | head -n10

tee

Polecenie tee dane ze standardowego wejścia przesyła do standardowego wyjścia, zapisując je po drodze we wskazanym pliku.

ls /etc | tee zapisz | head -n10
cat zapisz

Procesy

Wiele z procesów uruchamianych jest przy starcie systemu, pozostałe są uaktywniane przez użytkowników w momencie zlecenia wywołania programów. Dowolny proces może uruchomić kolejny proces potomny i stać się macierzystym (nadrzędnym) wobec tego procesu potomnego. W momencie zarejestrowania się użytkownika w systemie uruchomiony zostaje jego pierwszy proces, czyli powłoka iterpretująca polecenia użytkownika.

W systemach z rodziny UNIX panuje hierarchiczna struktura procesów. Oznacza to, że każdy proces (program) ma dokładnie jednego rodzica (proces, który go wywołał), a procesem-korzeniem całej struktury jest init. Proces init ma zawsze wartość PID równą 1.

ps

ps wypisuje aktualnie działające procesy. Porównaj wyniki poleceń:

ps
ps -x
ps -ax
ps -u

Zbadaj działanie przełączników -l i -u.

Pełne informacje o procesach podaje komenda

ps -f

Hierarchię procesów można oglądać stosując program pstree

pstree

Zobacz też program top (którą można nazwać interaktywną wersją ps)

top

Sygnały

Z procesami komunikujemy się wysyłając do nich tzw. sygnały. Sygnały mają przyporządkowane numery i nazwy, pisane dużymi literami. Gdy program się wykonuje w powłoce, możemy wysłać do niego np. sygnał SIGINT (interrupt), korzystając z kombinacji klawiszy Ctrl + C (oznaczanej jako ^C). Sygnał ten oznacza, że program powinien przerwać wykonywane zadanie i zakończyć się niezwłocznie.

Ćwiczenie

  • Uruchom program cat a następnie wciśnij Ctrl + C.

Korzystając z kombinacji klawiszy Ctrl + Z (^Z), możemy wysłać do programu sygnał SIGSTP (stop), który powoduje wstrzymanie programu i powrót do powłoki. Proces taki nie kończy się jednak.

Wykonaj

sleep 100
^Z # przerwij wywołujac Ctrl+Z
sleep 90
^Z # przerwij wywołujac Ctrl+Z
sleep 80
^Z # przerwij wywołujac Ctrl+Z
ps

time

Program time pozwala zmierzyć czas wykonywania polecenia.

time ls -l
time sleep 5
time sleep 100
^Z # przerwij wywołujac Ctrl+Z

Czas sys okresla czas procesora związany z wykonywaniem operacji na poziomie jądra, user ten związany z wykonywaniem operacji poza jądrem, a real rzeczywisty czas od rozpoczęcia do zakończenia wykonywania programu.

jobs

Proces do którego wysyłamy sygnał, jest oznaczany albo przez numer zadania użytkownika albo jego nazwę, jak pamiętamy numer ten poznajemy dzięki poleceniu $jobs$ , albo przez jego systemowy identyfikator procesów PID (poznany dzięki poleceniom ps lub job -l).

sleep 100
^Z # przerwij wywołujac Ctrl+Z
jobs

kill

kill służy do wysyłania sygnałów do procesów. Listę sygnałów możemy wyświetlić na ekranie poprzez wydanie polecenia:

kill -l

Najczęściej interesują nas sygnały związane z przerywaniem, zatrzymywaniem i usuwaniem procesów:

  • SIGINT - sygnał nr 2 - przerwanie wykonanie procesu wykonane przez użytkownika przy pomocy klawiatury

  • SIGQUIT - sygnał nr 3 - zakończenie wykonywania procesu wykonane przez użytkownika przy pomocy klawiatury

  • SIGKILL - sygnał nr 9 - unicestwienie procesu, które bezwarunkowo kończy jego działanie. Nadawcą tego sygnału musi być właścicielem procesu lub administratorem.

  • SIGTERM - sygnał nr. 15

  • SIGSTOP - sygnał nr 19 - zatrzymanie wykonywania procesu, z możliwością późniejszego wznowienia jego wykonywania. Po wydaniu polecenia jobs zatrzymany proces zostanie wpisany jako „stopped”. Wznowienie pracy procesu uzyskujemy za pomocą poleceń fg lub bg.

sleep 100
^Z # przerwij wywołujac Ctrl+Z
sleep 100
^Z # przerwij wywołujac Ctrl+Z
ls -R
^Z # przerwij wywołujac Ctrl+Z
jobs
kill %1
jobs
kill -9  %2

Uruchamiając ps poznaj identyfikator procesu ls.

Dla przykładu

PID TTY          TIME CMD
6513 pts/2    00:00:00 ls
6998 pts/2    00:00:00 ps
32287 pts/2    00:00:01 bash

Uruchamiamy kil podając numer PID procesu.

kill  -9  6513
jobs