sop 2009 lab10


ą Sygnały w systemie Linux
Pisanie rozbudowanych skryptów pociąga za sobą problem kontroli ich działania, czy te\
przeciwdziałania ich niepo\ądanemu zachowaniu. Błędnie skonstruowana pętla nie musi wcale
zmuszać u\ytkownika do twardego restartu komputera, mo\na temu zapobiec kontrolując
wykonywanie skryptów powłoki poprzez wysłanie odpowiednich sygnałów.
Sygnały Linuxa (wybrane)
nr sygnału sygnał opis
1 SIGHUP Zawieszenie (ang. hang up) procesu
2 SIGINT Przerwanie (ang. interrupt) procesu
3 SIGQUIT Zatrzymanie (ang. stop) procesu
9 SIGKILL Bezwarunkowe (ang. unconditionally) zakończenie procesu
15 SIGTERM Zakończenie (ang. terminate) procesu, je\eli jest to mo\liwe
17 SIGSTOP Bezwarunkowe zatrzymanie, ale nie zakończenie procesu
18 SIGTSTP Zatrzymanie lub zapauzowanie procesu, ale nie zakończenie
19 SIGCONT Kontynuacja zatrzymanego uprzednio procesu
Powłoka bash domyślnie ignoruje otrzymywane sygnały: SIGQUIT (3), oraz SIGTERM (15).
Wykonuje natomiast ka\dy z otrzymanych sygnałów: SIGHUP (1) i SIGINT (2).
Je\eli powłoka otrzyma sygnał SIGHUP to zakończy działanie. Zanim jednak to nastąpi przeka\e
ona sygnał SIGHUP wszystkim procesom, które są w niej uruchomione.
Sygnał SIGINT przekazany powłoce powoduje jej przerwanie(zawieszenie). Jądro Linux'a
zawiesza przydzielanie zasobów procesora procesowi, który otrzymał taki sygnał. Wszystkie
potomne procesy działające w procesie macierzystym (w tym przypadku powłoce) równie\
otrzymują taki sam sygnał i ich działanie jest zawieszane.
Powłoka przekazuje sygnały równie\ skryptom, które domyślnie je ignorują. Dlatego mo\liwe jest
takie skonstruowanie składni skryptu, który będzie rozpoznawał sygnały i właściwe na nie
reagował.
Znane ju\ są dobrze z poprzednich zajęć dwa procesy wywoływane skrótami klawiszowymi:
Ctrl+C generuje sygnał SIGINT i wysyła go aktualnie działającemu procesowi powodując jego
przerwanie. Drugi sygnał wywoływany za pomocą skrótu klawiszowego to SIGSTP powoduje
bezwarunkowe zatrzymanie, ale nie unicestwienie procesu.
Przykład:
$ seq 1 1 100000
1
2
3
...
$
Po wydaniu komendy generującej z krokiem 1 liczby od 1 do 10000 przerywamy Ctrl+C i
kończymy działanie polecenia.
$ seq 1 1 100000
1
2
3
...
[1]+ Stopped seq 1 1 10000
$
Tym razem przesłanie sygnału SIGSTP za pomocą skrótu Ctrl+Z spowodowało zawieszenie
działania polecenia, które w ka\dej chwili mo\emy wznowić np.: wydając komendę fg
(wznowienie działania procesu na pierwszym planie).
Polecenie wyświetlające wszystkie procesy w systemie w połączeniu z grep znajdzie nam PID
zawieszonego w działaniu polecenia:
$ ps ax | grep seq
16386 pts/2 T 0:00 seq 1 1 10000
znając którego identyfikator, mo\emy przesłać odpowiedni sygnał, np. SIGKILL:
$ kill -9 16386
lub
$ kill -SIGKILL 16386
$ ps ax | grep seq
16394 pts/2 R+ 0:00 grep seq
[1]+ Terminated seq 1 1 10000
trap pułapkowanie sygnałów
Zamiast pozwalać skryptowi na ignorowanie sygnałów, mo\na je przechwytywać i wykonywać
przy pomocy komend. Polecenie trap pozwala na określenie, na które sygnały Linux'a skrypt
powłoki będzie reagował. Je\eli skrypt otrzyma, któryś z sygnałów wymienionych w poleceniu
trap to przetworzy go lokalnie, zapobiegając w ten sposób przekazaniu go i wykonaniu przez
powłokę.
Składnia polecenia:
trap komendy(a) sygnał(y)
Po poleceniu trap podajemy komendy jakie shell ma wykonać, a po spacji listę sygnałów które ma
przechwycić. Sygnały mo\na podawać numerycznie, bądz nazwami literowymi.
Przykład:
$ cat skrypt.sh
trap "echo ubić mnie wcale nie jest tak łatwo" SIGINT
echo "to jest skrypt testowy"
i=1
while [ $i -le 5 ]
do
echo "pętla nr $i"
sleep 1
i=$[ $i +1 ]
done
echo "koniec skryptu"
$
Jak się łatwo przekonać skrypt będzie nieczuły na przerwanie jego działania poprzez sygnał
SIGINT.
Poza przechwytywaniem sygnałów od u\ytkownika w skryptach, mo\na je równie\ pułapkować,
gdy skrypty kończą swoje działanie. Jest to elegancki sposób na wykonywanie komend, kiedy
powłoka wykonała określone zadanie.
Przykład:
trap "echo pa pa" EXIT
i=1
while [ $i -le 3 ]
do
echo "pętla nr $i"
sleep 1
i=$[ $i +1 ]
done
Kiedy zpułapkowany zostanie sygnał EXIT  koniec działania polecenia, wykonana zostanie
komenda, w tym wypadku wyświetlony tekst. Oczywiście wysłanie sygnału SIGINT równie\
warunkuje koniec działania polecenia, a więc pojawienie się sygnału EXIT.
U\ycie myślnika  - dezaktywuje pułapkowanie:
Przykład:
trap "echo pa pa" EXIT
i=1
while [ $i -le 3 ]
do
echo "pętla nr $i"
sleep 1
i=$[ $i +1 ]
done
trap  EXIT
echo "koniec skryptu"
Jeśli skrypt nie otrzyma np.: SIGINT to pułapka na sygnał EXIT zostanie zdjęta. Mo\liwe takiego
zastosowanie dezaktywatora: jeśli podczas instalacji skrypt rozpozna przerwanie (Ctrl+C) to
usunie niekompletnie rozpakowane archiwum, w przeciwnym razie wyświetli komunikat o
pomyślnej instalacji danych etc.
ą Kontrola zadań
Pokazano sygnały przerywające permanentnie i wstrzymujące tylko procesy. Wstrzymany proces
mo\na zakończyć, wydając polecenie kill, mo\na jednak do niego powrócić.
Zarządzanie uruchamianiem, wstrzymywaniem, przywracaniem i terminacją procesów nosi
wspólną nazwę: kontrola zadań. Zapewnia ona pełen dostęp i sposób w jaki procesy działają w
bie\ącym środowisku powłoki.
jobs wyświetla listę poleceń przeniesionych w tło
Parametry:
-l wyświetla numery i PID'y zadań
-n wyświetla tylko te zadania które zmienimy swój status od ostatniego sprawdzenia
-p wyświetla tylko PID'y zadań
-r wyświetla tylko te zadania które są wykonywane w tle (Running)
-s wyświetla tylko te zadania które są wstrzymane (Stopped)
$ cat skrypt.sh
echo "skrypt testowy o PID=$$"
for (( i=1; i<5; i++ ))
do
echo "pętla $i"
sleep $i
done
echo "koniec"
Skrypt wyświetla swój PID (zmienna specjalna$$) i przechodzi do wykonywania pętli
$ ./skrypt.sh
skrypt testowy o PID=17564
pętla 1
pętla 2
[1]+ Stopped ./skrypt.sh
Wstrzymujemy działanie skryptu Ctrl+Z (SIGSTP). śadna więcej pętla nie zostanie wykonana do
momentu wznowienia jego działania. Skrypt został wstrzymany i przeniesiony w tło, jako 1 zadanie
(1 w nawiasach kwadratowych).
$ ./skrypt.sh > wynik &
[2] 17567
Wywołujemy ponownie skrypt z przekierowaniem do zewnętrznego pliku wynik, przenosząc
jednocześnie jego działanie w tło (symbol & odpowiedzialny jest za przeniesienie polecenia w tło).
Jak widać, jest to ju\ drugie zadanie, którego PID jest ró\ny od zadania poprzedniego.
$ jobs
[1]+ Stopped ./skrypt.sh
[2]- Running ./skrypt.sh >wynik
Poleceniem jobs sprawdzamy wszystkie zadania znajdujące się w tle (część z nich jest wykonana,
a część wstrzymana zgodnie z tym wydanymi poleceniami).
$ cat wynik
skrypt testowy o PID=17567
pętla 1
pętla 2
pętla 3
pętla 4
koniec
Przeniesione polecenie w tło nie zostało wstrzymane, skrypt wykonał pętlę.
ą Wznawianie wstrzymanych procesów
Bash umo\liwia przywrócenie działania wstrzymanych procesów w tle (ang. background process)
lub na bie\ącym terminalu (ang. foreground process).
Do wznawiania procesów w tle słu\y polecenie bg:
Przykład:
$ ./skrypt.sh
skrypt testowy o PID=17564
pętla 1
[1]+ Stopped ./skrypt.sh
$ ./skrypt.sh
skrypt testowy o PID=17574
pętla 1
[2]- Stopped ./skrypt.sh
Przeniesiono dwa procesy w tło, wywołując:
$ bg 2
Wznawiamy jego działanie w tle, jednak wyniki mogą być zwracane bezpośrednio na
terminal (zale\nie od konstrukcji skryptu, bądz u\ytych przekierowań).
Z kolei:
$ fg 2
Powoduje wznowienie wykonywania polecenia bezpośrednio na bie\ącym terminalu.
Nadawanie priorytetów poleceniom
W systemach wielozadaniowych (takim jest równie\ Linux) za przydzielanie czasu u\ycia
procesora ka\demu z uruchamianych procesów odpowiedzialne jest jądro (ang. kernel). W
jednej chwili CPU obsługuje tylko jeden proces. Domyślnie wszystkie procesy pochodzące
z powłoki posiadają ten sam priorytet wywołania. Priorytet wywołania określa, jaki czas
wykorzystania CPU jest rezerwowana przez jądro na wykonanie procesu w stosunku do
czasu przydzielonego pozostałym procesom.
Priorytet wywołania jest liczbą całkowitą przyjmującą wartości z przedziały od -20 do 20.
Domyślnie polecenia wywoływane są z priorytetem 0, niezale\nie czy są prostymi
skryptami, czy skomplikowanymi algorytmami matematycznymi działającymi przez wiele
godzin.
Dlatego czasem dobrze jest nadać niektórym komendom niskich (tym które wykonują się
szybko  krótko zajmują zasoby CPU), a innym wysokich priorytetów. Słu\y do tego
polecenie nice.
nice Uruchamianie programów ze zmodyfikowanym priorytetem
Jeśli nie ma podanych argumentów, nice wypisuje obecny priorytet przydzielania
(przełączania zadań w jądrze). Jest to ten priorytet, który program dziedziczył dla siebie.
W przeciwnym wypadku, nice uruchamia podane polecenie z dostrojonym priorytetem
przydzielania. Jeśli nie podano dostrojenia, priorytet polecenia jest zwiększany o 10.
Superu\ytkownik mo\e podawać ujemne dostrojenie. nice mo\e dostrajać priorytet w
granicach od -20 (najwy\szy priorytet) do 20 (najni\szy).
Przełącznik -n pozwana na modyfikację priorytetu wywołania programu:
Przykład:
$ nice -n 10 ./skrypt.sh >> wynikowy_plik &
[1] 20293
$ pa al
F UID PID PPID PRI NI VSZ RSS WCHAN STAT TTY TIME COMMAND
0 1000 20013 20012 15 0 5292 1944 wait Ss pts/2 0:00 -bash
0 1000 20282 20013 26 10 4956 1420 wait SN pts/2 0:00 /bin/sh ./skrypt.sh
0 1000 20285 20282 26 10 3876 580 - SN pts/2 0:00 sleep 3
0 1000 20286 20013 17 0 2372 704 - R+ pts/2 0:00 ps al
Je\eli zaistnieje potrzeba zmiany priorytetów programu podczas działania nale\y
skorzystać z polecenia renice.
Przykład:
$ ./skrypt.sh >> wynikowy_plik &
[1] 20293
$ pa al | grep skrypt.sh
F UID PID PPID PRI NI VSZ RSS WCHAN STAT TTY TIME COMMAND
0 1000 20282 20013 26 0 4956 1420 wait SN pts/2 0:00 /bin/sh ./skrypt.sh
$ renice 10 -p 20293
$ pa al | grep skrypt.sh
0 1000 20282 20013 26 10 4956 1420 wait SN pts/2 0:00 /bin/sh ./skrypt.sh
ą Planowanie zadań:
at,batch
składnia:
wczytanie poleceń ze standardowego wejścia i wykonanie ich w podanym czasie:
at czas [data] [przesunięcie]
usunięcie polecenia o wskazanym identyfikatorze z kolejki at lub batch:
at -r id_zadania...
wyświetlenie stanu kolejki at lub batch:
at -l[id_zadania]
dopisanie polecenia do kolejki:
at -qkolejka czas [data] [przesunięcie]
Umieszczenia polecenia w kolejce do wykonania w czasie dogodnym dla systemu:
batch
Opis:
Polecenia at i batch wczytują ze standardowego wejścia jedno lub kilka poleceń
przeznaczonych do wykonania w terminie pózniejszym.
at  w terminie podanym przez argument czas
batch  w terminie dogodnym dla systemu
Wprowadzanie poleceń klawiatury nale\y zakończyć Ctrl+D. Wygodnym sposobem jest
umieszczanie poleceń do wykonania w pliku i odpowiednie przekierowanie np. do
polecenia at:
at 15:10 < archive
Argumenty:
polecenie batch nie u\ywa \adnych argumentów, natomiast at dopuszcza ich stosowanie:
czas  czas wykonania poleceń, podawany w postaci 1, 2, lub 4 cyfrowej liczby. Liczba 1-
lub 2- cyfrowa oznacza godzinę, zaś liczba 4-cyfrowa: godziny i minuty rozdzielone np.  :
Za liczba mo\e wystąpić jeden z symboli am (przed południem), pm (po południu). W
przypadku braku tych argumentów czas interpretowany jest wg zegara 24-godzinnego.
Dozwolony jest równie\ przyrostek zulu określający: Greenwich Mean Time (GMT) lub
Universal Coordinated Time (UCT). Ponadto dopuszczalne są nazwy specjalne: noon (w
południe), midnight (o północy), now (teraz), next (w następnej jednostce czasu).
Data  opcjonalnie data mo\e być podana jako:
nazwa dnia tygodnia  pełna lub skrócona do trzech znaków (mon, tue, wen, thu, fri,
sat, sun).
Ponadto dozwolone są dwie nazwy specjalne: today, tomorrow
miesiąc dzień [,rok]  miesiąc mo\e być określone przez: jan, feb, mar, apr, may,
jun, jul, aug, sep, oct, nov, dec, lub za pomocą numeru. Dzień i rok muszą być
podane w postaci numerycznej.
Je\eli pominięto datę przyjmowana jest wartość: today (je\eli podany czas jest pózniejszy
od bie\ącego, lub tomorrow (je\eli podany czas jest wcześniejszy od bie\ącego).
Podobnie jest z miesiącami.
Je\eli zmienna systemowa LANG posiada wartość polish, to powy\sze nazwy
anglojęzyczne mogą być zastąpione polskimi.
Przesunięcie  oznacza przesunięcie czasy wykonania polecenia i mo\e być określone
jako +n jednostka, gdzie jest jest liczbą, a jednostka jedną z wielkości: minuty, godziny,
dni, tygodnie, miesiące, lata, zapisywanej w liczbie pojedynczej lub mnogiej.
Przykłady:
at 0815am Jan 24
at 8:15am Jan 24
at now + 1 day
at pm +1 week
at 5 pm Friday next week
Dostęp do poleceń:
/etc/at.allow
/etc/at.deny
cron
fomat:
min godzina dz_mc miesiąc dz_tyg u\ytkownik wiersz polecenia_zadania
0-59 0-23 1-31 1-12 0(n)-6
0 16-23 * * * who >> ~/plik 2> /dev/null
ka\dego dnia co godzinę od 16 do 23 zapisać kto jest zalogowany
1,30 * * * * (echo -n ' '; date; echo) > /dev/console
co pół godziny na konsoli nastąpi wyświetlenie aktualnego czasu i daty


Wyszukiwarka

Podobne podstrony:
sop 2009 lab04
sop 2009 lab05
sop 2009 lab12
sop 2009 lab03
sop 2009 lab08
sop 2009 lab01
sop 2009 lab11
sop 2009 lab02
sop 2009 lab06
sop 2009 lab07
sop 2009 lab09
2009 2010 rejon
2009 pytania testowe
[W] Badania Operacyjne Zagadnienia transportowe (2009 04 19)
Twilight Saga New Moon 2009 CAM XviD POISON

więcej podobnych podstron