====== Praca z procesami i zadaniami ======
- Bill, wyrzuć śmieci.
- Nie chce mi się.
- sudo Bill, wyrzuć śmieci.
- Już idę...
/* nadesłał: Maciej Urbanek, IS 2012 */
===== DO PRZYGOTOWANIA =====
Samodzielnie należy przed tym laboratorium przygotować:
* praca z wymienionymi narzędziami //[[http://manpages.ubuntu.com/manpages/precise/pl/man1/textutils.1.html|textutils]]//
* praca z grep ([[http://pl.linux.wikia.com/wiki/Grep|linux wiki]] + manual)
===== WPROWADZENIE =====
==== Zadania ====
Zadania (ang. //jobs//) to programy uruchamiane w sesji przez powłokę.
* usypianie (ang. //suspend)// zadań C-z ,
* spis zadań **jobs**,
* przełączanie zadań **fg**,
* praca w tle **bg**,
* usuwanie zadań **kill**,
* równoległe uruchamianie zadań (ampersand, czyli ''&''),
* uwaga, w.w. polecenia są poleceniami wbudowanymi w shell i są opisane w manualu shella!
==== Procesy ====
* identyfikator PID i jego znaczenie
* wyświetlanie listy procesów **ps**, ''ps -A'' (Sun), ''ps -ax'' (Linux), a także ''ps -u user'', ''ps aux|grep user''
* zmniejszanie priorytetu **nice**,
* usuwanie procesów **kill**, ''kill -9''
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.
/* nadesłał: Filip Szukała, IS 2013 */
==== GNU coreutils i inne ====
Jest to zestaw podstawowych narzędzi GNU operujących na tekście, w tym:
* **tail**/**head**
* **cat**/**tac**
* **wc**
* **cut**
* **sort**
* **tr**
* **uniq**
* **seq**
* **xargs**
* **expr**
* **sed** (dla zainteresowanych)
Proszę przeglądnąć manule do w.w.!
Uwaga: warto też poczytać ''man textutils'' (większość w.w. poleceń była kiedyś w pakiecie //GNU textutils//).
==== Grep ====
Program **grep** służy do wyszukiwania zadanych wyrażeniami regularnymi wzorców w tekście.
grep napis [plik]
Przydatne opcje:
* ''-i'' ignoruje wielkość znaków
* ''-v'' odwraca działanie **grep** (czyli wyświetl wszystkie linie, które NIE zawierają napisu).
==== Strumienie ====
Każdy proces pracujący w środowisku Unix komunikuje się z otoczeniem m.in. przez strumienie. Domyślnie są otwierane 3:
* 0 //standard input// (stdin)
* 1 //standard output// (stdout)
* 2 //standard error// (output) (stderr)
==== Przekierowania strumieni ====
Powłoka pozwala na przekierowanie strumieni, w sh znakami:
* ''>'' przekierowanie stdout do pliku (nadpisanie)
* ''>''''>'' jak wyżej, dopisanie
* ''<'' przekierowanie stdin z pliku
[n] > plik
[n] >> plik
< plik
Przykłady:
ps > foo
w 2 > bar
ls >foo 2>bar
Przydatny przy przekierowaniu stderr (2) jest ''/dev/null''. Pozwala na pozbycie się danych.
==== Komunikacja między procesami ====
Powłoka pozwala na realizowanie komunikacji między procesami przez łączenie strumieni, uruchamiane przez znak ''|'' (ang. //pipe//).
Powoduje on połącznie stdout zadania 1 z stdin zadania 2. Przykład:
ls | wc
ps | sort
Pozwala to na tworzenie dowolnie złożonych filtrów:
ps -A | grep tcsh | wc
cut -d ':' -f 5 /etc/passwd | grep -i jacek | wc -l
==== Podstawianie wyników pracy poleceń ====
Podstawianie wyników poleceń w linii pleceń jest realizowane przez odwrotny apostrof (klawisz tyldy, nad tabulatorem), na przykład:
$ echo "To jest system" `uname` "na maszynie "`hostname`
To jest system Linux na maszynie enterprise
===== ĆWICZENIA =====
==== - Zadania ====
Ćwiczenie wykonywać w GNU Bash.
- uruchomić ''lynx www.agh.edu.pl''
- nacisnąć C-z,
- uruchomić ''lynx www.uj.edu.pl''
- nacisnąć C-z,
- napisać ''jobs'',
- uruchomić ''lynx www.pk.edu.pl''
- nacisnąć C-z,
- napisać ''jobs'',
- napisać ''fg %2'',
- nacisnąć C-z,
- itd....
- napisać ''kill %3''
- napisać ''jobs'',
- itd....
O ile zadanie nie znika po ''kill'' trzeba uzyc opcji ''-9''.
Podobne ćwiczenie powtórzyć dla innych programów, np. **vi** (sprawdzić czy edytor nie uruchamia dodatkowej powłoki zamiast suspend), **less**, **mc**, itp.
==== - Procesy ====
- Otworzyć 3 sesje (zalogować się 3 razy, np. przez SSH), w miarę możliwości sprawdzić różnice w systemach Linux, Solaris (np. serwer //student//).
- Sprawdzić przy pomocy ps pracujące procesy: w tej samej sesji, tylko swoje procesy, wszystkie procesy w systemie.
- Przetestować działanie znanych opcji **ps**, jakie są różnice pomiędzy Linux a Solaris?
- Przy pomocy kill usunąć z sesji B procesy pracujące w sesji A.
- Jak usunąć login shell?
- Oglądnąć przy pomocy ''kill -l'' spis wszystkich sygnałów.
- Uruchomić procesy z podwyższoną wartością //nice//.
- Zmienić wartość //nice// pracującego już procesu.
- Jak wyświetlić wartość //nice// procesu?
==== - Procesy a Zadania ====
* każde uruchomienie programu w Unixie tworzy //proces//
* zadania, są mechanizmem dostarczanym przez shell dla ułatwienia obsługi uruchamianych z danej sesji (instancji shella) procesów
* żeby wyświetlić PID procesów którym odpowiadają zadania należy po uruchomieniu kilku zadań napisać ''jobs -l''
* każda sesja jest obsługiwana przez plik urządzenia //pseudoterminala//
* aby wyświetlić w.w. plik należy wpisać ''tty'' (patrz Lab1)
* aby wyświetlić procesy pracyjące w danej sesji należy wpisać ''ps -t`tty`''
==== - Przekazywanie wyników pracy do plików ====
* Przekierować wyniki pracy różnych poleceń do plików, np. dla **ps ls finger who**. Przeglądnąć powstałe pliki.
* Porównać działanie ''>'' i ''>''''>'' Na przykład:
ps
ps > plik1
more plik1
ls > plik2
more plik2
ps >> plik2
more plik2
* Przekierować wyjście błędów, np:
kill 1
kill 1 1>a 2>b
Uwaga! przekierowania są inicjalizowane przez shell //przed// uruchomieniem polecenia!
Dlatego też, jeżeli mamy plik do posortowania, np:
who >plik
i wykonamy:
sort plik >plik
otrzymamy //pusty// plik, gdyż jego zawartość zostanie skrócona do zera //przed// posortowaniem.
A uruchamiając:
sort plik >>plik
otrzymamy w ''plik''u posortowaną zawartość //dopisaną// do oryginalnej, nie posortowanej!
==== - GNU textutils i inne ====
* Mając spis zalogowanych użytkowników:
who > spis
* Posortować go alfabetycznie:
sort spis > spis.alf
* Wyświetlić początek i koniec spisu (Ile linii jest wyświetlanych? Jak zadać tę liczbę?):
head spis.alf
head spis.alf >spis.alf.pocz
tail spis.alf
tail spis.alf >spis.alf.kon
* Wybrać z tego spisu (przy pomocy **grep**) użytkowników zalogowanych z komputerów w domenie ''ia.agh.edu.pl''
* Przećwiczyć inne polecenia z TextUtils.
* Powtórzyć ćwiczenia dla innych danych wejściowych, np. spisu plików, procesów, itp.
* Skąd są czytane dane jeżeli nie poda się nazwy plików w poleceniach typu **grep**, **tail**?
* Co to jest znak końca pliku i jak się go wysyła "ręcznie"?
* Po laboratorium uzupełnić wiadomości nt. wyrażeń regularnych (//grep(1)//).
==== - Komunikacja między procesami ====
Należy ponownie wykonać ćwiczenia z p. 4.4 nie używając plików pośrednich, tylko odpowiednio łączyć //stdin// z //stdout//, np.
who | sort | grep 'ia.agh.edu.pl' | head
Inne przykłady:
ls | wc
ps | sort
ps -A | grep tcsh
ps | head -n 1
who | wc
who | sort
nice du -sk /usr/local/* 2>/dev/null | sort -rn | head
Proszę przeprowadzić jak najwięcej własnych eksperymentów z wykorzystaniem wszystkich znanych poleceń!
[[lab_pliki_i_polecenia#varia|Przykład dłuższego filtru]].
===== Zadanie dodatkowe =====
Używając wyłącznie poleceń **grep, cut, tr, head, tail**, na podstawie strony [[http://nbp.pl/home.aspx?f=/kursy/kursya.html]] stworzyć filtr generujący tekstową tabelę kursów walut. \\
Przykładowy wynik końcowy może wyglądać następująco:
bat (Tajlandia) 1 THB 0,0895
dolar amerykański 1 USD 2,8953
dolar australijski 1 AUD 2,6376
dolar Hongkongu 1 HKD 0,3730
dolar kanadyjski 1 CAD 2,8452
dolar nowozelandzki 1 NZD 2,0405
dolar singapurski 1 SGD 2,0657
euro 1 EUR 3,9136
forint (Węgry) 100 HUF 1,4782
frank szwajcarski 1 CHF 2,7316
funt szterling 1 GBP 4,3350
hrywna (Ukraina) 1 UAH 0,3633
jen (Japonia) 100 JPY 3,1991
korona czeska 1 CZK 0,1539
korona duńska 1 DKK 0,5260
korona estońska 1 EEK 0,2501
korona islandzka 100 ISK 2,2784
korona norweska 1 NOK 0,4872
korona szwedzka 1 SEK 0,4020
kuna chorwacka 1 HRK 0,5392
lej rumuński 1 RON 0,9572
lew bułgarski 1 BGN 2,0010
lira turecka 1 TRY 1,8767
lit litewski 1 LTL 1,1334
łat łotewski 1 LVL 5,5281
peso filipińskie 1 PHP 0,0634
peso meksykańskie 1 MXN 0,2295
rand (RPA) 1 ZAR 0,3933
real brazylijski 1 BRL 1,6079
ringgit malezyjski 1 MYR 0,8722
rubel rosyjski 1 RUB 0,0987
rupia (Indonezja) 10000 IDR 3,1798
won (Korea Płd.) 100 KRW 0,2550
yuan renminbi (Chiny) 1 CNY 0,4242
SDR (MFW) 1 XDR 4,4149
Konstrukcję filtru można rozpocząć poleceniem:
echo -e 'GET /home.aspx?f=/kursy/kursya.html HTTP/1.0\n\n' | nc nbp.pl 80
które umożliwia wyświetlenie zawartości strony.
===== Jeśli chcesz wiedzieć więcej =====
* Brad Yoes, //[[http://www.ibm.com/developerworks/aix/library/au-unixtext/index.html?cmp=dw&cpb=dwaix&ct=dwnew&cr=dwnen&ccy=zz&csr=032212|Introduction to text manipulation on UNIX-based systems]]//, IBM dW, 4 Mar 2012.
* Zobacz też na [[:pl:dydaktyka:unix:lab_skrypty#jesli_chcesz_wiedziec_wiecej|analogiczną pozycję w następnym lab]].
===== VARIA =====
Przy zamykaniu powłoki do wszystkich procesów z niej uruchomionych wysyłany jest sygnał //HangUp// (''HUP'').
Aby pozostawić jakieś polecenie pracujące w tel po zamknięciu shella, należy je uruchomić:
nohup polecenie