Podstawy obsługi systemów z rodziny UNIX

Transkrypt

Podstawy obsługi systemów z rodziny UNIX
Marek Stępień
Informatyka II
Wydział Elektrotechniki i Automatyki
Politechnika Opolska
Podstawy obsługi systemów z rodziny UNIX
1. Historia Uniksa. AT&T UNIX, BSD, GNU i Linux.
Programiści należących wówczas do AT&T Laboratoriów Bella (wśród nich m. in.
Dennis Ritchie) stworzyli pod koniec lat sześćdziesiątych (latem 1969 r.) system operacyjny
dla komputerów PDP-7, który nazwali UNIX. Założyli oni, że system powinien być prosty i
elegancki, napisany w języku wysokiego poziomu, ma także pozwalać na wielokrotne
wykorzystanie tego samego kodu. W tamtych czasach systemy operacyjne były duże
objętościowo i napisane w języku assemblera. UNIX miał stosunkowo mało kodu
assemblerowego – jądro systemu, pozostałe części zostały napisane w języku B. W latach
1972-1973 przepisano cały kod z języka B do nowo powstałego języka C.
W roku 1979 udostępnione zostało Wydanie Siódme (V7) Uniksa, uznawane za
“dziadka” współczesnych systemów uniksowych.
Twórcy Uniksa od początku współpracowali ze środowiskiem akademickim. W
pewnym momencie jednak ich drogi się rozeszły: na Uniwersytecie Kalifornijskim w
Berkeley został stworzony nowy wariant Uniksa nazwany Berkeley Software Distribution
(BSD), podczas gdy AT&T kontynuowała prace nad własną wersją (tzw. “System V”).
Wersje te konkurowały ze sobą w latach osiemdziesiątych. Wydawać się mogło, że
ostatecznie zwyciężył System V, gdyż większość jego architektury została uznana za
standard. Niemniej jednak, SysV przejął z czasem wiele cech BSD. AT&T udzielało licencji
na swojego Uniksa wielu producentom sprzętu, pojawiły się więc takie systemy jak HP-UX
Hewletta-Packarda czy Sun Solaris, będące wariantami Systemu V. Wszystkie one
stanowiły komercyjne i zamknięte rozwiązania.
Proces komercjalizacji i utajniania kodu źródłowego nie podobał się wielu osobom.
Jedną z nich był Richard Stallman z Politechniki w Massachusetts (MIT), twórca bardzo
popularnego wśród programistów uniksowych edytora tekstu Emacs. W roku 1984
Stallman wpadł na pomysł stworzenia otwartej i dostępnej dla każdego wersji Uniksa, którą
nazwał GNU (co jest rekursywnym akronimem od “GNU's Not Unix”). Prace nad GNU
miała prowadzić założona przez Stallmana Fundacja na rzecz Swobodnego
Oprogramowania (Free Software Foundation). Za “swobodne oprogramowanie” Stallman
uważał takie programy, które można bez ograniczeń używać, modyfikować, kopiować i
rozpowszechniać. Do początku lat 90. FSF miała już gotowe prawie wszystkie swobodne
odpowiedniki zamkniętych narzędzi oryginalnego Uniksa. W skład GNU wchodził
wspomniany wcześniej edytor Emacs, kompilator języka C (GCC, GNU C Compiler, obecnie
pod nazwą GNU Compiler Collection) oraz podstawowe narzędzia linii poleceń (ulepszona
powłoka Bourne'a - “Bourne-Again Shell” czyli bash, fileutils, binutils, textutils i inne).
Jedynym brakującym elementem GNU było jądro, którego FSF nie udało się doprowadzić
do pełnej funkcjonalności (z powodu przyjęcia zbyt ambitnych założeń projektowych).
W roku 1991 student informatyki na Uniwesytecie Helsińskim Linus Torvalds
opracował jądro systemu podobnego do Uniksa, które nazwał “Linux”. To przeznaczone dla
komputerów PC 386 jądro dobrze współpracowało z elementami stworzonymi przez GNU
oraz pochodzącymi z BSD. Torvalds rozpowszechnił swoje dzieło stosując warunki
licencyjne projektu GNU – tzw. Ogólną Licencję Publiczną GNU. W ten sposób projekt
GNU uzyskał ostatni brakujący element – jądro.
Od tej chwili można mówić o systemie GNU z jądrem Linux (GNU/Linux). Często
potocznie określa się ten system po prostu mianem “Linux”, choć warto pamiętać, że w
typowej instalacji GNU/Linuksa więcej kodu pochodzi od twórców projektu GNU.
Popularność GNU/Linuksa od początku lat 90 nieustannie wzrasta. Dystrybucje
tego systemu wypierają z rynku komercyjne i drogie wersje Uniksa, od kilku lat
GNU/Linux jest także najgroźniejszą konkurencją dla Windows Microsoftu.
Warto też wspomnieć, że z systemu BSD równolegle do rozwoju Linuksa
wykiełkowały FreeBSD, NetBSD i OpenBSD, będące również darmowymi i swobodnymi
odmianami Uniksa.
Największą popularność swobodne oprogramowanie przeżywa od kilku lat. Coraz
więcej firm zaczyna otwierać źródła swojego software'u i wykorzystywać inne otwarte
programy. Firma Apple pod koniec lat dziewięćdziesiątych praktycznie porzuciła rozwijany
przez siebie system Mac OS Classic na rzecz zmodyfikowanej wersji FreeBSD z jądrem
Mach. W ten sposób powstał Mac OS X – system łączący najlepsze cechy Uniksa z łatwością
obsługi Mac OS. Dziesiąta wersja systemu operacyjnego Macintoshy jest więc jak
najbardziej pełnoprawnym wariantem Uniksa.
Współcześnie do zastosowań domowych z systemów uniksowych używa się głównie
GNU/Linuksa i właśnie Mac OS X, choć liczba domowych użytkowników tego rodzaju
systemów jest znacznie niższa niż Windows. Na serwerach systemy uniksowe (GNU/Linux,
*BSD, Solaris, HP-UX, IRIX, AIX, UnixWare) mają olbrzymią przewagę nad produktami
Microsoftu.
Wiele elementów systemów uniksowych zostało ustandaryzowane normą IEEE –
POSIX (Portable Operating System Interface). Środowisko linii poleceń w pewnym stopniu
zgodnym z normą POSIX jest wykorzystywane także w systemach nieuniksowych. Jeśli
ktoś posiada umiejętności poruszania się w Uniksie, nie będzie dla niego problemem
odnalezienie się np. w dwóch systemach czasu rzeczywistego (QNX i BeOS). Środowisko
GNU zostało także sportowane na platformę Windows (Cygwin), tak więc także pod
Windows można sobie stworzyć “namiastkę Uniksa”.
W dalszej części wykładu omówię środowisko linii poleceń Uniksa na przykładzie
GNU/Linuksa. Warto jednak pamiętać, że współczesne uniksowe SO to nie tylko linia
poleceń, ale znakomite środowiska graficzne – zwłaszcza Mac OS X a także dwa środowiska
graficzne dla XWindow (Linux, BSD, Solaris) – Gnome i KDE.
2. Podstawowe operacje na konsoli
Systemy uniksowe zazwyczaj startują domyślnie do konsoli tekstowej, choć w
niektórych dystrybucjach GNU/Linuksa przeznaczonych do użytku domowego może od
razu uruchamiać się środowisko graficzne. W takim przypadku należy albo przełączyć się
na konsolę tekstową wciskając Ctrl-Alt-F1, lub uruchomić aplikację emulatora terminala,
np. Gnome Terminal, Konsola KDE, XTerm lub ATerm. Użytkownicy Mac OS X nie mają
dostępu do prawdziwej konsoli tekstowej, zmuszeni są więc uruchomić program Terminal.
Linux dostarcza standardowo siedem wirtualnych konsoli tekstowych i trzy
graficzne. Do przełączania się między nimi używamy kombinacji klawiszy Ctrl-AltF1/F2/F3/... - przy czym konsole 1-6 to konsole tekstowe, 7-9 – graficzne. Liczba konsoli
może zostać zmieniona przez administratora.
Po zalogowaniu się (podanie nazwy użytkownika i hasła) powinien pojawić się znak
zachęty. W przypadku zwyczajnego użytkownika ma on postać symbolu $, w przypadku
użytkownika root (administrator) – symbolu #. (Często w GNU/Linuksie bywa
poprzedzony nazwą użytkownika i aktualnym katalogiem – nie jest to jednak reguła).
Standardowa powłoka bash posiada historię poleceń, można więc przy użyciu
klawiszy kursora wybierać spośród poprzednio wprowadzonych rozkazów.
Struktura katalogów
W uniksach cały system plików widoczny jest w postaci katalogów umieszczonych w
wirtualnym katalogu “/”. Znajdziemy tu takie katalogi jak:
/bin – zawierejący podstawowe poleceniakonsoli
/etc – zawierający pliki konfiguracyjne systemu
/dev – zawierający pliki urządzeń
/lib – zawierający podstawowe biblioteki systemowe
/tmp – zawierający pliki systemowe
/usr – zawierający pliki i programy przeznaczone dla użytkowników, w niektórych
systemach umieszczane są wewnątrz niego także katalogi domowe użytkowników.
/var – zawierający m.in. logi systemowe oraz pliki używane przez tzw. Daemony, czyli
aplikacje realizujące usługi systemowe (obsługa poczty, drukarki,
/tmp – katalog plików tymczasowych
W Linuksie znajdziemy także:
/root – katalog domowy administratora
/sbin – polecenia przeznaczone do użytku administratora
/proc – wirtualny katalog zawierający wirtualne pliki z informacjami o stanie systemu i
komputera
/boot – zawierający m. in. informacje dla programu uruchamiającego jądro (LILO, Grub)
/home – katalog zawierający katalogi domowe użytkowników
Katalog /usr zawiera podobną strukturę jak / - znajdziemy w nim katalogi /
usr/bin, /usr/lib, /usr/etc itp. Zazwyczaj w podkatalogach / umieszcza się najważniejsze
dla funkcjonowania systemu programy i aplikacje, a w podkatalogach /usr – pozostałe.
Pomoc systemowa
Praktycznie każde polecenie posiada opcję - -help,wyświetlającą informacje o
składni i dostępnych opcjach, np.:
$ ls --help
Dla większości poleceń istnieją tzw. strony podręcznika systemowego. Napisanie:
$ man polecenie
powinno wyświetlić stronę podręcznika na temat danego polecenia. Należy jednakże
zdawać sobie sprawę, że w podręczniku znajdują się także np. opisy poleceń języka C czy
opisy funkcji systemowych. Rozróżnia się wtedy polecenia po numerach rozdziału, pisząc:
$ man nr_rozdziału polecenie
Krótkie informacje o danym poleceniu możemy uzyskać pisząc:
$ man polecenie
Informacje o poleceniach zawierających w nazwie jakiś ciąg znaków dostaniemy
pisząc:
$ apropos ciąg_znaków
Najbardziej szczegółowe informacje znajdziemy na tzw. stronach info. Wystarczy
napisać:
$ info polecenie
by dowiedzieć się więcej o danym poleceniu. (Bardziej szczegółowo niż man polecenie).
Aby opuścić przeglądarkę manuali lub stron info, wystarczy wcisnąć q.
Polecenia związane z plikami i katalogami
Jeśli przy znaku zachęty nie pojawia się informacja o aktualnym katalogu, możemy
jego nazwę wyświetlić pisząc:
$ pwd
Do zmiany aktualnego katalogu służy polecenie cd o składni:
$ cd nazwa_katalogu
Uwaga: warto pamiętać, że w powłoce bash wciśnięcie tabulatora dokańcza nazwy
plików. Pozwala to na szybsze wydawanie poleceń.
Jeśli nie podamy parametru, polecenie cd przeniesie nas do naszego katalogu
domowego. (Uwaga: jest to istotna różnica w stosunku do DOS/Windows – tam polecenie
cd bez parametrów działało jak pwd). Jeśli chcemy przejść do katalogu nadrzędnego,
napiszemy:
$ cd ..
Jeśli chcemy wydrukować zawartość danego katalogu, piszemy po prostu:
$ ls nazwa_katalogu
Jeśli pominiemy nazwę, ls wylistuje zawartość katalogu bieżącego. Polecenie to ma
wiele parametrów, wśród najważniejszych warto wymienić:
-a
pokazuje wszystkie pliki, także “ukryte” (tzn. o nazwach rozpoczynających się od
kropki)
-l
drukuje szczegółowe informacje o plikach (właściciel, prawa, daty modyfikacji,
rozmiar)
Opcje z jednym minusem i jedną literą można łączyć - “ls -a -l” odpowiada
“ls -al”.
Ciekawą opcją jest --color – jeśli dana wersja ls to obsługuje, różne rodzaje plików
są odpowiednio kolorowane (inaczej katalogi, inaczej pliki zwykłe, wykonywalne,
multimedialne etc.). Jeśli opcja ta jest domyślnie włączona, a nie chcemy kolorowania
(przydatne np. przy pętli for) – ustawiamy ją na none (--color=none).
Do usuwania plików służy polecenie rm:
$ rm nazwa_pliku
Zamiast nazwy pliku można zastosować symbole * i ?, Wówczas warto wymusić
potwierdzanie usuwania każdego pliku:
$ rm -i abc*
Do usuwania pustych katalogów służy polecenie rmdir:
$ rmdir nazwa_katalogu
Jeśli katalog zawiera pliki lub katalogi – nie zostanie w takiej sytuacji usunięty. Do
usuwania katalogów wraz z zawartością, stosujemy odpowiednie opcje polecenia rm:
$ rm -rf nazwa_katalogu
Jeśli chcemy założyć nowy katalog, korzystamy z polecenia mkdir:
$ mkdir nazwa_katalogu
Jeśli chcemy utworzyć całe drzewo katalogów, stosujemy opcję -p:
$ mkdir -p raz/dwa/trzy/cztery
Możemy także podać uprawnienia do tworzonego katalogu:
$ mkdir katalog -m 770
Zostanie utworzony katalog z uprawnieniami odczytu, zapisu i wykonywania dla
właściciela i grupy oraz bez uprawnień dla pozostałych użytkowników.
Jeśli chcemy przenieść plik do innego katalogu, wykorzystujemy polecenie mv:
$ mv plik katalog
Podobnie postępujemy, gdy zmieniamy nazwę pliku:
$ mv stara_nazwa nowa_nazwa
Uwaga: jeśli plik nowa_nazwa istnieje – zostanie nadpisany bez ostrzeżenia.
Ostrzeżenia można włączyć opcją -i. Innym rozwiązaniem jest tworzenie kopii zapasowej
nadpisywanego pliku. Polecenie:
$ mv -b jeden dwa
spowoduje zmianę nazwy dwóch plików: “dwa” na “dwa~”, a “jeden” na “dwa”.
Możemy jednocześnie przenieść plik do katalogu ze zmianą nazwy. Jeśli chcemy
przenieść z bieżącego katalogu plik “abc” do katalogu “katalog”, zmieniając mu nazwę na
“xyz” napiszemy:
$ mv abc katalog/xxx
Dodanie opcji “-i” sprawi, że mv będzie się pytać przed nadpisywaniem plików.
Aby skopiować plik, używamy polecenia cp:
$ cp plik_zrodlowy plik_docelowy
Aby skopiować katalog wraz z zawartością:
$ cp -R katalog_zrodlowy katalog_docelowy
Podobnie jak przy mv, możemy nakazać potwierdzanie przy nadpisywaniu plików –
opcja “-i”.
Aby wypisać zawartość pliku na ekran, używamy polecenia cat:
$ cat plik
Do nadawania uprawnień plikom służy polecenie chmod. Istnieją dwa warianty tego
polecenia. W pierwszym podajemy uprawnienia jako ciąg cyfr ósemkowych:
$ chmod plik 752
Prawa można prosto ustalić dodając odpowiednie liczby: 1 odpowiada prawu x; 2 –
w; 4 – r. Drugi sposób to zapis “komu co”, np.:
$
chmod u+rwx nazwapliku.
Jeśli mamy prawa administratora, możemy zmienić właściciela pliku:
$ chown inny_uzytkownik plik
Jeśli jesteśmy administratorem lub posiadamy członkostwo w wielu grupach,
możemy także zmienić grupę właścicielską:
$ chgrp inna_grupa plik
Katalogi domowe
Jak odwołać się do własnego katalogu domowego, jeśli nie wiemy, gdzie on się
znajduje? Istnieją dwa sposoby:
1. katalog domowy bieżącego użytkownika dostępny jest zawsze jako “~”.
2. katalog domowy bieżącego użytkownika zawiera się w zmiennej $HOME.
Zatem te polecenia są równoważne:
$ cd ~
$ cd $HOME
$ cd
Jak odwołać się do czyjegoś katalogu domowego? Poprzedzamy nazwę użytkownika
symbolem tyldy - “~kasia”. Wówczas nie musimy wiedzieć, czy Kasia ma swój katalog
domowy w /home/kasia, /usr/kasia, /Users/Kasia, /usr/users/grupy/grupa1/kasia etc.
Dowiązania twarde i symboliczne (“hardlinki” i “symlinki”).
Aby utworzyć dowiązanie twarde do danego pliku piszemy:
$ ln nazwa_pliku nazwa_dowiązania
W tablicy inode'ów zostanie wówczas utworzony drugi wpis wskazujący na dany
plik.
Aby utworzyć dowiązanie symboliczne, piszemy:
$ ln -s nazwa_pliku nazwa_dowiązania
W tym wypadku zostanie utworzony plik tekstowy “nazwa_dowiazania” zawierający
ścieżkę dostępu do pliku “nazwa_pliku”. Plik ten dostanie dodatkowe uprawnienie “l”,
oznaczające, że jest odwołaniem.
Dlaczego symlinki są lepsze od hardlinków? Ponieważ listując zawartość katalogu,
od razu widzimy, że dany plik jest dowiązaniem:
$ ln -s plik symlink
$ ln plik hardlink
$ ls -l
razem 1
-rw-r--r--rw-r--r-lrwxrwxrwx
2 marcoos
2 marcoos
1 marcoos
users
users
users
0 2003-12-17 23:28 hardlink
0 2003-12-17 23:28 plik
4 2003-12-17 23:28 symlink -> plik
Archiwizacja danych
Do obsługi plików z archiwami służy przede wszystim polecenie tar:
Rozpakowanie pliku .tar w bieżącym katalogu:
$ tar -xf plik.tar
Utworzenie archiwum z zawartością katalogu:
$ tar -cf archiwum.tar katalog
Należy pamiętać, że nie jest przeprowadzana żadna kompresja, tworzony jest tylko plik
zawierający inne pliki i informacje o ich położeniu.
Kompresja pliku do formatu gzip (powstaje “plik.gz”):
$ gzip plik
Dekompresja pliku .gz:
$ gunzip plik.gz
Analogicznie przebiega kompresja i dekompresja do formatu bzip2 (bzip2, bunzip2).
Można także od razu tworzyć skompresowane archiwa tar:
$ tar -czf archiwum.tar.gz katalog
$ tar -cjf archiwum.tar.bz2 katalog
oraz dekompresować i odpakowywać takie archiwa:
$ tar -xzf archiwum.tar.gz
$ tar -xjf archiwum.tar.bz2
Obsługa dysków
W systemach uniksowych należy zawsze domontować dany dysk, dyskietkę lub płytę
do katalogu. Czyni się to poleceniem mount:
$ mount -t typ_systemu_plików /dev/urządzenie /mnt/katalog
Jeśli system jest odpowiednio skonfigurowany, wystarczy:
$ mount /mnt/katalog
Po skończeniu pracy z danym dyskiem należy go odmontować poprzez:
$ umount /mnt/katalog
lub
$ umount /dev/urz?dzenie
Polecenie mount domyślnie próbuje zamontować dany napęd w trybie do odczytu i zapisu.
Jeśli chcemy zamontować dany dysk tylko do odczytu, należy do tego polecenia dopisać
“ro”.
Przykład: Zamontowanie dyskietki w formacie FAT w pierwszej stacji dysków, tylko do
odczytu:
$ mount -t vfat /dev/fd0 /mnt/floppy ro
Odmontowanie:
$ umount /dev/fd0
Przykład 2: Zamontowanie płyty CD-ROM:
$ mount -t iso9660 /dev/cdrom /mnt/cdrom ro
Uwaga: to, czy zwykły użytkownik ma prawo montować dyski, zależy od administratora
systemu.
Potoki wyjściowe
Wysłanie wyników polecenia do pliku z nadpisaniem pliku...:
$ polecenie > plik
...ibez nadpisania, z dołączaniem do końca pliku:
$ polecenie >> plik
Wyslanie wyników polecenia do pliku “wyniki” a błędów do pliku “err”:
$ polecenie >> wyniki 2>>err
Potoki wejściowe
Pobranie z pliku wartości, które zostaną podane na wejście polecenia:
$ polecenie < plik
Podanie na wejście polecenia2 wyników polecenia1:
$ polecenie1 |
polecenie2
Przykład:
ls -al | less
Polecenie less to ulepszona wersja polecenia more, które dzieli wyjście danego polecenia na
strony mieszczące się na ekranie. Następna strona to spacja, można używać klawiszy
kursora oraz PgUp, PgDn, Home, End.
Symbol “<<”
Załóżmy, że chcemy na standardowe wejście danego polecenia przekazać jakiś wieloliniowy
tekst, który dopiero zamierzamy wprowadzić z klawiatury. Jak to zrobić? Skorzystajmy z
symbolu “<<”, umieszczając tuż zanim jakiś znacznik (zwykle pisze się “EOF”):
$ cat >plik << EOF
> W Paryżu
> najlepsze kasztany
> są na placu
> Pigalle
> EOF
$ cat plik
W Paryżu
najlepsze kasztany
są na placu
Pigalle
$
Utworzyliśmy tutaj plik o nazwie “plik” o treści takiej, jaką wprowadziliśmy w kolejnych
liniach z klawiatury.
Wyszukiwanie w plikach i plików
Aby wypisać wszystkie linie pliku plik.txt zawierające dane słowo, piszemy:
$ grep slowo plik.txt
Natomiast to polecenie wypisze linie nie zawierające tego słowa:
$ grep -v slowo plik.txt
Jeśli chcemy się dowiedzieć, gdzie znajduje się dane program wykonywalny
(dostępny dzięki $PATH), korzystamy z polecenia whereis:
$ whereis vi
vi: /usr/bin/vi
Jeśli chcemy przeszukać system plików wg zadanego kryterium, używamy polecenia
find. Ogólna składnia:
$ find gdzie_szuka? jakie_kryterium co_zrobi?_po_odnalezieniu
Kilka przykładów:
find . -name "html" -print
szukanie wszystkich plików w bieżącym katalogu
o nazwach zawierających słowo “html”
find . -name '*.c' -ok less {} \;
wyszukuje wszystkie pliki .c, przy każdym odnalezionym
proponuje wyświetlenie jego zawartości na ekranie
find . -name '*.c' -exec less {} \; podobnie, ale od razu wyświetla pliki, bez potwierdzania
find /tmp -atime +3 -and -uid +499 -print -exec rm -rf {} \;
Spowoduje skasowanie wszystkich plików, które nie były używane od 3 dni i ich
właścicielami są użytkownicy o UID większym niż 499 i znajdującymi się we wszystkich
kartotekach od kartoteki /tmp począwszy, informacja o znalezionych plikach zostanie
przekazana na monitor.
Find /usr/src -type f -exec grep "stdio.h" {} \; -print
Wyszuka wszystkie pliki w katalogu /usr/src zawierające w swojej treści “stdio.h”.
Nazwa pliku zostanie wypisana po wszystkich liniach z danego pliku zawierających
“stdio.h”.
Praca z procesami
Zazwyczaj praca w bashu jest sekwencyjna – realizujemy polecenie za poleceniem.
Ale przecież UNIX jest systemem wielozadaniowym i czasami jednak chcielibyśmy
uruchomić jakiś program w tle. W takiej sytuacji korzystamy z symbolu “&”.
Przykładowo, chcielibyśmy poleceniem mpg123 odsłuchać plik muzyczny na konsoli, ale
jednocześnie mieć dostępną linię poleceń:
$ mpg123 piosenka.mp3 >/dev/null 2>/dev/null
$ kolejne_polecenia
&
Co tu zrobiliśmy? Uruchomiliśmy w tle program mpg123 odtwarzający pliki muzyczne
mp3, przekierowując do urządzenia /dev/null (“czarnej dziury”) tekstowe wyjścia tego
programu (żeby nie zaśmiecał nam ekranu swoimi komunikatami). Dzięki temu muzyka
gra w tle podczas, gdy możemy na konsoli wykonywać kolejne polecenia.
A co, jeśli uruchomiliśmy jakiś program, którego działanie trwa długo i blokuje nam
konsolę? Wciskamy CTRL-Z i program zostaje wstrzymany (nie zamknięty). Jeśli teraz
wydamy polecenie:
$ bg
program zostnie “odmrożony”, ale dalej będzie się wykonywał w tle.
Jeśli jednak wpiszemy:
$ fg
powrócimy do tego programu, konsola ponownie będzie zablokowana.
Każdy proces w systemie UNIX ma swój identyfikator (liczbę), tzw. PID (process
identifier). Dzięki temu identyfikatorowi zarówno system jak i użytkownik może w pewnym
zakresie zarządzać realizowanymi procesami.
Aby zobaczyć listę procesów uruchomionych na aktualnej konsoli, napiszemy:
$ ps
PID
6092
7304
7305
TTY
pts/1
pts/1
pts/1
TIME
00:00:00
00:00:00
00:00:00
CMD
bash
mpg123
ps
Widzimy, że bash ma PID 6092, a mpg123 – 7304. Jeśli chcielibyśmy poznać
polecenie, jakim uruchomiono dany proces, napisalibyśmy:
$ ps x
Wszystkie “nasze” procesy wylistujemy poleceniem:
$ ps u
Polecenie ps ma znacznie więcej opcji. Ich krótką listę dostaniemy pisząc “ps –help”,
warto także przejrzeć podręcznik i strony info.
Aby natychmiast przerwać proces o danym PIDzie, piszemy:
$ kill -9 PID
Aby przerwać wszystkie procesy o danej nazwie, piszemy np.:
$ killall -9 mpg123
Polecenia te przesyłają różne sygnały do procesu, najczęściej są to sygnały
wymuszające zakończenie procesu. Sygnał 9. (KILL) jest najbardziej skuteczny – powoduje
natychmiastowe przerwanie procesu. Bardziej eleganckie jest wysłanie sygnału 15. (TERM),
ale nie zawsze chcemy to zrobić. Sygnałów tego rodzaju może być wiele, a zachowanie
danego procesu na dany sygnał także może być różne (z wyjątkiem 9). Często np. sygnał 1
(HUP) bywa wykorzystywany jako rozkaz ponownego odczytania plików konfiguracyjnych
przez dany proces.
Spis dostępnych sygnałów otrzymamy pisząc:
$ kill -l
Proces uruchomiony nie w tle (blokujący konsolę) często można przerwać wciskając
po prostu Ctrl-C.
Zmienne środowiskowe
Znaczenie niektórych zmiennych środowiskowych przedstawiono poniżej.
$PATH – zawiera spis katalogów, pośród których szukane są polecenia
$SHELL – zawiera nazwę aktualnej powłoki (np. “/bin/bash”, “/bin/csh” itp.)
$USERNAME – zawiera nazwę aktualnego użytkownika
$HOSTNAME – nazwa hosta
$HOME – zawiera nazwę katalogu aktualnego użytkownika
$PS1 – główny znak zachęty
$PS2 – drugi znak zachęty
$CC – zawiera nazwę domyślnego kompilatora C
$CXX – zawiera nazwę domyślnego kompilatora C++
$LC_ALL – (w uproszczeniu mówiąc) zawiera ustawienia językowe aktualnego
użytkownika.
Jeśli LC_ALL ustawimy na “pl_PL”, system będzie się komunikował z nami w języku
polskim (o ile są zainstalowane polskie pakiety lokalizacyjne). Aby powrócić do
anglojęzycznej konsoli, ustawiamy LC_ALL na “en_US”:
Przykład:
$ LC_ALL="pl_PL"
$ ls nieistniejacyplik
ls: nieistniejacyplik: Nie ma takiego pliku ani katalogu
$ LC_ALL="en_US"
$ ls nieistniejacyplik
ls: nieistniejacyplik: No such file or directory
Szczegółowy opis wszystkich zmiennych środowiskowych można znaleźć w
podręczniku systemowym powłoki bash (man bash).
Aliasy
Jeśli często korzystamy z jakiegoś polecenia, które jest długie lub ma niewygodną składnię,
możemy sobie stworzyć tzw. alias. Oto przykład:
$ alias montujfdd=”mount -t vfat /dev/fd0 /mnt/floppy ro”
Jeżeli będziemy chcieli usunąć ten alias, piszemy:
$ unalias montujfdd
Aby powłoka pamiętała aliasy, należy je dopisać do .bashrc lub .bashprofile.
Aby zobaczyć listę aliasów, wydajmy polecenie alias bez parametrów.
Informacje o użytkownikach
who – wyświetla listę zalogowanych użytkowników, nazwy konsoli oraz godzinę od której
są zalogowani
whoami – wypisuje naszą nazwę użytkownika
who am i – wyświetla informacje o nas w sposób taki, jak “who”
Ustawienia konta użytkownika
Jeśli nie chcemy, by bash był naszą domyślną powłoką, możemy to zmienić:
$ chsh -s /bin/jakiś_shell
Aby zmienić hasło na nasze konto, korzystamy z polecenia:
$ passwd
Pliki z kropką w nazwie
Dla powłoki bash istotnych jest kilka plików o nazwach rozpoczynających się od
kropki. Oto, do czego służą.
~/.bashrc
Ten skrypt jest wykonywany przy ręcznym uruchomieniu powłoki.
~/.bash_profile
Skrypt uruchamiany przy inicjalizacji powłoki
uruchomionej przy logowaniu się,a nie ręcznie)
~/.bash_logout
Skrypt uruchamiany przy wychodzeniu z powłoki
~/.bash_history
Plik zawiera historię naszych poleceń
typu
login
(tzn.

Podobne dokumenty