Konsola Dla Eksperta

Poradnik ten jest kontynuacją artykułu "Wszystko o konsoli". W poprzedniej części poruszyłem fundamentalne zagadnienia związane z pracą w konsoli tekstowej w systemach unix-like: poruszanie się po drzewie katalogów, strumienie, potoki i wyrażenia regularne. W tym artykule chciałbym przedstawić zdobywanie pomocy, zarządzanie użytkownikami i
uprawnieniami oraz kontrolę procesów.

Zdobywanie pomocy

Właściwe dokumentowanie kodu źródłowego jak i programów jest jednym z filarów kultury uniksowej, jak podaje Eric Steven Raymond w "The Art of UNIX Programming". Pierwszą aplikacją w Uniksie była platforma do przygotowywania dokumentów, wykorzystywana przez laboratoria Bell Labs do przygotowywania dokumentów patentowych.
Umiejętność pracy z dokumentacją, wyszukiwania potrzebnych wiadomości jest jednym z kluczy do sukcesu w pracy z systemami unix-like.

Dokumentacja lokalna

man

Tradycyjnie pierwszym i podstawowym źródłem informacji o danym programie są strony podręcznika man. Nazwa ta jest skrótem angielskiego słowa manual (instrukcja obsługi). Standardowo podręcznik podzielony jest na osiem części:

  1. polecenia użytkowe
  2. wywołania systemowe
  3. funkcje biblioteczne
  4. pliki specjalne
  5. formaty plików
  6. gry
  7. różne
  8. polecenia do administracji systemem

Każda strona podręcznika podzielona jest na następujące sekcje:

  • nagłówek z nazwą polecenia oraz numerem sekcji podręcznika
  • nazwa polecenia, w niektórych przypadkach również pozostałych poleceń opisanych na danej stronie
  • streszczenie wszystkich parametrów wykorzystywanych przez dane polecenie
  • krótki opis programu
  • szczegółowe informacje na temat każdego parametru

W zależności od rodzaju polecenia oraz systemu, na którym pracujemy, mogą pojawić się też takie sekcje:

  • zmienne środowiskowe
  • diagnostyka
  • błędy i ograniczenia
  • autorzy
  • prawa autorskie
  • pliki konfiguracyjne

Aby wyświetlić stronę man danego polecenia, w konsoli wystarczy wpisać man nazwa_polecenia. Jeżeli dane polecenie opisane jest w kilku sekcjach, należy podać też numer sekcji. Np. sekcja pierwsza podręcznika zawiera opis polecenia open, natomiast sekcja druga zawiera opis wywołania systemowego open, tak więc aby zapoznać się z dokumentacją wywołania, w konsoli należy wpisać man 2 open.
Po otwartej stronie man poruszamy się za pomocą kursorów. Aby wrócić do konsoli, wystarczy wpisać :q; aby na stronie znaleźć określoną frazę poniżej miejsca, w którym jest kursor, wystarczy wpisać /fraza, powyżej — ?fraza; n powtarza ostatnie wyszukanie.
Polecenie man ma dwa ciekawe parametry związane z wyszukiwaniem odpowiedniej sekcji podręcznika. Wywołania polecenia z parametrem -a wyświetli wszystkie strony dla danego polecenia, jedna pod drugą. Natomiast uruchomienie z parametrem -w wyświetli tylko numery sekcji, w których dane polecenie się pojawia.

# man -w open
/usr/share/man/cat2/open.0
/usr/share/man/cat3p/open.0

Poszczególne sekcje rozłożone są na podkatalogi i, jak widać na powyższym przykładzie, polecenie open pojawia się w 2 i 3 sekcji podręcznika man (przykład zaczerpnięty z systemu OpenBSD 4.1).
Do przeszukiwania stron podręcznika wykorzystywane są 2 polecenia: whatis i apropos.
Whatis służy do zwięzłego objaśniania działania poszczególnych poleceń i programów.
adam@laptop:~$ whatis ls mkdir cat man df
ls (1)               - list directory contents
mkdir (1)            - make directories
cat (1)              - concatenate files and print on the standard output
man (1)              - an interface to the on-line reference manuals
man (7)              - macros to format man pages
df (1)               - report file system disk space usage

Polecenie apropos wyszukuje podaną frazę na stronach podręcznika.
adam@laptop:~$ apropos 'list directory'
dir (1)              - list directory contents
ls (1)               - list directory contents
vdir (1)             - list directory contents

Zapytania mogą być bardziej skomplikowane:
adam@laptop:~$ apropos ext3 | grep create
mke2fs (8)           - create an ext2/ext3 filesystem
mkfs.ext2 (8)        - create an ext2/ext3 filesystem
mkfs.ext3 (8)        - create an ext2/ext3 filesystem

W powyższym przykładzie wyszukiwałem strony podręcznika, które mogą zawierać informacje na temat tworzenia systemu plików ext3. Ponieważ samo zapytanie apropos ext3 zwróciło na wyjściu bardzo dużo informacji, przefiltrowałem je za pomocą polecenia grep. Oczywiście nic nie stoi na przeszkodzie, by użyć wyrażeń regularnych.
Man zawiera 2 parametry zastępujące polecenia whatis i apropos. Są to odpowiednio -f oraz -k.
Istnieje możliwość wydrukowania interesujących nas stron dokumentacji — służy do tego parametr -t.
adam@laptop:~$ man -t ls > ls.ps

W powyższym przykładzie utworzony został plik w formacie PostScript, natomiast z parametrem -t utworzony zostanie plik w formacie DeVice Independent (DVI).
adam@laptop:~$ man -T ls > ls.dvi

info

Info jest programem służącym do przeglądania dokumentacji stworzonej w formacie GNU Texinfo. Format ten wykorzystywany jest przez Free Software Fundation. Możliwe w nim jest hipertekstowe poruszanie się po dokumentach — przeskakiwanie do poszczególnych sekcji itp. Więcej na temat tego polecenia można dowiedzieć się na jego stronie man (man info) lub wydając polecenie info info. Przeglądanie dokumentacji można zacząć od polecenia info. Do nawigacji służą następujące przyciski:

n następna strona
p poprzednia strona
u strona w górę
l ostatni odwiedzony węzeł

Dokumentacja w formacie Texinfo ma formę drzewa.

/usr/share/doc

Lokalizacja /usr/share/doc/ to miejsce gdzie zwyczajowo znajduje się dokumentacja w formatach innych niż man i info. Na przykład użytkownicy Ubuntu znajdą książkę "Dive into Python", w Debianie Etch znajdzie się kolekcja dokumentów How To (niestety niektóre przewodniki są bardzo przestarzałe), a w systemie OpenBSD znaleźć można "Dokumentację uzupełniającą dla programisty" (ang. "Programmer's Supplementary Documents"), "Podręcznik administratora systemu" (ang. "System Manager's Manual"), "Dokumentację uzupełniającą dla użytkownika". Powyższe podręczniki dostępne są, jeżeli podczas instalacji zostanie wybrany zestaw instalacyjny misc41.tgz.

Dokumentacja w Internecie

Internet oferuje wiele źródeł dokumentacji i pomocy. Znajdziemy w nim mniej i bardziej oficjalne strony, wiki, fora, grupy dyskusyjne itd. Poszukiwania informacji warto rozpocząć od katalogu linków dostępnego w opisach systemów na stronie jakilinux.org.
Chciałbym przedstawić kilka stron poświęconych tematyce administracji systemami unix-like.

Deweloper Works

Serwis, za którym stoi gigant rynku IT - IBM. Znaleźć w nim można dużo artykułów poświęconych administracji systemami unix-like o różnym stopniu zaawansowania, jak np. artykuły na temat tworzenia oprogramowania. Publikacje dostępne są za darmo zarówno w wersji on-line, jak i pdf. W przypadku niektórych wymagana jest darmowa rejestracja.

Big Admin

Wortal administratorów systemów, poświęcony głównie systemom Solaris. Artykuły dostępne są za darmo, rejestracja nie jest wymagana.

OnLamp, Linuxdevcenter

Serwisy związane ze znanym wydawnictwem O'Reilly, skupione wokół O'Reilly Network. W pierwszym można znaleźć artykuły poświęcone nie tylko dystrybucjom Linuksa, ale też rodzinie BSD i programowaniu w językach PHP, Python, Perl. Rejestracja wymagana jest jedynie w przypadku komentowania; płatny jest jedynie dostęp do książek w wersji elektronicznej.

Linux Documentation Project

Jest to inicjatywa mająca na celu stworzenie zbioru dokumentacji dla dystrybucji Linuksa. Dostępne są tam przewodniki, poradniki HOWTO, zbiory najczęściej zadawanych pytań, manuale. Przewodniki są niezależne od dystrybucji, dostępne za darmo w różnych formatach.

Uprawnienia

Podstawy

Unix od samego początku był systemem umożliwiającym pracę wielu użytkownikom naraz (tzw. wieloużytkownikowość). Cecha ta wymagała implementacji odpowiednich mechanizmów bezpieczeństwa w celu ochrony danych, jak i samego systemu operacyjnego przed niepowołanym dostępem. Standardowo użyty jest model DAC (ang. Discretionary Access Control - swobodna kontrola dostępu). W DAC użytkownik decyduje zabezpieczeniach i prawach dostępu do pliku. Wraz z rozwojem systemów operacyjnych model ten z czasem stał się nie wystarczający co wymusiło opracowanie taki modeli jak min. MAC (ang. Mandatory Access Control - model obowiązkowej kontroli dostępu), ACL (ang. Access Control List - listy kontroli dostępu) i ich praktycznych implementacji takich jak np. SELinux, TrustedBSD, Trusted Solaris.

Właściciel pliku

Z reguły właścicielem pliku jest użytkownik, który go utworzył. W systemach unix-like pliki mają dwóch właścicieli: użytkownika (ang. user) i grupę (ang. group). Właściciele nie muszą stanowić pary, właściciel użytkownik nie musi być członkiem grupy, która posiada plik. Zazwyczaj jednak grupą posiadającą plik jest grupa do której należy użytkownik.
Jeżeli jakiś użytkownik nie jest właścicielem ani członkiem grupy posiadającej dany plik jest traktowany jako "reszta świata" (ang. others).
Każdy użytkownik posiada przypisany do jego nazwy numer UID (ang. user identification number) po którym jest rozpoznawany przez system. Root posiada numer 0, natomiast ostatni numer z puli, 65534 (w Ubuntu) 32767 (w NetBSD), przypisany jest użytkownikowi nobody. Tak więc o przyznanie uprawnień nie będzie zależne od nazwy a od odpowiedniego UID'a, np. w niektórych systemach (np. NetBSD) utworzone jest konto toor'a posiadające UID równy 0 czyli drugie konto superużytkownika. Każda grupa posiada swój unikalny GID (ang. group identification number - numer identyfikacyjny grupy) jest to odpowiedniku numeru GID.
Do wyświetlania właścicieli pliku używa się opisanego wcześniej polecenia ls z parametrem -l.

adam@laptop:~$ ls -l
razem 1822
drwxr-xr-x  3 adam adam    120 2007-09-03 16:00 Desktop
-rw-r--r--  1 adam adam    400 2007-08-22 18:49 prog_09.py

Trzecia i czwarta kolumna to odpowiednio użytkownik i grupa posiadająca plik.

chgrp

Jest to polecenie umożliwiające zmianę grupy posiadacza pliku. Jeżeli jest uruchamiane przez zwykłego użytkownika musi on być posiadaczem pliku oraz członkiem grupy której chce nadać prawo własności, co ciekawe nie musi być członkiem grupy aktualnie posiadającej plik. Składania polecenia jest następująca: chgrp nowa-grupa pliki, może być podana nazwa grupy lub też jej identyfikator GID.

adam@laptop:~$ ls -l
-rw-r--r--  1 adam root      0 2007-09-03 15:33 plik.txt
adam@laptop:~$ chgrp users plik.txt 
adam@laptop:~$ ls -l
-rw-r--r--  1 adam users      0 2007-09-03 15:33 plik.txt

Polecenie te posiada parametr -R umożliwiający rekurencyjną zmianę grupy dla wszystkich plików i podkatalogów, działa on tak samo jak jego odpowiednik z innych, opisanych już wcześniej poleceń (rm, ls).

chown

To polecenie używane jest do zmiany właściciela i grupy posiadającej plik. W większości systemów może wykonywać je tylko root. Polecenie ma składnię: chown nowy użytkownik:nowa grupa pliki. Podobnie jak w poleceniu chgrp można podać nazwę użytkownika, grupy, lub też ich liczbowe identyfikatory, polecenie nie sprawdza czy podane numery są poprawne tak więc można UID i GID nieistniejących użytkowników i grup.

adam@laptop:~$ ls -l
-rw-r--r--  1 adam users      0 2007-09-03 15:33 plik.txt
root@laptop:# chown root:root plik.txt 
adam@laptop:~$ ls -l
-rw-r--r--  1 root root      0 2007-09-03 15:33 plik.txt

Zmienia grupę oraz właściciela pliku.
root@laptop:# chown zoidberg plik.txt

Zmieni właściciela pliku, na użytkownika zoidberg, grupa pozostanie bez zmiany.
root@laptop:# chown :futurama plik.txt

Zmieni grupę, na grupę futurama, właściciel pozostanie niezmieniony. Chown umożliwia rekurencyjną zmianę właściciela za pomocą parametru -R.

Prawa dostępu

W każdym uniksie dostępne są trzy rodzaje praw dostępu: odczyt (ang. read) oznaczany w skrócie r, zapis (ang. write) oznaczany w i wykonanie (ang. execute) oznaczane x.

Prawo dostępu Plik Katalog
r Odczyt zawartości pliku. Wyświetlenie zawartości katalogu, np. poleceniem ls.
w Możliwość zapisu do pliku. Modyfikowanie zawartości katalogu.
x Prawo do wykonania pliku. Możliwość przejścia do katalogu poleceniem cd.

Analizując prawa dostępu do katalogów należy pamiętać, że są one plikami zawierającymi nazwy umieszczonych w nich plików oraz informacje o ich lokalizacji na dysku. Aby wyświetlić zawartość katalogu poleceniem ls (bez parametrów) wystarczy posiadanie uprawnienia tylko do odczytu, jednak uruchomienie ls -l wymagać będzie już posiadanie uprawnień do odczytu i wykonania ponieważ wykonywana jest w trakcie jego pracy nie jawna zmiana katalogów. Generalnie każde działanie na katalogu poza zwykłym wypisaniem jego zawartości wymagać będzie posiadania uprawnienia do wykonania.
Posiadanie uprawnienia do wykonania katalogu umożliwi dostęp do jego zawartości, poprzez nazwy plików.

drw-r--r--  2 adam adam      96 2007-09-05 18:04 blob
drwxr-xr-x  2 adam adam     176 2007-09-04 15:57 tapety
-rw-r--r--  1 adam adam     125 2007-08-29 18:31 fme.py

Prawa dostępu można wyświetlić za pomocą polecenia ls z parametrem -l, pierwsza kolumna przedstawia typ pliku (pierwszy znak) oraz uprawnienia (pozostałe 9 znaków). Pierwsze 3 znaki (kolejno 2,3 i 4 licząc od prawej strony) to uprawnienia użytkownika, określane w skrócie u od user, kolejne 3 (czyli 5,6,7) to uprawnienia grupy oznaczane g od group, ostatnie trzy to uprawnienia tzw. "reszty świata", oznaczane o od others.
Tak więc w powyższym przykładzie blob jest katalogiem, jego właściciel ma prawo do odczytu i zapisu, natomiast nie posiada prawa do wykonania (rw-), grupa posiada prawo tylko do odczytu (r), reszta świata posiada prawo tylko do odczytu (r). Tapety też jest katalogiem, którego właściciel ma pełnie praw dostępu (rwx), grupa prawo do odczytu i wykonania (r-x), reszta do odczytu i wykonania (r-x).

chmod

Jest to polecenie zmieniające prawa dostępu do plików, składnię ma następującą:

chmod prawa dostępu pliki

Aby skonstruować polecenia należy wybrać klasę użytkowników, którym chcemy zmienić uprawnienia (ugo), dostępna jest dodatkowa klasa a (ang. all - wszyscy) łącząca wszystkie trzy klasy. Następnie wybrać jeden z trzech operatorów: + przydziela prawo, - odbiera prawo, = przypisuje podane prawo. A na koniec podać rodzaj prawa dostępu (rwx).
chmod u+x skrypt.sh

Użytkownik otrzyma prawo do wykonania pliku skrytp.sh.
chmod go-r raport.odt

Grupa i pozostali użytkownicy stracą prawo do odczytu pliku raport.odt.
chmod a=w finanse.ods

Wszystkie klasy użytkowników otrzymają prawo do zapisu pliku finanse.ods, jeżeli któraś z klas posiadała prawo do odczytu i wykonania, zostanie ono odebrane.
chmod u+rwx,g+rwx,o+x trurl.py

Użytkownik i grupa otrzymają pełnię praw dostępu, natomiast reszta jedynie prawo do wykonania pliku trurl.py.

Numeryczne tryby dostępu

Aby uprościć zapis polecenia chmod opracowane zostały numeryczne prawa dostępu. Poszczególnym trybom przypisane zostały określone wartości liczbowe. Wykorzystując zapis binarny, jeżeli dana klasa posiada określone prawo dostępu, stawiana jest 1 jeżeli nie ma stawiane jest 0. Tryb dostępu rwx r-x r-x binarnie zapisany zostanie 111 101 101. Zapis dwójkowy jest jednak niewygodny dlatego przelicza się go na wartości w systemie ósemkowym, zamieniając wartości dla poszczególnych klas. Tak więc w powyższy przykład ósemkowo zapisze się 755, ponieważ 111 to 7 ósemkowo, a 101 to 5. Ta metoda jest dość uciążliwa nawet dla użytkownika posiadającego wprawę w operowaniu różnymi systemami liczbowymi, jest jednak prostszy sposób.

Zarządzanie procesami

Jak zapowiadaliśmy, kontynuujemy sagę na temat konsoli i zaawansowanych technik związanych z niskopoziomową obsługą Linuksa. Dziś poznamy tajniki procesów, dowiemy się jak nimi zarządzać, nadawać im priorytet czy… wręcz zabijać(!)

Na początek anegdotka:

W pubie siedzi grupka informatyków, obok grupka dresiarzy. Drudzy zachowują się agresywnie i podśmiewają się z postury geeków i ich flanelowych wdzianek. Atmosfera gęstnieje, nie wiadomo czy nie dojdzie do awantury. Wtem… dzwoni telefon.
[odbiera informatyk]
- Co??? W ogóle ci nie odpowiada? W ogóle się ciebie nie słucha? Próbowałeś już “nice”? Taak? Nic nie dało..? Ok. Dobra — skilluj go.
[odkłada słuchawkę]
W tym momencie najbardziej napakowany z dresów wstaje i z wielkim podziwem odzywa się do informatyka:
- Szacun.

To tym dowcipnym wstępie przejdźmy od razu do rzeczy.

Podstawy

Na początek warto poznać definicję procesu, oraz kilka innych terminów z nim związanych. Mówiąc najogólniej proces jest wykonywanym programem, który posiada pewien stan:

* nowy - proces właśnie został utworzony
* gotowy - proces znajduje się w pamięci czeka na wykonanie swojego kodu przez procesor
* działający - proces, który aktualnie jest wykonywany przez procesor
* zablokowany - proces oczekujący na przydzielenie danego zasobu
* zakończony - proces kończący działanie

Proces otrzymuje dostęp do zasobów takich jak np.: procesor, pamięć, pliki, urządzenia wejścia - wyjścia. Każdy posiada swój unikalny identyfikator liczbowy PID (ang. Process ID) oraz identyfikator rodzica (PPID - ang. Parent Process ID) czyli procesu który go utworzył. Tak więc uruchomione procesy można przedstawić w formie drzewa, w którego korzeniu znajdować się będzie proces z PID równym jeden - init, uruchamiany jako pierwszy po załadowaniu jądra. Podobnie jak pliki procesy posiadają swoich właścicieli, zazwyczaj są to użytkownicy którzy uruchomili dany program, wyjątkiem jest tu program z ustawionym bitem setuid lub też setgid. Prawa dostępu do zasobów systemu (np. plików w katalogu /dev), użytkownika który uruchomił proces, określają prawa dostępu jakie będzie posiadał proces. Do komunikacji z procesami wykorzystywane są tzw. sygnały. Programy uruchomione są z różnym priorytetem, określanym liczbą nice, przyjmującą wartości od -20 (najwyższy) do 19 (najniższy), domyślna wartość to 0.

fg, bg, jobs

Terminal umożliwia uruchamianie kilku programów naraz, przełączanie się pomiędzy nimi polega na przesuwaniu programu z “pierwszego planu” w “tło”. Tylko pierwszoplanowy proces może odbierać dane od użytkownika. Przesuwanie procesów z tła na pierwszy plan i w drugą stronę porównać można do aktywnego okna które przykrywa, pozostałe, nieaktywne okna.

Aby uruchomić program w tle wystarczy na końcu polecenia dostawić znak & (ang. Ampersand).

$ mpg123 -q plik.mp3&
[1] 638
$

Uruchamiając mpg123 w tle mogę słuchać muzyki mając cały czas dostęp do powłoki. Powłoka w nawiasie kwadratowym podała mi numer zadania (ang. job) - 1, oraz numer PID - 638.

Aby wyświetlić listę uruchomionych w tle zadań, należy użyć polecenia jobs, posiada ono dodatkowy parametr -l podający dodatkowo numer PID danego zadania.

Aby zatrzymać proces pierwszoplanowy należy użyć kombinacji Ctrl + z (w tym przypadku do procesu zostanie wysłany sygnał SIGSTP), aby zatrzymać proces można posłużyć się kombinacją Ctrl + c, przesłany zostanie do procesu sygnał SIGINT .

$ jobs -l
[1]-   638 Running                 mpg123 -q plik.mp3 &
[2]+   878 Stopped (tty output)    mc

W tle uruchomione zostały dwa zadania, mpg123 jest uruchomiony ponieważ do działania nie potrzebuje interakcji z użytkownikiem, mc jest zatrzymany i czeka na dane od użytkownika.

Aby dany proces uczynić pierwszoplanowym, należy posłużyć się poleceniem fg %numer zadania, lub fg %?nazwa polecenia lub fragment nazwy.

$ fg %1
$ fg %mpg

W pierwszym przypadku przeniosłem zadanie na pierwszy plan odwołując się do jego numeru zadania, w drugim odwołując się po fragmencie nazwy.

Polecenie fg %numer zadania, uruchomi zatrzymane w tle zadanie, w przeciwieństwie do polecenia fg, nie przeniesie zadania na pierwszy plan.

$ mpg123 -q plik.mp3
Ctrl + z
[3]+  Stopped                 mpg123 -q plik.mp3
$ bg %3
[3]+ mpg123 -q plik.mp3 &

Na koniec warto zwrócić uwagę na jeden fakt, na ekranie pojawią się dane wysyłane przez program w tle na standardowe wyjście, wyjście błędów, aby tego uniknąć można przekierować strumień do śmietnika np.polecenie > /dev/null

Czy zdarzyło Ci się kiedyś uruchomić jakiś długo trwający proces przez ssh - ale zapomniałeś tego zrobić w screen'ie i musiałeś go przerwać? Jest na to rada:
Należy działający na pierwszym planie proces zatrzymać przez (CTRL+Z), a następnie uruchomić go w tle (bg). Teraz można już "odczepić" proces od naszego terminala poleceniem:

disown -h %numer_zadania

W tym momencie możemy już się spokojnie wylogować a proces nadal działa w tle. Jest jednak pewien minus takiego rozwiązania - niektóre programy po zauważeniu braku standardowego wyjścia i wyjścia błędów mogą się "zbuntować" i w skrajnym przypadku zakończyć się błędem.

ps, pstree

Przedstawione wcześniej polecenie jobs, wyświetlało procesy uruchomione na danym terminalu. Aby wyświetlić szczegółowy spis procesów uruchomionych w systemie można posłużyć się poleceniem ps, uruchomione bez parametrów zadziała tak jak jobs. Pełny spis wszystkich parametrów dostępny jest w podręczniku tego polecenia (man ps), poniżej kilka najciekawszych opcji:

* -e wyświetli każdy proces uruchomiony w systemie
* -l szczegółowy opis
* -f opis szczegółowy, krótszy od -l
* -H pokazuje spis procesów w formie drzewa
* a wyświetla wszystkie procesy
* x wyświetla procesy uruchomione bez terminala
* u podaje nazwę użytkownika który uruchomił proces
* f wyświetla procesy w formie drzewa

Ps przyjmuje parametry w dwóch, nie kompatybilnych ze sobą, formatach: System V (parametry z myślnikiem -), oraz BSD. Wyjście polecenia z parametrami aux będzie wyglądać:

$ ps aux
USER       PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
root         1  0.0  0.1   2952  1852 ?        Ss   10:49   0:01 /sbin/init
adam      5623  0.0  0.6  27892  7100 ?        Ssl  10:51   0:00 /usr/bin/gnome-session
adam      6815  0.2  1.6  39880 16728 ?        S    11:11   0:14 gedit
adam      7105  0.0  0.2   5708  3060 pts/1    Ss   11:16   0:00 bash

Poszczególne kolumny oznaczają:

* USER - nazwa użytkownika, właściciela procesu
* PID - identyfikator procesu
* %CPU - szacowany procent użycia procesora, obliczany poprzez podzielenie czasu użycia procesora przez proces, przez czas uruchomienia
* %MEM - szacowany procent użycia pamięci
* VSZ - ilość użytej pamięci wirtualnej w KB
* RSS - wykorzystana pamięć fizyczna w KB
* TTY - terminal na którym uruchomiono proces
* STAT - stan procesu, D oczekujący na dane z I\O, R działający, S uśpiony, T zatrzymany, X proces martwy(nie powinien być wyświetlany), Z proces zombie
* START - godzina uruchomienia procesu
* TIME - łączny czas zużycia procesora
* COMMAND - polecenie które uruchomiło proces

Polecenie pstree, wyświetla procesy w formie drzewa, posiada parametr -a wyświetlający polecenie które uruchomiło proces.

$ pstree -a
init
  ├─cupsd
  ├─dbus-daemon --system
  ├─gedit
  └─gnome-terminal
      ├─bash
      │   └─man ps
      │       └─pager -s
      ├─bash
      │   └─man ps
      │       └─pager -s
      └─bash
          └─pstree -a

top

Polecenie top umożliwia podgląd uruchomionych procesów w systemie w czasie rzeczywistym. Parametr -u nazwa użytkownika umożliwia podgląd procesów uruchomionych tylko wybranego użytkownika, -pPID pozwala na podgląd procesu o określonym PID, przy czym parametr ten może zostać podany do 20 razy.

$ top
top - 17:38:09 up 43 min,  2 users,  load average: 0.32, 0.17, 0.06
Tasks: 124 total,   1 running, 123 sleeping,   0 stopped,   0 zombie
Cpu(s):  1.5%us,  0.2%sy,  0.0%ni, 98.3%id,  0.0%wa,  0.0%hi,  0.0%si,  0.0%st
Mem:   1026304k total,   560996k used,   465308k free,    42120k buffers
Swap:  1020116k total,        0k used,  1020116k free,   246652k cached

  PID USER      PR  NI  VIRT  RES  SHR S %CPU %MEM    TIME+  COMMAND
 7391 adam      15   0  189m  56m  21m S    3  5.6   0:20.42 firefox-bin
 7517 adam      15   0  2368 1164  876 R    1  0.1   0:00.03 top
 4029 root      13  -2  1744  384  280 S    0  0.0   0:00.76 ipw3945d-2

Aby zamknąć program należy posłużyć się przyciskiem q, niektóre przydatne skróty:

* F lub O zmienia kolejność sortowania
* spacja odświeża ekran
* < ,> zmienia kolejność sortowania, wg. wyświetlanych kolumn
* r zmienia wartość nice procesu
* W zapisuje bieżące ustawienia top do pliku ~/.toprc
* k wysyła sygnał do procesu
*

htop

Htop wyświetla listę procesów w bardziej rozbudowanej graficznie formie, program ten korzysta z biblioteki ncurses, zazwyczaj nie jest domyślnie dostępny.

* kursory - poruszanie się pomiędzy procesami
* F1 - menu pomocy
* F2 - ustawienia
* F3 - wyszukaj proces
* F4 - odwraca sortowanie
* F5 - wyświetla procesy w formie drzewa
* F6 - zmienia kolejność sortowania
* F7 - zmniejsza priorytet wybranego procesu
* F8 - zwiększa priorytet wybranego procesu
* F9 - wysyła sygnał do procesu
* F10 - kończy program

kill

Wysyła sygnały procesom, składnia to kill sygnał PID, domyślny sygnał to SIGTERM (wartość liczbowa: 15), “delikatnie” kończący działanie programu pozwalający zamknąć otwarte pliki i “posprzątać” po swoim działaniu. Mocniejszym w działaniu procesem jest SIGKILL (wartość 9) wymuszający natychmiastowe zakończenie programu, sygnały SIGSTOP oraz SIGCONT odpowiednio zatrzymują i wznawiają wykonanie procesu. Procesowi można wysłać sygnał używając jego nazwy, lub korzystając z wartości liczbowej.

kill -SIGKILL 7496
kill -9 7496

W obu przypadkach zostanie “zabity” proces od PID 7496.

killall

W tym poleceniu moża przesłać sygnał wykorzystując nazwę procesu (można użyć wyrażeń regularnych) np.:

killall mplayer

Zabije wszystkie procesy o nazwie mplayer. Ciekawym parametrem jest -l, wyświetlający wszystkie możliwe sygnały. W niektórych systemach np. Solaris polecenie to zabija wszystkie procesy jakie użytkownik jest w stanie zabić, uruchomione przez roota zakończy działanie systemu.

nohup

Polecenie to związane jest z sygnałem SIGHUP. Historycznie sygnał ten informował o utracie połączenia z terminalem. Obecnie wykorzystywany jest do informowania, że pseudo-terminal na którym uruchomiono program zakończył działanie, przez co programy uruchomione na tym terminalu też są kończone. Proces uruchomiony z poleceniem nohup będzie ignorował ten sygnał.

$ nohup pidgin
nohup: dołączanie wyników do `nohup.out'

Jeżeli wcześniej wyjście programu nie zostało przekierowane do pliku, nohup domyślnie przekieruje je donohup.out.

pidof, pgrep

To dwa małe ale przydatne polecenia, podają one PID polecenia.

$ pidof nautilus
5668
$ pgrep nautilus
5668

Pgrep posiada parametr -l, wyścielający nazwę programu i PID, oraz parametry -u nazwa użytkownika, -G nazwa grupy wyświetlający procesy należące do danego użytkownika lub grupy.
$ kill `pidof mplayer`

W powyższym przykładzie wykorzystałem pidof do zamknięcia mplayera nieznając jego numeru PID.

renice

Polecenie to zmienia priorytet procesu, najwyższy priorytet to -20, najniższy to 19. Priorytety zmniejszać może tylko root.

$ renice 19 `pidof top`
12344: old priority 0, new priority 19

Parametr -u nazwa użytkownika zmieni priorytet wszystkim procesom których właścicielem jest podany użytkownik, -g nazwa grupy podana grupa.
$ renice 5 -u adam
1000: old priority 2, new priority 5
Dodaj nową wypowiedź
lub Zaloguj się jako użytkownik serwisu Wikidot.com
(nie będzie opublikowany)
- +
O ile nie zaznaczono inaczej, treść tej strony objęta jest licencją Creative Commons Attribution-NonCommercial 3.0 License