Co to jest zatrzymany proces w systemie Linux?

12

Miałem więc kilka skryptów PHP uruchomionych z wiersza poleceń i chciałem je zatrzymać.

Pobiegłem

$ ps aux | grep php
$ sudo kill 8754
$ sudo kill 8767

A potem pobiegł

$ ps aux | grep php

ponownie, aby sprawdzić, czy procesy zostały zakończone, ale uzyskano tego rodzaju dane wyjściowe:

jon      8754  0.4 53.5 3044256 2205204 ?     T    10:34   0:15 php awesome_script.php
jon      8767  0.4 53.5 3044256 2205204 ?     T    10:34   0:15 php awesome_script.php
jon     12275  0.0  0.0   4156   892 pts/1    S+   11:27   0:00 grep --color=auto php

I spojrzał w górę, co oznaczało T w kolumnie Stan i odkrył, że oznacza to Zatrzymano, ale nie rozumiem, co to znaczy proces robi.

Wiem, że możesz stworzyć własną obsługę sygnałów w PHP, ale jeszcze tego nie zrobiłem, więc kiedy PHP otrzyma sygnał SIGTERM, co robi?

Co robi zatrzymany proces (jeśli w ogóle)?

Jon
źródło

Odpowiedzi:

15

Oznacza to, że proces otrzymał STOPsygnał i nic nie zrobi, dopóki nie otrzyma CONTsygnału, a nawet nie zakończy działania.

Najczęstszym źródłem STOPsygnałów jest uderzanie użytkownika, ^zgdy proces jest na pierwszym planie, a powszechnym sposobem wysyłania CONTpóźniej jest pisanie fglub bgkontynuowanie procesu odpowiednio na pierwszym planie i w tle.

Innym sposobem wysłania STOPdo procesu jest kill -STOP $pid. Podobnie CONTmożna wysłać do procesu za pomocą kill -CONT $pid.

Ponieważ wysłałeś TERMsygnały do ​​procesów, zakładam, że chcesz je zakończyć. Aby tak się stało, procesy muszą odbierać CONTsygnały. Możesz je wysłać, wpisując kill -CONT 8754 8767w oknie terminala.

Eroen
źródło
Czy wysłanie sygnału CONT pozwoli na uruchomienie skryptu, dopóki się nie zakończy? A może spowodowałoby to natychmiastowe zakończenie skryptu?
Jon
Proces kontynuuje to, co robił (przed STOP) po otrzymaniu CONT. Jeśli wysłałeś TERM ( kill $pidna przykład), gdy został zatrzymany, wówczas (z opóźnieniem) odpowie na ten TERM i zakończy się.
Eroen
Hmm, więc wysłałem TERM, kill 8754który powinien spowodować, że proces ostatecznie się zakończy, prawda? Czy wiesz, w jakim stanie byłby proces, gdy zaczyna się kończyć? Biorąc pod uwagę, że proces wszedł w stan STOP, tak jakby otrzymał od niego sygnał STOP kill -STOP 8754, czy mogłoby się to również zdarzyć, gdyby wysłano mu sygnał TERM?
Jon
Zatrzymany proces nie zakończy się z powodu TERMsygnału, dopóki nie będzie kontynuowany. Zakończy się natychmiast, jeśli otrzyma KILLsygnał, nawet po zatrzymaniu. Zakładam, że proces będzie w stanie Uruchom po zakończeniu. Przepraszam, nie znam się na PHP i nie wiem, jak powiedzieć, dlaczego proces się zatrzymał. Zasadniczo jednak procesy nie zatrzymują się, lecz kończą w momencie ich otrzymania TERM.
Eroen
4

Zatrzymany proces w systemie Linux / Unix jest procesem / zadaniem, które otrzymało sygnał wstrzymania ( SIGSTOP/ SIGTSTP), który informuje jądro, aby nie wykonywało na nim żadnego przetwarzania, ponieważ zostało zatrzymane, i można je wznowić tylko wtedy, gdy zostanie wysłany SIGCONTsygnał.

Zasadniczo zatrzymany proces oczekuje na sygnał kontynuacji z jądra, podobnie jak zawieszony proces oczekuje na warunki budzenia z jądra.

Stany procesu jądra Linux: gotowe, uruchomione, zatrzymane, zawieszone, śledzone, zombie

Zdjęcia: polytechnique.fr


Każdy proces w jądrze Linuksa jest reprezentowany przez task_structstrukturę danych, a każdy taskwektor składa się z tablicy wskaźników do każdego task_struct. który opisuje proces lub zadanie w systemie (albo to unrunnable, runnablealbo stopped). Zobacz: Procesy i struktury danych Linux ), aby uzyskać więcej informacji.

Zobacz także: Jądro Linux: zarządzanie procesami

kenorb
źródło
@Jus Dzięki za zgłoszenie, poprawiłem to.
kenorb