-
Napisz skrypt, który w pętli będzie coś robił (np. co sekundę
wypisywał bieżącą godzinę). Sprawdź wysyłanie do procesu różnych
sygnałów (SIGINT, SIGQUIT, ale także SIGFPE,
SIGILL), a na rozbuduj skrypt o przechwytywanie tych sygnałów
(trap) i sprawdź, że to działa, to znaczy, że tak napisanego
procesu nie da się zabić tymi sygnałami. Sprawdź możliwość
uśmiercenia sygnałem SIGKILL procesu, który przechwytuje
wszystkie 15 sygnałów.
Wskazówka: obsługę sygnałów przez proces interpretera poleceń
deklaruje się wbudowanym poleceniem trap. Gdzie szukać opisu
poleceń wbudowanych interpretera ..... man bash !
-
Sprawdź możliwość zawieszania procesu sygnałem SIGSTOP i
wznawiania sygnałem SIGCONT. Sprawdź, że sygnał SIGSTOP
daje taki sam efekt jak naciśnięcie klawisza Ctrl+Z na
terminalu. Sprawdź, że sygnał SIGCONT daje taki sam efekt jak
wykonanie polecenia fg lub bg (którego bardziej?).
-
Uruchom kilka podprocesów shella i wysyłaj po kolei sygnały (1-15) do
grupy procesów tego shella. Sprawdź reakcję na te sygnały zarówno
podprocesów, jak i samego shella. Które sygnały shell ignoruje, a
które powodują reakcję domyślną?
-
Nie korzystając z dobrodziejstw oferowanych przez ulimit,
napisz skrypt, który przyjmie 3 parametry: nazwę programu do
uruchomienia i dwie liczby naturalne x i y, a następnie uruchomi
zadany program. Jeśli program będzie działać jeszcze po x sekundach
(można to sprawdzać np. co sekundę poleceniem ps z odpowiednimi
parametrami), to należy spróbować go zabić, wysyłając mu sygnał
SIGTERM. Jeśli program będzie działać nadal po y sekundach,
to należy go zabić sygnałem SIGKILL.
Następnie wypróbuj działanie powyższego skryptu, pisząc dwa skrypty do
uruchomienia - jeden, który daje się zabić przez SIGTERM i
drugi, który na to nie pozwala.
Wklej opracowany skrypt do raportu z wykonania zadania.
-
Napisz wywołania programu ps wyświetlające następujące informacje:
- numer procesu rodzica bieżącego procesu (tego który wywołał ps)
- numery procesów grupy procesów bieżącego procesu
-
Napisz skrypt, który wyświetli na wyjściu numery wszystkich procesów
posiadających tego samego rodzica, co proces o zadanym numerze
(argument skryptu). Wywołanie bez argumentów oznacza wzięcie procesu
samego skryptu (czyli powinien wyświetlić swoje rodzeństwo).
Wklej opracowany skrypt do raportu z wykonania zadania.
-
Napisz skrypt A, który uruchomi skrypt potomny B, który zabije proces
swojego rodzica (A). Sprawdź (np. poleceniem pstree), czy
osierocony proces zostanie poprawnie adoptowany przez proces
init.
-
Obmyśl jak wyprodukować proces zombie, wykonaj to, i sprawdź jak
pojawia się on na liście procesów ps (Linux, Solaris). Wyjaśnij jak
działa Twój przepis na zombie. Następnie spróbuj go zabić, i opisz wynik.
Wklej opracowany skrypt do raportu z wykonania zadania.
Uwaga: interpreter poleceń bash uniemożliwia powstawanie
procesów zombie. Taki proces może powstać tylko wtedy, gdy jego
rodzicem nie będzie bash. Ale jak bash może nie być
rodzicem procesu, skoro był potrzebny do jego stworzenia ...
Uwaga2: jak zobaczyć proces zombie? Na systemie Linux proces zombie
ma nadal ten sam terminal, na którym proces był oryginalnie uruchomiony.
Na systemie Solaris proces zombie jest odłączony od wszystkich terminali.
-
UWAGA: nie wykonuj tego punktu na żadnym z komputerów wielodostępnych
w Instytucie Informatyki. Wykonaj go na lokalnej stacji roboczej,
wcześniej upewniwszy się, że w razie potrzeby będzie można ją bez
szkody resetować. A najlepiej wykonaj ten punkt na własnym komputerze
domowym :-).
Napisz skrypt, który w nieskończonej pętli uruchamia kolejne kopie
samego siebie w tle. Uruchom skrypt. Następnie spróbuj opanować
sytuację, czyli pozabijać wszystkie utworzone procesy i powrócić do
normalnej pracy. Jeśli Ci się to udało, to jeszcze raz uruchom
skrypt, a następnie wyloguj się kompletnie z komputera. Spróbuj
zalogować się ponownie. Jeśli i to Ci się uda, to nie napisałeś/aś
poprawnie skryptu. Przeanalizuj skrypt i postaraj się go poprawić.
W trakcie wykonywania kolejnych ćwiczeń zwracaj uwagę na takie pisanie
skryptów, aby nie doprowadzić do zatkania systemu ani zapełnienia
dysku. W szczególności naucz się stosować takie elementy jak: program
sleep dla wprowadzania opóźnień, sygnały, ograniczenia zasobów, i
priorytety, aby uruchamiać swoje zadania w sposób ułatwiający łatwe
ich kontrolowanie i zmniejszający obciążenie systemu.
Wklej opracowany skrypt do raportu z wykonania zadania.
Opisz również wynik walki z jego uruchomioną instancją.