Poprzednia | Zawartość | Następna
W poprzedniej lekcji przyjrzeliśmy się niektórym implikacjom bycia przez Linuksa systemem operacyjnym dla wielu użytkowników. W tej lekcji przyjrzymy się wielozadaniowości Linuksa i temu, jak jest ona kontrolowana za pomocą interfejsu wiersza poleceń.
Jak w każdym wielozadaniowym systemie operacyjnym, Linux wykonuje wiele równoczesnych procesów. Cóż, w każdym razie, wydają się one równoczesne. W rzeczywistości pojedynczy rdzeń procesora może wykonywać tylko jeden proces na raz, ale jądro Linuksa daje każdemu procesowi swoją kolej przy procesorze i każdy z nich wydaje się być uruchomiony w tym samym czasie.
Istnieje kilka poleceń, które są używane do kontrolowania procesów. Są to:
-
ps
– wylistowanie procesów działających w systemie -
kill
– wysłanie sygnału do jednego lub więcej procesów (zwykle w celu „zabicia” procesu) -
jobs
– alternatywny sposób wylistowania własnych procesów -
bg
-… umieść proces w tle -
fg
– umieść proces na pierwszym planie
Praktyczny przykład
Mimo że może się wydawać, że ten temat jest dość niejasny, może on być bardzo praktyczny dla przeciętnego użytkownika, który pracuje głównie z graficznym interfejsem użytkownika. Choć może to nie być oczywiste, większość (jeśli nie wszystkie) programów graficznych można uruchomić z linii poleceń. Oto przykład: z systemem X Window dostarczany jest niewielki program o nazwie xload, który wyświetla wykres przedstawiający obciążenie systemu. Możemy uruchomić ten program, wpisując następujące polecenie:
xload
Zauważ, że pojawia się małe okienko xload
i zaczyna wyświetlać wykres obciążenia systemu. W systemach, w których xload
nie jest dostępne, spróbuj zamiast niego gedit
. Zauważ również, że nasz znak zachęty nie pojawił się ponownie po uruchomieniu programu. Powłoka czeka na zakończenie programu, zanim powróci sterowanie. Jeśli zamkniemy okno xload
, program xload zakończy działanie i zachęta powróci.
Umieszczanie programu w tle
Teraz, aby nieco ułatwić sobie życie, uruchomimy ponownie program xload, ale tym razem umieścimy go w tle, aby zachęta powróciła. Aby to zrobić, wykonamy xload w następujący sposób:
xload &
1223$W tym przypadku zachęta powróciła, ponieważ proces został umieszczony w tle.
Wyobraźmy sobie, że zapomnieliśmy użyć symbolu „&”, aby umieścić program w tle. Jest jeszcze nadzieja. Możemy wpisać Ctrl-z
i proces zostanie zawieszony. Możemy to zweryfikować, widząc, że okno programu jest zamrożone. Proces nadal istnieje, ale jest bezczynny. Aby wznowić proces w tle, wpisz polecenie bg
(skrót odbackground). Oto przykład:
xload
+ Stopped xload$ bg
+ xload &Listing Running Processes
Teraz, gdy mamy proces w tle, warto wyświetlić listę uruchomionych przez nas procesów. Aby to zrobić, możemy użyć poleceniajobs
lub bardziej zaawansowanego polecenia ps.
jobs
+ Running xload&$ ps
PID TTY TIME CMD1211 pts/4 00:00:00 bash1246 pts/4 00:00:00 xload1247 pts/4 00:00:00 ps$Killing a Process
Załóżmy, że mamy program, który przestał odpowiadać; jak się go pozbyć? Używamy polecenia kill
, oczywiście. Wypróbujmy to na xload
. Po pierwsze, musimy zidentyfikować proces, który chcemy zabić. Możemy do tego użyć albo jobs
albops
. Jeśli użyjemy jobs, otrzymamy z powrotem numer zadania. W przypadku ps
, otrzymamy id procesu (PID). Zrobimy to bothways:
xload &
1292$ jobs
+ Running xload&$ kill %1
$ xload &
1293 Terminated xload$ ps
PID TTY TIME CMD1280 pts/5 00:00:00 bash1293 pts/5 00:00:00 xload1294 pts/5 00:00:00:00 ps$ kill 1293
+ Terminated xload$A Little More About kill
Komenda kill
jest używana do „zabijania” procesów, jej prawdziwym celem jest wysyłanie sygnałów do procesów. W większości przypadków sygnał ma na celu powiedzenie procesowi, aby odszedł, ale jest w tym coś więcej. Programy (jeśli są poprawnie napisane) nasłuchują sygnałów z systemu operacyjnego i odpowiadają na nie, najczęściej po to, by umożliwić łagodną metodę zakończenia pracy. Na przykład, edytor tekstu może nasłuchiwać sygnałów, które wskazują, że użytkownik się wylogowuje, lub że komputer się wyłącza. Gdy odbierze taki sygnał, może zapisać trwającą pracę przed zakończeniem pracy. Polecenie kill
może wysyłać do procesów różne sygnały. Wpisanie:
kill -l
spowoduje wydrukowanie listy obsługiwanych przez nie sygnałów. Wiele z nich jest raczej niejasnych, ale kilka warto znać:
Sygnał # | Nazwa | Opis |
1 | SIGHUP | Sygnał rozłączenia. Programy mogą nasłuchiwać tego sygnału i działać na jego podstawie. Sygnał ten jest wysyłany do procesów działających w terminalu, gdy zamykasz terminal. |
2 | SIGINT | Sygnał przerwania. Sygnał ten jest podawany do procesów w celu ich przerwania. Programy mogą przetwarzać ten sygnał i działać na jego podstawie. Sygnał ten możemy również wysłać bezpośrednio wpisując Ctrl-c w oknie terminala, w którym uruchomiony jest program. |
15 | SYGNAŁ ZAKOŃCZENIA | Sygnał zakończenia. Ten sygnał jest podawany do procesów, aby je zakończyć. Ponownie, programy mogą przetwarzać ten sygnał i działać na jego podstawie. Jest to domyślny sygnał wysyłany przez polecenie kill , jeśli nie podano żadnego sygnału. |
9 | SIGKILL | Sygnał zabicia. Ten sygnał powoduje natychmiastowe zakończenie procesu przez jądro Linuksa. Programy nie mogą nasłuchiwać tego sygnału. |
Załóżmy teraz, że mamy program, który jest beznadziejnie zawieszony i chcemy się go pozbyć. Oto co zrobimy:
- Użyj polecenia
ps
, aby uzyskać identyfikator procesu (PID) procesu, który chcemy zakończyć. - Wystaw polecenie
kill
dla tego PID. - Jeśli proces odmawia zakończenia (tzn, ignoruje sygnał), wysyłaj coraz ostrzejsze sygnały, aż się zakończy.
ps x | grep bad_program
PID TTY STAT TIME COMMAND2931 pts/5 SN 0:00 bad_program$ kill -SIGTERM 2931
$ kill -SIGKILL 2931
W powyższym przykładzie użyliśmy polecenia ps
z opcją x, aby wyświetlić listę wszystkich naszych procesów (nawet tych, które nie zostały uruchomione z bieżącego terminala). Dodatkowo przekierowaliśmy wyjście polecenia ps do grep
, aby wylistować tylko interesujący nas program. Następnie, użyliśmy kill do wysłania sygnału SIGTERM do kłopotliwego programu.W praktyce, częściej robi się to w następujący sposób, ponieważ domyślnym sygnałem wysyłanym przez kill
jest SIGTERM, a kill może również używać numeru sygnału zamiast jego nazwy:
kill 2931
Następnie, jeśli proces nie zakończy się, wymuś go sygnałem SIGKILL:
kill -9 2931
That’s It!
Na tym kończymy serię lekcji „Nauka powłoki”. W następnej serii, „Pisanie skryptów powłoki”, przyjrzymy się sposobom automatyzacji zadań za pomocą powłoki.
Dalsza lektura
- W celu bardziej dogłębnego omówienia tematu zobacz rozdział 10 w The Linux Command Line.
- 1963 Timesharing: A Solution to Computer Bottlenecks, fascynujący film YouTube z Computer History Museum opisujący pierwszy system operacyjny z podziałem czasu i sposób jego działania. Jest to w zasadzie ta sama metoda używana przez wszystkie współczesne komputery.