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)?
źródło
kill $pid
na przykład), gdy został zatrzymany, wówczas (z opóźnieniem) odpowie na ten TERM i zakończy się.kill 8754
któ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ł STOPkill -STOP 8754
, czy mogłoby się to również zdarzyć, gdyby wysłano mu sygnał TERM?TERM
sygnału, dopóki nie będzie kontynuowany. Zakończy się natychmiast, jeśli otrzymaKILL
sygnał, 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 otrzymaniaTERM
.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łanySIGCONT
sygnał.Zasadniczo zatrzymany proces oczekuje na sygnał kontynuacji z jądra, podobnie jak zawieszony proces oczekuje na warunki budzenia z jądra.
Zdjęcia: polytechnique.fr
Każdy proces w jądrze Linuksa jest reprezentowany przez
task_struct
strukturę danych, a każdytask
wektor składa się z tablicy wskaźników do każdegotask_struct
. który opisuje proces lub zadanie w systemie (albo tounrunnable
,runnable
albostopped
). Zobacz: Procesy i struktury danych Linux ), aby uzyskać więcej informacji.Zobacz także: Jądro Linux: zarządzanie procesami
źródło