Ćwiczenie — kończenie nieprawidłowo działającego procesu

Ukończone

Komputery są niedoskonałe. Wcześniej czy później coś pójdzie nie tak. Dlatego masz pracę jako administrator, to do ciebie należy rozwiązywanie problemów z systemem i usuwanie ich.

Wyobraź sobie, że aplikacja w języku Python powoduje problemy. Być może zajmuje zbyt dużo czasu procesora CPU, a może przestał odpowiadać. W obu przypadkach chcesz zatrzymać aplikację. Aby zidentyfikować proces lub aplikację, możesz użyć poleceń ps i grep. Następnie, aby go zatrzymać, możesz użyć polecenia kill. Przećwiczmy to na maszynie wirtualnej z systemem Linux.

Uruchamianie niewłaściwie zachowującego się procesu

Jeśli zamierzasz zabić proces, potrzebujesz procesu do zabicia. Utwórzmy go.

  1. Wróć do swojego katalogu home, wpisując następujące polecenie:

    cd ~
    
  2. W usłudze Azure Cloud Shell wprowadź następujące polecenie, aby uruchomić edytor vi systemu Linux:

    vi bad.py
    

    vi jest powszechnie używanym edytorem tekstu, odziedziczonym przez system Linux po systemie Unix. Można go kochać lub nienawidzić, ale użytkownik powłoki Bash musi znać podstawy edytora vi.

  3. Wybierz klawisz i, aby przełączyć edytor vi w tryb wstawiania. Następnie wpisz następujący program w języku Python:

    i = 0
    while i == 0:
        pass
    

    Ten program, gdy jest wykonywany, działa w nieskończonej pętli — ewidentnie nie jest to coś, co chcesz uruchamiać na swoim serwerze.

  4. Wybierz klawisz Esc, aby wyjść z trybu wstawiania. Następnie wpisz następujące polecenie, po czym wybierz klawisz Enter, aby zapisać program i wyjść z edytora vi:

    :wq
    

    Pamiętaj o umieszczeniu dwukropka na początku polecenia. Jeśli chodzi o pozostałą część polecenia, litera w oznacza „wrtite” („zapisz”), a q oznacza „quit” („zakończ”).

  5. Teraz użyj następującego polecenia, aby uruchomić program i pozostawić go uruchomionego w tle:

    python3 bad.py &
    

    Pamiętaj, aby dołączyć znak ampersand (&) na końcu polecenia. W przeciwnym razie nie powrócisz do monitu powłoki Bash. W powłoce Bash znak ampersand uruchamia polecenie i wraca do wiersza polecenia, nawet jeśli działanie polecenia nie zostało zakończone.

Nie jest to oczywiste, ale program bad.py działa teraz w tle i kradnie cykle procesora CPU innym procesom. Przyjrzyjmy się temu, co się dzieje.

Zabijanie procesu

Aby zabić proces, potrzebujesz nazwy procesu lub identyfikatora procesu. To jest zadanie dla polecenia ps.

  1. Aby odświeżyć Twoją pamięć, polecenie ps -ef wyświetla listę wszystkich uruchomionych procesów i wiele informacji o każdym z nich. Użyj następującego polecenia, aby wyświetlić listę wszystkich uruchomionych procesów i przefiltrować wyniki do wierszy zawierających ciąg „python”:

    ps -ef | grep python
    

    Wyniki powinny wyglądać mniej więcej tak:

    yourname+    342    254 99 23:34 pts/1    00:00:31 python3 bad.py
    yourname+    344    254  0 23:35 pts/1    00:00:00 grep --color=auto python
    
  2. Z listy wynika, że proces bad.py zużywa 99 procent czasu procesora CPU serwera. Program zasługuje na swoją nazwę.

    Polecenie kill zabija uruchomiony proces na podstawie identyfikatora procesu. (Powiązane polecenie o nazwie killall zabija proces na podstawie nazwy procesu). Podczas wywoływania killmetody musisz zdecydować, jakiego rodzaju "sygnał" użyć do zabicia procesu. Użyj następującego polecenia, aby wyświetlić listę typów sygnałów:

    kill -l
    
  3. Jeśli zabijasz proces demona — działający w tle i zapewniający ważne usługi dla systemu operacyjnego — możesz chcieć go zabić i natychmiast uruchomić ponownie. Aby to zrobić, możesz użyć sygnału SIGHUP.

    W tym przykładzie chcesz zabić proces bez jego ponownego uruchamiania. W związku z tym chcesz użyć sygnału SIGKILL, który odpowiada numerowi 9. W tym celu pobierz identyfikator procesu bad.py z danych wyjściowych polecenia ps -ef (znajduje się on w drugiej kolumnie) i użyj następującego polecenia, aby zakończyć proces. Zastąp element PROCESS_ID identyfikatorem procesu.

    kill -9 PROCESS_ID
    

    To samo polecenie można również wprowadzić jako kill -s SIGKILL PROCESS_ID. To, czy użyjesz nazwy, czy numeru sygnału, zależy od ciebie.

  4. Zakończ, uruchamiając ponownie polecenie ps, aby upewnić się, że proces bad.py już nie działa.

Innym typowym zastosowaniem poleceń ps i kill jest identyfikowanie i kończenie „procesów zombie”, które są procesami podrzędnymi pozostawionymi przez źle napisane programy.