|
|
pl:dydaktyka:unix:lab_zadania_i_procesy [2013/12/30 14:05] ikaf [Procesy] |
pl:dydaktyka:unix:lab_zadania_i_procesy [2019/06/27 15:50] |
====== Praca z procesami i zadaniami ====== | |
<code> | |
- Bill, wyrzuć śmieci. | |
- Nie chce mi się. | |
- sudo Bill, wyrzuć śmieci. | |
- Już idę... | |
/* nadesłał: Maciej Urbanek, IS 2012 */ | |
</code> | |
| |
===== DO PRZYGOTOWANIA ===== | |
| |
Samodzielnie należy przed tym laboratorium przygotować: | |
| |
* praca z wymienionymi narzędziami //textutils// | |
* praca z **grep** | |
| |
| |
===== WPROWADZENIE ===== | |
| |
| |
| |
==== Zadania ==== | |
Zadania (ang. //jobs//) to programy uruchamiane w sesji przez powłokę. | |
| |
* usypianie (ang. //suspend)// zadań <key>C-z</key> , | |
* 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'' | |
| |
| |
<code> | |
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 */ | |
</code> | |
==== 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ąć <key>C-z</key>, | |
- uruchomić ''lynx www.uj.edu.pl'' | |
- nacisnąć <key>C-z</key>, | |
- napisać ''jobs'', | |
- uruchomić ''lynx www.pk.edu.pl'' | |
- nacisnąć <key>C-z</key>, | |
- napisać ''jobs'', | |
- napisać ''fg %2'', | |
- nacisnąć <key>C-z</key>, | |
- 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: | |
<code> | |
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 | |
</code> | |
Konstrukcję filtru można rozpocząć poleceniem: | |
<code> | |
echo -e 'GET /home.aspx?f=/kursy/kursya.html HTTP/1.0\n\n' | nc nbp.pl 80 | |
</code> | |
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 | |
| |