Временная остановка выполнения процесса

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

Для того, чтобы временно остановить выполнение процесса, ему следует послать сигнал STOP(19).

Например, чтобы остановить работающую программу top, ей посылается сигнал.

$ kill -STOP 18026
$ ps -t pts/1 -o pid,s,comm
  PID S COMMAND
18015 S bash
18026 T top
$

Обратите внимание на поле состояние у процесса top, там стоит буква Т. Это значит, что выполнение процесса приостановлено.

В этом месте я должен был написать следующее: «Чтобы продолжить выполнение процесса, пошлите ему сигнал CONT(18)». Так вот, даже если Вы пошлете процессу сигнал CONT, он все равно остается в приостановленном состоянии. Почему так происходит? Дело в том, что данный процесс «привязан» к терминалу, поэтому он не будет реагировать на 18-й сигнал. И возобновлять его работу можно только при помощи средств, встроенных в шелл bash. На сигнал CONT будут реагировать только процессы, не «привязанные» к терминалу, например, процессы-демоны.

# ps -eo pid,s,comm | grep inetd
 3743 S inetd
# kill -STOP 3743
# ps -eo pid,s,comm | grep inetd
 3743 T inetd
# kill -CONT 3743
# ps -eo pid,s,comm | grep inetd
 3743 S inetd
#

Программа inetd — это демон, не «привязанный» к терминалу. Сначала ему был послан сигнал STOP, и он перешел в состояние Т. Затем ему послали сигнал CONT, и он вернулся в рабочее состояние (состояние S означает, что процесс ожидает какой-либо операции ввода-вывода, а значит, он находится в рабочем состоянии.).

В bash есть интересная встроенная возможность — Job control (управление заданиями). Пользователь может останавливать и продолжать выполнение программ. Оболочка «знает» о всех программах, запущенных при ее помощи, и может выдать полный список всех работающих программ. Для получения списка используют команду jobs.

jobs [-lnprs] [jobspec ...]

Но прежде, чем мы рассмотрим использование управления заданиями, разберемся с foreground (интерактивный) и background (фоновый) режимами работы программ.

Когда Вы обычным образом запускаете на выполнение программу, она занимает терминал, точнее, стандартный ввод, вывод и вывод ошибки, связанные с этим терминалом. Пока эта программа не завершит свою работу, Вы не сможете в нем выполнять новые программы, так как не будет доступна командная строка. Такой режим работы называют foreground.

Bash позволяет запускать программы в фоновом режиме. В этом случае, программа начинает работать параллельно оболочке, на экране появляется приглашение командной строки, и Вы сможете запускать другие программы.

Для того, чтобы запустить программу в фоновом режиме, в командной строке после указания всех параметров программы напишите символ &.

Внимание! Если программа, запущенная в фоновом режиме, попытается что-либо прочитать со стандартного ввода, ее выполнение будет временно прекращено.

Jobs показывает только временно приостановленные и работающие в фоновом режиме программы. Также следует учитывать, что шелл (а jobs — это встроенная команда шелл) «видит» только те программы, которые были запущены из него. Если какая-то программа была запущена в фоновом режиме в другом терминале или другой программой, jobs текущего шелл не покажет эту программу в своем списке.

Для того, чтобы временно остановить выполнение программы, выполняющейся в foreground-режиме, достаточно нажать комбинацию клавиш Ctrl+Z. Процесс тут же будет приостановлен, и на экране появится приглашение командной строки. Например, во время работы программы top была нажата указанная выше комбинация клавиш. На экран будет выведено сообщение о приостановке выполнение программы:

[1]+  Stopped                 top
$ ps -o pid,s,comm
  PID S COMMAND
20185 S bash
21231 T top
21238 R ps
$

Если теперь запустить jobs, он покажет список приостановленных или выполняющихся в фоновом режиме программ.

$ jobs
[1]+  Stopped                 top
$

1 — это не PID, а внутренний номер программы. Если необходимо увидеть PID программ, тогда используйте параметр –p:

$ jobs -p
21231
$

Еще больше информации показывает jobs с параметром –l:

$ jobs -l
[1]+ 21231 Stopped (signal)        top
$

Символ плюс означает последнюю остановленную программу, минус — предпоследнюю.

Чтобы продолжить выполнение программы в foreground-режиме, можно использовать команду fg. Для продолжения выполнения в фоновом режиме — bg. Обеим программам в качестве параметра можно указывать номер задания — число, которое выводит jobs. Если номер не указан, команда работает с последним процессом.

$ fg
top
top - 16:34:06 up  6:10,  1 user,  load average: 0.00, 0.04, 0.09
Tasks:  74 total,   1 running,  73 sleeping,   0 stopped,   0 zombie
Cpu(s):  1.8% us,  0.6% sy,  0.0% ni, 95.2% id,  2.3% wa,  0.0% hi,  0.0% si
Mem:    246832k total,   243148k used,     3684k free,     5512k buffers
Swap:   514072k total,    70760k used,   443312k free,   111332k cached

  PID USER      PR  NI  VIRT  RES  SHR S %CPU %MEM    TIME+  COMMAND
19357 artur     15   0  198m  48m  21m S  1.1 20.2   0:59.18 soffice.bin
 4107 root      15   0  161m  21m 2280 S  0.7  8.9   6:42.39 X