====== 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