polecenia zarządzania procesami i filtry

Polecenia:

*Polecenie ps generuje liste wszystkich aktywnych procesow w systemie, ich stan, rozmiar, nazwe oraz właściciela. Istnieje bardzo dużo opcji tego polecenia, najwazniejsze opisze. Najczesciej ustawianym parametrem polecenia ps jest -auxww. Ten parametr wyswietla wszystkie procesy (bez wzgledu na to, czy kontroluja one terminal), wlasciciala kazdego procesu oraz wszystkie parametry procesu.

-a - wyswietla wszystkie procesy posiadajace terminal kontrolny, nie tylko bieżące procesy uzytkowników.
-r - wyswietla tylko pracujace procesy.
-x - wyswietla procesy nie posiadajace terminala kontrolnego.
-u - wyswietla wlasciciali procesow.
-f - wyswietla powiazania miedzy procesami - format drzewiasty.
-l - generuje liste w dlugim formacie.
-w - wyswietla parametry lini polecen procesu (do polowy linii).
-ww - wyswietla wszystkie parametry lini polecen procesu niezaleznie od dlugosci.
-j - format prac: pgid sid.
-s - format sygnalu.
-m - wyswietla informacje o pamieci.
-S - dodaj czas cpu potomka i bledy stron.
-h - bez naglówka.
-n - wyjscie numeryczne dla USER i WCHAN.
-txx - tylko procesy z kontrolujacym tty XX; dla xx mozesz uzyc zarówno nazwy           urzadzenia z "/dev", jak i tej nazwy z dopuszczalnym od?upaniem tty lub cu. Jest           to odwrócona heurystyka, której ps uzywa do wydrukowania skróconych nazw           tty w polu TT, np. ps -t1.

W pierwszej lini znajduja sie naglowki informacyjne o znaczeniu kolejnych kolumn wydruku:

USER - kto jest wlascicielem danego procesu.
PID - numer identyfikacyjny procesu.
%CPU - procentowe wykozystanie procesora.
%MEM - procentowe wykazystanie pamieci przez proces.
VSZ - wielkosc pamieci wirtualnej przydzielonej procesowi.
RSS - wielkosc rzeczywistej pamieci wykorzystywanej przez proces.
TTY - terminal kontrolny procesu. ? w tej kolumnie oznacza, ze proces nie jest            polaczony z zadnym terminalem kontrolnym.
STAT - stan prosesu:
   S - proces jest uspiony. Wszystkie procesy, ktore sa gotowe do uruchomienia (lecz          procesor jest zajety czyms innym) zostana uspione.
   R - proces jest aktualnie wykonywany.
   D - proces jest uspiony, oczekuje na operacje ( zazwyczaj I/O ).
   T - proces jest debuggowany lub zostal zatrzymany.
   Z - zombie. Oznacza, ze albo proces macierzysty nie potwierdzil smierci procesu          potomnego lub proces macierzysty zostal niewlasciwie zabity i dopukie nie zostanie          kompletnie zabity, proces init nie bedzie mogl kozystac z procesu potomnego.
START - czas lub data rozpoczecia procesu.
TIME - przedzial czasu wykorzystany przez CPU.
COMMAND - nazwa procesu oraz jego parametry.

*Aby zabic jakis proces nalezy posluzyc sie programem kill. Generalnym przeznaczeniem tego programu jest wyslanie sygnalow do uruchomionych procesow. Skladnia polecenia jest nastepujaca (gdzie -n okresla numer sygnalu):

kill -n PID lub kill -v nazwa_procesu

Najwazniejsze sygnaly to:
-1 - (hang up) zawies.
-9 - (kill) zabij.
-15 - wstrzymaj proces. 
-v nazwa_procesu - zabije proces po podaniu jego nazwy
Jesli wydamy polecenie kill PID (PID mozemy odczytac z ps lub top ) to do procesu zostanie wyslany sygnal -15.

*Funkcja wait wstrzymuje proces wywolujacy do momentu, az jeden z procesow potomnych przestanie dzialac. Jezeli zakonczony potomek juz jest, to funkcja wraca natychmiast.
Implementacja funkcji wait jest funkcja systemowa sys_wait4, Funkcje ta wywoluje inna funkcja systemowa - sys_waitpid, a ta zas funkcja sys_wait.
Parametrem funkcji wait jest wskaznik do zmiennej typu int. Wywolanie wait(s) odpowiada wywolaniu sys_wait4(-1,s,0,NULL). Pod adres s funkcja ma wpisac przyczyne zakonczenia procesu.

 
Procesy brane pod uwage
Funkcja wait poszukujac procesu potomnego, ktory przestal dzialac rozpatruje procesy ZOMBIE i STOPPED.
ZOMBIE
Proces moze osiagnac ten stan na dwa sposoby. Pierwszy z nich to wywolanie funkcji exit.Jedna z czynnosci wykonywanych w tej funkcji jest zapamietanie argumentu (czyli kodu wyjscia) w polu exit_code struktury task_structodpowiadajacej konczacemu sie procesowi. Scislej rzecz biorac zapamietywane jest 8 najmlodszych bitow argumentu przesunietych o osiem pozycji w lewo.
Dla wielu sygnalow czynnoscia domyslna jest zakonczenie procesu. Jesli proces nie zmieni obslugi takiego sygnalu i otrzyma go, to wtedy rowniez przechodzi w stan ZOMBIE, o czym mozemy sie przekonac analizujac funkcje systemowado_signal, Do pola exit_code jest wtedy wpisywany numer sygnalu (ewentualnie ze znacznikiem pamieci), ktory przyniosl procesowi smierc. Numer ten nie jest przesuwany tak jak argument funkcji exit.
Wspomniany znacznik pamieci to siodmy bit liczac od zera. Jest ustawiany, jesli konczacy sie proces generuje plik core, czyli zrzut pamieci wewnetrznej. Dzieje sie tak przy standardowej obsludze sygnalow SIGQUIT,SIGILL,SIGTRAPSIGABRTSIGFPE i SIGSEGV (dotyczy dostarczonego Linuxa 2.0, Stevens podaje jeszcze inne sygnaly dla systemow 4.3BSD i V).
STOPPED
Proces przechodzi w stan STOPPED po otrzymaniu sygnalu SIGSTOPSIGTSTPSIGTTINSIGTTOU (2 ostatnie nie wystepuja w systemie V). Uprzednio numer sygnalu, ktory zatrzymal proces jest wpisywany do pola exit_code. Ojciec przy przegladaniu swoich synow w funkcji wait w przypadku procesu STOPPED sprawdza, czy w tym polu jest zero. Jesli nie, to wait zwraca identyfikator znalezionego procesu wczesniej wyzerowawszy to pole0. Jesli tak, to znaczy, ze ojciec juz sie dowiedzial o zatrzymaniu procesu potomnego i nie ma sensu informowac go o tym powtornie. Wtedy przeszukiwanie jest kontynuowane.
*W tym wypadku z pomocą przychodzi nam polecenie nohup, którego zadaniem jest utrzymanie procesu przy życiu, nawet po wylogowani się użytkownika. Czyli jest to dokładnie to czego szukamy. Jak powinno wyglądać wywołanie?
$ nohup sh dowolnySkrypt.sh &
[1] 8879
$ nohup: zignorowanie wejścia i dołączenie wyników do `nohup.out'

 

Tym sposobem nasz dowolnySkrypt.sh będzie działał w tle systemu jako demon. Powyższy output omówi nam również, że logi z programu w postaci treści wyrzucanych na strumień standardowego wyjścia, będą zapisywane do pliku nohump.out. Oczywiście możemy to dowolnie modyfikować i zapisywać logi czy to do innego pliku, czy zupełnie je zignorować przekierowując je na urządzenie /dev/null. 

 
*Polecenie sleep opóźnia działanie wybranych akcji (np. przerwa pomiędzy działaniem poszczególnych poleceń w skrypcie). 

Polecenie nie posiada żadnych opcji, poza dwoma standardowymi: --help, --version. Składnia polecenia wygląda następująco:

$ sleep liczba[suffix]

Gdzie:

  • liczba - liczba sekund opóźnienia. Liczba ta może być całkowitą, bądź rzeczywistą wartością.
  • suffix - precyzowanie w jakich jednostkach czasu ma być określona pauza (podajemy bez nawiasów kwadratowych), dostępne:
    • s - sekunda, standardowo, nawet bez podawania sufiksu
    • m - minuta
    • h - godzina
    • d - dzień

Jeśli podamy w poleceniu 2 liczby, to łączny czas opóźnienia będzie sumą 2 liczb. Poniższe rysunki pokazują użycie.

Polecenie sleep
Rys 1. Pauza na 2 sekundy.



Polecenie sleep
Rys 2. Pauza na 3 sekundy.



Polecenie sleep
Rys 3. Pauza na 2 minuty.


Jak widać na rysunku 2, liczby można łączyć, i ich suma to będzie łączny czas pauzy. Po skończeniu się czasu przerwy terminal wyświetli nową linię i polecenia będzie można wpisywać dalej.

* nice – komenda systemu Unix, służąca do uruchamiania procesów z określonym priorytetem.

Opis działania:

Komenda ustala priorytet procesu w algorytmie szeregowania, zgodnie z zasadą, że procesowi o większym priorytecie zostanie przyznane więcej czasu procesora niż procesowi o mniejszym priorytecie. Priorytet określa się parametrem zwanym niceness, będącym liczbą całkowitą z przedziału -20 (najwyższy priorytet) do 19 (najniższy priorytet). Tylko użytkownik o uprawnieniach superusera może używać ujemnych wartości parametru niceness, ale w Linuxie poprzez edycję pliku /etc/security/limits.conf, można to umożliwić innym użytkownikom i grupom[1]. Procesy uruchamiane bez użycia komendy nice mają domyślnie priorytetu równy 0, ale administrator systemu może to zmienić.

Dokładny matematyczny efekt ustawienia danej wartości niceness dla procesu zależy od szczegółów działania algorytmu szeregowania w danej implementacji systemu. Zwykle algorytmy szeregowania posiadają różne heurystyki, np. do faworyzowania procesów ograniczonych przez operacje wejścia/wyjścia nad procesami ograniczonymi przez jednostkę centralną. Dla przykładu, gdy dwa identyczne procesy są uruchomione równolegle na jednordzeniowym systemie, przydział czasu procesora do każdego z nich będzie proporcjonalny do 20-p, gdzie p jest wartością priorytetu procesu. Dlatego proces uruchomiony z wartością niceness równą 15 otrzyma \tfrac{1}{4} czasu procesora przydzielonego procesowi o normalnym priorytecie, zgodnie ze wzorem \tfrac{20-15}{20-0}=\tfrac{1}{4}. Z drugiej strony w algorytmie szeregowania zaimplementowanym w BSD 4.x, stosunek dla tego samego czasu wyniesie \tfrac{1}{10}.

Powiązany program renice może być użyty do zmiany priorytetu procesu który jest już uruchomiony. Linux posiada także program ionice, używany do zmiany priorytetu procesów na podstawie operacji wejścia/wyjścia.

Składnia wywołania:

nice [opcje...] [komenda [argumenty]]

		

Opcje:

  • --help
    • Wyświetla informację o stosowaniu programu i dostępnych opcjach, kończy działanie.
  • -n adjustment, -adjustment, --adjustment=adjustment
    • wartość będąca liczbą całkowitą z przedziału -20 (najwyższy priorytet) do 19 (najniższy priorytet). Wartości ujemne, powodujące zwiększenie priotytetu, mogą być używane tylko przez użytkowników uprzywilejowanych. Jeśli nie zostanie podana żadna wartość, domyślnie zostanie ona ustawiona na 10.
  • --version
    • Wyświetla numer wersji programu i kończy działanie.
*O większości poleceń shella można myśleć jako o filtrach, tak jak przedstawiono to na rysunku poniżej:

 Polecenie ma jedno wejście nazywane wejściem standardowym (standard input skrót stdin), za pomocą którego przyjmowana jest informacja wejściowa znak po znaku. Wyjścia są dwa: standardowe wyjście podstawowe (standard output, skrót stdout) oraz standardowe wyjście błędów  (standard error skrót stderr). Każde polecenie filtruje dane ze standardowego wejścia, przetwarza je w specyficzny sposób, i przekazuje na standardowe wyjście. Domyślnym strumieniem danych wejściowych jest klawiatura. Natomiast dane wyjściowe i komunikaty o  błędach są przekazywane na ekran. Trzy liczby które widzimy na rysunku 0 ,  1 , 2 są zarezerwowane i odpowiadają trzem plikom które są zawsze uruchamiane w momencie egzekucji polecenia:

 

stdin -  strumień danych z klawiatury terminale czyli dane wejściowe → 0

stdout – strumień danych wysyłany na ekran terminala czyli dane wyjściowe → 1

stderr - strumień znaków informujących o błędach → 2

 

Które z poleceń Linuxa możemy zaliczyć do filtrów ? Czym jest filtr ? Jest on poleceniem, które wykonuje pewno działanie na plikach zawierających tekst. Rezultat tego działania , który jest także tekstem, wyświetlany jest na ekranie (chociaż nie tylko). Powiązanie między sobą wielu filtrów (czyli jednoczesna egzekucja kilku poleceń) jest możliwa dzięki użyciu metody zwanej przekierowaniem lub innej metody nazywanej „potokiem” (patrz rozdział potoki).

 Jako filtry traktować będziemy polecenia, które:

 podlegają mechanizmowi wejścia/wyjścia standardowego

 pobierają strumień danych zawsze z wejścia standardowego, przetwarzają dane i wysyłają je na wyjście standardowe, natomiast komunikaty o błędach zostają przez polecenie przekierowane do wyjścia błędów

 oczekują na wejście prostego strumienia znaków i ten strumień znaków po przetworzeniu wysyłają na standardowe wyjście.

 

Z tej definicji wynika, że polecenie   who cal czy  ls nie są filtrami. Z punktu widzenia pracy użytkownika Linuxa, filtry służą przede wszystkim do operowania na plikach testowych i w połączeniu z mechanizmem potoków tworzą niezwykle wydajne a zarazem proste narzędzie.

Proste filtry :
*cat 
Polecenie cat służy do wysłania wybranego pliku (lub kilku plików) na standardowe 
wyjście. Stanowi dobre narzędzie do rozpoczęcia przetwarzania strumieniowego. Może także 
służyć do sklejania grupy plików: 
cat plik1 plik2 plik3 > suma_plikow 
Ponieważ cat uruchomione bez parametrów pobiera dane ze standardowego wejścia może 
także służyć do wprowadzania danych z klawiatury np.: 
cat > nowy_plik 
spowoduje utworzenie nowego pliku w wypełnieniu go danymi wprowadzonymi z 
klawiatury. 
 
*head, tail 
Polecenie head i tail pozwalają na wyświetlanie części pliku: odpowiednio początku i 
końca. Np.: 
head 10 plik 
wyświetli pierwszych 10 linii pliku. 
Polecenie tail może spełnia szczególną funkcję po wywołaniu z parametrem ‘-f’. 
Wyświetla ono wówczas koniec pliku i oczekuje na nowe dane. Może, więc służyć jako Systemy operacyjne - Strumienie i filtry w systemach Linux „monitor” pliku modyfikowanego przez inną aplikację (pracującą w tle lub na innej konsoli). 
Np.: 
wget -t 0 -r l5 -o out.txt -P wp https://www.wp.pl & 
tail –f out.txt 
 
spowoduje pobranie portalu www.wp.pl. Pobieranie będzie realizowane w tle, a dzięki tail 
w dowolnej chwili można sprawdzić aktualny stan działania programu wget. Działanie tail -f 
można przerwać kombinacją Ctrl-C nie przerywając działania programu wget. 
Posprzątajmy później po sobie :-) : 
killall wget 
rm -r wp 
rm out.txt 
more, less 
 
Polecenie more i less pozwalają na łatwiejsze przeglądanie strumienia wyjściowego. W 
przypadku dużej ilości danych konsola systemu zostaje „przewinięta” i część danych zostaje 
utraconych. Istnieje wprawdzie możliwość cofnięcia tekstu na konsoli (shift+pgup lub suwak w 
xterm) jednak bufor danych jest także ograniczony. Aby móc swobodnie czytać dane zwracane 
przez program wywołujemy polecenie: 
komenda | more 
Po każdym zapełnieniu ekranu more zatrzyma wyświetlanie danych i będzie oczekiwał na 
naciśnięcie enter (przewijanie po linii) lub spacji (przewijanie po stronach). Polecenie less jest 
wygodniejsze, gdyż pozwala na swobodne przewijanie danych. Pracę z danymi wyświetlonymi 
przez less lub more możemy zakończyć naciskając klawisz ‘q’. 
sort, uniq 
 
Komenda sort służy do sortowania (domyślnie: alfabetycznego) linijek tekstu 
stanowiących dane wejściowe. Gdy się ją wywoła z argumentami będącymi nazwami plików, 
danymi do sortowania będzie zawartość tychże; w przypadku wywołania bez argumentów (nie 
będących opcjami, za pomocą, których można zadać bardziej złożone kryteria sortowania), 
komenda sort oczekuje, że dane do przetworzenia pojawią się w standardowym strumieniu 
wejściowym. W obu tych przypadkach, wynik sortowania pojawi się na stdout. Przykład: 
cat /etc/passwd | sort 
zwróci posortowaną listę użytkowników systemu. 
Uzupełnieniem komendy sort jest komenda uniq. Powoduje pominięcie wierszy 
powtarzających się. Np.: 
cat /etc/passwd | sort | uniq Systemy operacyjne - Strumienie i filtry w systemach Linux 
Nowe wersje polecenia sort mają możliwość usuwania powtarzających się linii, dzięki 
czemu komenda uniq traci na znaczeniu. 
 
*tr 
Polecenie to służy do usuwania lub zastępowania znaków. Kopiuje znaki ze standardowego 
wejścia na standardowe wyjście, zastępując po drodze lub usuwając niektóre z nich. 
 
Opcje: 
-c – (ang. complement) zamienia wszystkie znaki, oprócz tych, które występują w 
pierwszym łańcuchu (dopełnienie zbioru znaków o kodach ASCII 0 - 255) 
-d – kasuje z tekstu wejściowego znaki podane w pierwszym łańcuchu 
-s – jeżeli znak zawarty w drugim łańcuchu wystąpi w tekście wyjściowym kilka razy pod 
rząd, wielokrotność jest usuwana (wpisywany jest tylko jeden taki znak) 
 
W nawiasach klamrowych można podać zakresy znaków, można też użyć zapisu [a*n], co 
oznacza n powtórzeń znaku a. 
 
Przykłady: 
tr ',' '\n' < dane > wynik 
Polecenie to zastąpi wszystkie przecinki w pliku dane znakami końca linii, a wynik 
działania polecenia zostanie umieszczony w pliku wynik. 
cat zapiski | tr asdkpz '[.*6]' 
Polecenie to zastąpi litery a, s, d, k, p, z znakami kropki. 
 
cat zapiski | tr -c a '[.*]' 
 
Polecenie to zastąpi wszystkie znaki oprócz znaku 'a' znakami kropki. 
 
*grep 
Przy przekierowaniach często używa się komendy grep. Komenda ta wyświetla linie 
pasujące (lub nie) do określonego wzorca. grep jest niezwykle rozbudowaną komendą, lecz 
zwykle używa się kilku jego podstawowych właściwości. 
 
Uproszczona składnia: 
grep [-v] WZORZEC [PLIK(I)] 
gdzie: 
-v – oznacza negację wzorca (czyli wzorzec nie może wystąpić) 
WZORZEC – to wzór informacji do wyszukania, 
PLIK(I) – lista plików do kontroli. W przypadku nie podania nazw plików, "grep" 
pracować będzie na stdin. Systemy operacyjne - Strumienie i filtry w systemach Linux 
Przykłady wykorzystania: 
ls -l | grep student 
spowoduje wyświetlenie tylko tych linii, w których znajduje się słowo "student" . 
cat plik.c | grep include 
Powyższe polecenie wyświetli wszystkie linie pliku plik.c, zawierające ciąg "include" 
 
Wzorzec programu grep stanowi wyrażenie regularne. Wyrażenia regularne są to 
wyrażenia wzorcowe tworzone za pomocą liter i cyfr w połączeniu ze znakami specjalnymi, 
które działają podobnie do operatorów. Czynią one łatwiejszymi odnajdowanie i filtrowanie 
informacji w plikach. 
 
Najważniejsze operatory wyrażeń regularnych 
 
Znak Opis 
. Dopasuj dowolny znak 
$ Dopasuj poprzedzające wyrażenie do końca wiersza 
^ Dopasuj występujące po operatorze wyrażenie do początku wiersza 
* Dopasuj zero lub więcej wystąpień znaku poprzedzającego operator 
\ Oznacza pominięcie specjalnego znaczenia znaku np.: \* 
[ ] Dopasuj dowolny znak ujęty w nawiasy. np.: [abc] 
[ - ] Dopasuj dowolny znak z przedziału. np.: [0-9] – wszystkie cyfry; [a-z] – 
wszystkie małe litery; [0-9a-zA-Z] – wszystkie litery i cyfry 
[^ ] Dopasuj znak, który nie znajduje się w nawiasach. 
 
 
Przykłady: 
 
grep 'Ala' plik – znajduje wyraz Ala 
grep 'A.a' plik – znajduje wyrazy takie jak Ala, Aga, Ara, A+a i inne 
grep 'A[lg]a' plik – znajduje TYLKO wyrazy Ala lub Aga 
grep '^Ala' plik – znajduje linie zaczynające się na "Ala" 
grep 'Go*gle' plik – znajduje Gogle, Google, Gooogle itd. 
grep '[0-9][0-9]*' – znajduje dowolny ciąg cyfr 
 
Z wyrażeń regularnych korzystają także inne programy, np.: ed, sed, awk i inne. 
Cześć programów (np. sed, awk) potrzebuje, aby wyrażenie regularne ujęte było w znaki 
"/" np.: /abc[0-9]/, inne programy (grep) przyjmują wyrażenia regularne bez dodatkowych 
znaków np.: grep abc[0-9] plik. Należy jednak pamiętać, że część stosowanych znaków może 
zostać zinterpretowanych przez shell. Z tego powodu bezpieczniej jest użyć cytowania.
Załóż własną stronę internetową za darmo Webnode