Polecenie clear czyści okno terminala jeśli to możliwe. Polecenie to ignoruje jakiekolwiek przekazywane parametry. Aby wyczyścić okno terminala, wpisz:
clear
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'
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.
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
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
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
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
Które pliki mogą być modyfikowane przez użytkownika ania należącego do grup users i students?
Które pliki mogą być czytane przez użytkownika zenon będącego członkiem grupy students?
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)
Do wypisania grup, których jestem członkiem służy polecenie
id
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.
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
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ązanie to w pierwszym przybliżeniu inna nazwa tego samego pliku (pewna analogia do skrótów w Windows).
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ł 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.
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 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
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
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 >, >>.
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.
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
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
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
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 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
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
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.
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 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
killall wysyła sygnał do wszystkich działających procesów o danej nazwie. Jeżeli nie podajemy rodzaju sygnały wysyłany jest SIGTERM. Uwaga, zwróć uwagę na to, że killall nie działa na zastopowane procesy.
sleep 100
^Z # przerwij wywołujac Ctrl+Z
sleep 100 &
sleep 100 &
jobs
killall sleep
jobs
Wykorzystano materiały z:
http://www.cs.put.poznan.pl/csobaniec/edu/sop/doc/sop1.pdf
http://www.prz.edu.pl/~tbajorek/PRz_zima_dz/MPDI/cw02_lin2.pdf
http://www.linux.net.pl/~wkotwica/doc/find/find_3.html
https://bap.faculty.wmi.amu.edu.pl/index.php/dydaktyka/dsop/
http://kik.pcz.pl/so-add/KSL/lekcje/l_15.html
http://programowanie.opole.pl/archives/1880
http://linux.byexamples.com/archives/130/head-and-tail/
http://wazniak.mimuw.edu.pl/images/f/fb/Sop_03_lab.pdf
http://regalis.com.pl/tajemnice-wejscia-wyjscia/
http://mediologia.pl/zarzadzanie-procesami-i-zadaniami/7-3-zakonczenie-procesu-polecenie-kill