courses:unix:lab_processes

  • man textutils (jeżeli nie jest dostępne w systemie, spróbuj tutaj)
    • interesują nas: head/tail, cat/tac, wc, cut, sort, tr, uniq, seq, xargs, expr
  • man grep i/lub grep w Linux Wiki

1. Zadania

Zadania (ang. jobs) to programy uruchamiane w sesji przez powłokę.

  • usypianie (ang. suspend) zadań Ctrl+Z ,
  • spis zadań jobs,
  • przełączanie zadań fg,
  • praca w tle bg,
  • usuwanie zadań kill,
  • równoległe uruchamianie zadań (ampersand, czyli &),

Powyższe polecenia są wbudowane w shell i są opisane w manualu shella!

2. 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

3. 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
  • aby wyświetlić procesy pracujące w danej sesji należy wpisać ps -t`tty`

4. Narzędzia operujące na tekście

  • GNU Coreutils - zestaw podstawowych narzędzi GNU
    • Interesują nas: head/tail, cat/tac, wc, cut, sort, tr, uniq, seq, xargs, expr
    • Ważny jest też: sed (na tym etapie jest dla zaawansowanych; przejdziemy do niego na dalszych zajęciach)
    • Każde polecenie ma swojego manuala. Warto też przejrzeć: man textutils (większość w.w. poleceń była kiedyś w pakiecie GNU textutils; jeżeli ten manual nie jest dostępny w systemie, spróbuj tutaj)
  • 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)

5. 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)

Powłoka pozwala na przekierowanie strumieni, w sh znakami:

[proces]  > [plik]  # przekierowanie stdout do pliku (NADpisanie)
[proces] 2> [plik]  # przekierowanie strumienia 2 (stderr) do pliku (NADpisanie)
[proces] >> [plik]  # przekierowanie stdout do pliku (DOpisanie)
[proces]  < [plik]  # przekierowanie stdin z pliku 
 
# Przykłady:
ps > foo
w 2> bar
ls > foo 2> bar

Przydatny przy przekierowaniu stderr (2) jest /dev/null. Pozwala na pozbycie się danych.

6. 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łady:

ls | wc
ps | sort
 
# Bardziej złożone filtry:
ps aux | grep bash | wc
cut -d ':' -f 5 /etc/passwd | grep -i daemon | wc -l

Przypomnienie z poprzednich zajęć - podstawianie wyników poleceń w linii poleceń jest realizowane przez odwrotny apostrof (`), na przykład:

echo "To jest system" `uname` "na maszynie " `hostname`
# Wyświetli: To jest system Linux na maszynie spk-ssh

7. Sygnał HUP i polecenie nohup

Przy zamykaniu powłoki do wszystkich procesów z niej uruchomionych wysyłany jest sygnał HangUp (HUP).
Aby pozostawić jakieś polecenie pracujące w tle po zamknięciu shella, należy je uruchomić za pomocą nohup:

nohup polecenie

I. Zadania

Ćwiczenie wykonywać w GNU Bash.

  1. uruchomić lynx www.uj.edu.pl
  2. nacisnąć Ctrl+Z,
  3. uruchomić lynx www.agh.edu.pl
  4. nacisnąć Ctrl+Z,
  5. napisać jobs,
  6. uruchomić lynx www.pk.edu.pl
  7. nacisnąć Ctrl+Z,
  8. napisać jobs,
  9. napisać fg %2,
  10. nacisnąć Ctrl+Z,
  11. itd….
  12. napisać kill %3
  13. napisać jobs,
  14. itd….

Jeżeli zadanie nie znika po kill, należy użyć opcji -9.

Podobne ćwiczenie powtórzyć dla innych programów, np. less, mc, itp.

II. Procesy

  1. Otworzyć 3 sesje (zalogować się 3 razy, np. przez SSH)
  2. Sprawdzić przy pomocy ps pracujące procesy:
    • w tej samej sesji,
    • tylko swoje procesy,
    • wszystkie procesy w systemie,
  3. Przetestować działanie znanych opcji ps.
  4. Przy pomocy kill usunąć z sesji B procesy pracujące w sesji A.
  5. Jak usunąć login shell?
  6. Oglądnąć przy pomocy kill -l spis wszystkich sygnałów.
  7. Uruchomić procesy z podwyższoną wartością nice.
  8. Zmienić wartość nice pracującego już procesu.
  9. Jak wyświetlić wartość nice procesu?

III. Przekazywanie wyników pracy do plików

  1. Przekierować wyniki pracy różnych poleceń do plików, np. dla ps ls finger who. Przeglądnąć powstałe pliki.
  2. Porównać działanie > i >> Na przykład:
    ps
    ps > plik1
    more plik1
    ls > plik2
    more plik2
    ps >> plik2
    more plik2
  3. 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 pliku posortowaną zawartość dopisaną do oryginalnej, nie posortowanej!

IV. Narzędzia operujące na tekście

  1. Mając spis zalogowanych użytkowników:
    who > spis
  2. Posortować go alfabetycznie:
    sort spis > spis.alf
  3. 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
  4. Wybrać z tego spisu (przy pomocy grep) użytkowników, których login zawiera literę k
  5. Przećwiczyć inne polecenia z TextUtils.
  6. Powtórzyć ćwiczenia dla innych danych wejściowych, np. spisu plików, procesów, itp.
  7. Skąd są czytane dane jeżeli nie poda się nazwy plików w poleceniach typu grep, tail?
  8. 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)).

V. Komunikacja między procesami

Należy ponownie wykonać ćwiczenia 1-4 z sekcji IV bez użycia plików pośrednich, tylko odpowiednio łączyć stdin z stdout, np.

who | sort | grep 'k' | 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
who | awk '{print $1;}' | sort | uniq

Proszę przeprowadzić jak najwięcej własnych eksperymentów z wykorzystaniem wszystkich znanych poleceń!

VI. Zadanie dodatkowe

Używając wyłącznie poleceń grep, cut, tr, head, tail, na podstawie strony https://nbp.pl/statystyka-i-sprawozdawczosc/kursy/tabela-a/ 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,1251
dolar amerykański 	 	1 USD	 	3,8746
dolar australijski	1 AUD	 	2,9716	 
dolar Hongkongu 	 	1 HKD	 	0,4988
dolar kanadyjski 	 	1 CAD	 	3,0793
dolar nowozelandzki 	 	1 NZD	 	2,7296
dolar singapurski 	 	1 SGD	 	2,8851
euro 	 	1 EUR	 	4,6073
forint (Węgry) 	 	100 HUF	 	1,2557
frank szwajcarski 	 	1 CHF	 	4,1704
funt szterling 	 	1 GBP	 	5,3375
hrywna (Ukraina) 	 	1 UAH	 	0,1398
jen (Japonia) 	 	100 JPY	 	3,5653
korona czeska 	 	1 CZK	 	0,1759
korona duńska 	 	1 DKK	 	0,6196
korona islandzka 	 	100 ISK	 	3,0963
korona norweska 	 	1 NOK	 	0,4520
korona szwedzka 	 	1 SEK	 	0,4524
kuna (Chorwacja) 	 	1 HRK	 	0,6083
lej rumuński 	 	1 RON	 	0,9423
lew (Bułgaria) 	 	1 BGN	 	2,3557
lira turecka 	 	1 TRY	 	0,4882
nowy izraelski szekel 	 	1 ILS	 	1,1747
peso chilijskie 	 	100 CLP	 	0,5405
peso filipińskie 	 	1 PHP	 	0,0796
peso meksykańskie 	 	1 MXN	 	0,1862
rand (Republika Południowej Afryki) 	 	1 ZAR	 	0,2596
real (Brazylia) 	 	1 BRL	 	0,7036
ringgit (Malezja) 	 	1 MYR	 	0,9399
rubel rosyjski 	 	1 RUB	 	0,0509
rupia indonezyjska 	 	10000 IDR	 	2,6916
rupia indyjska 	 	100 INR	 	5,3464
won południowokoreański 	 	100 KRW	 	0,3427
yuan renminbi (Chiny) 	 	1 CNY	 	0,5948
SDR (MFW) 	 	1 XDR	 	5,5207

Uwaga! Od 2023 roku strona NBP została przebudowana i aktualnie zawiera zabezpieczenia przeciw pobieraniu zawartości przez boty. Nie ma prostego shellowego sposobu aby pobrać jej zawartość (nie zadziała ani curl ani ncat ani inne narzędzia shellowe). Dlatego stronę należy otworzyć w przeglądarce, zapisać jej kod HTML na dysku a następnie rozpocząć filtr od cat tabela-a.html

  • courses/unix/lab_processes.txt
  • Last modified: 11 months ago
  • by kkt