Что такое остановленный процесс в Linux?

12

Поэтому у меня было несколько PHP-скриптов, запускаемых из командной строки, и я хотел остановить их выполнение.

Я побежал

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

А потом побежал

$ ps aux | grep php

еще раз, чтобы проверить, что процессы завершились, но получили такой вывод:

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

Я посмотрел, что означает T в столбце состояния, и обнаружил, что это означает Остановлено, но я не понимаю, что это означает, что процесс делает.

Я знаю, что вы можете создать свою собственную обработку сигналов в PHP, но я этого не сделал, поэтому, когда PHP получает сигнал SIGTERM, что он делает?

Что делает остановленный процесс (если что-нибудь)?

Джон
источник

Ответы:

15

Это означает, что процесс получил STOPсигнал и ничего не будет делать, пока не получит CONTсигнал, даже не прекратит работу.

Самым распространенным источником STOPсигналов является нажатие пользователем, ^zкогда процесс находится на переднем плане, а общий способ послать CONTпотом - это набрать текст fgили bgпродолжить процесс на переднем и заднем планах соответственно.

Еще один способ отправки STOPв процесс kill -STOP $pid. Точно так же CONTможет быть отправлен в процесс с kill -CONT $pid.

Поскольку вы посылали TERMсигналы процессам, я полагаю, вы хотите, чтобы они прекратились. Для этого процессы должны получать CONTсигналы. Вы можете отправить их, набрав kill -CONT 8754 8767в окне терминала.

Eroen
источник
Будет ли отправка сигнала CONT разрешить выполнение сценария до его завершения? Или это приведет к немедленному завершению сценария?
Джон
Процесс продолжается, что он делал (до остановки) после получения CONT. Если вы отправили СРОК ( kill $pidнапример,), пока он был остановлен, он затем (запоздало) ответит на этот СРОК и прекратит работу.
Эроен
Хм, поэтому я отправил TERM при запуске, kill 8754что должно привести к завершению процесса, верно? Знаете ли вы, в каком состоянии находится процесс, пока он подходит к завершению? Учитывая, что процесс перешел в состояние STOP, как если бы он получил сигнал STOP kill -STOP 8754, может ли это произойти, если ему был послан сигнал TERM?
Джон
Остановленный процесс не прекратится из-за TERMсигнала, пока не будет продолжен. Он прекратит работу немедленно, если получит KILLсигнал, даже если он остановлен. Я предполагаю, что процесс будет в состоянии Run, когда он завершится. Я не очень знаком с PHP и не знаю, как сказать, почему процесс остановился, извините. Однако, как правило, процессы не останавливаются, а завершаются при получении TERM.
Eroen
4

Остановленный процесс в Linux / Unix - это процесс / задача, получивший сигнал приостановки ( SIGSTOP/ SIGTSTP), который указывает ядру не выполнять на нем никакой обработки, поскольку он был остановлен, и возобновить его выполнение можно только в том случае, если ему отправлен SIGCONTсигнал.

В основном остановленный процесс ожидает сигнала продолжения от ядра, точно так же, как приостановленный процесс ожидает состояние пробуждения от ядра.

Состояние ядра Linux: готово, работает, остановлено, приостановлено, отслежено, зомби

Изображение предоставлено: polytechnique.fr


Каждый процесс в ядре Linux представлен task_structструктурой данных, и каждый taskвектор состоит из массива указателей на каждый task_struct. который описывает процесс или задачу в системе (или это unrunnable, runnableили stopped). См. Процессы и структуры данных Linux ) для более подробной информации.

Смотрите также: Ядро Linux: Управление процессами

kenorb
источник
@Jus Спасибо за отчет, я исправил это.
Кенорб