Как запускать и контролировать фоновые процессы в Linux

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

Все о процессах

Всякий раз, когда программа выполняется в Linux или Unix-подобной операционной системе, запускается процесс. «Процесс» — это имя внутреннего представления исполняемой программы в памяти компьютера. Для каждой активной программы есть свой процесс. Фактически, существует процесс почти для всего, что работает на вашем компьютере. Это включает в себя компоненты вашего графическая среда рабочего стола (GDE) такие как ГНОМ или же KDE, и система демоны которые запускаются при запуске.

Почему почти все, что работает? Ну, встроенные модули Bash, такие как CD, pwd, и псевдоним не нужно запускать (или «порождать») процесс при их запуске. Bash выполняет эти команды в экземпляре оболочки Bash, запущенной в окне вашего терминала. Эти команды бывают быстрыми именно потому, что для их выполнения не требуется запускать процесс. (Вы можете ввести help в окне терминала, чтобы увидеть список встроенных модулей Bash.)

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

Грязный пример

Начнем простой пинг трассировка работает. Мы собираемся проверить домен toadmin.ru. Это будет выполняться как процесс переднего плана.

ping www.howtogeek.com

ping www.howtogeek.com в окне терминала

Получаем ожидаемые результаты, прокручивая окно терминала вниз. Во время работы ping мы больше ничего не можем делать в окне терминала. Чтобы завершить команду, нажмите Ctrl + C.

Ctrl+C

вывод трассировки ping в окне терминала

Видимый эффект Ctrl + C выделен на скриншоте. ping дает краткую сводку, а затем останавливается.

Повторим это. Но на этот раз мы нажмем Ctrl + Z вместо Ctrl + C. Задача не будет завершена. Это станет фоновой задачей. Мы получаем возвращенный нам контроль над окном терминала.

ping www.howtogeek.com
Ctrl+Z

влияние Ctrl + Z на команду, запущенную в окне терминала

Видимый эффект нажатия Ctrl + Z выделен на скриншоте.

На этот раз нам говорят, что процесс остановлен. Остановлено не означает прекращено. Это как машина на знаке остановки. Мы его не утилизировали и не выбросили. Он все еще в дороге, неподвижен, ждет своего часа. Теперь процесс выполняется в фоновом режиме.

  Как играть в игры Sony PSP в Linux с помощью PPSSPP

Команда вакансий перечислит вакансии которые были запущены в текущем терминальном сеансе. А поскольку задания (неизбежно) являются процессами, мы также можем использовать команду ps для их просмотра. Давайте воспользуемся обеими командами и сравним их результаты. Мы будем использовать опцию T (терминал) только для вывода списка процессов, запущенных в этом окне терминала. Обратите внимание, что использовать дефис не нужно — с параметром T.

jobs
ps T

команда jobs в окне терминала

Команда jobs сообщает нам:

[1]: Число в квадратных скобках — это номер задания. Мы можем использовать это для ссылки на задание, когда нам нужно управлять им с помощью команд управления заданием.
+: Знак плюса + показывает, что это задание, которое будет выполняться, если мы используем команду управления заданием без конкретного номера задания. Это называется заданием по умолчанию. Заданием по умолчанию всегда является последнее, добавленное в список заданий.
Остановлен: процесс не запущен.
ping www.howtogeek.com: Командная строка, запустившая процесс.

Команда ps сообщает нам:

PID: идентификатор процесса. У каждого процесса есть уникальный идентификатор.
TTY: псевдотелетайп (окно терминала), из которого был выполнен процесс.
СТАТИСТИКА: статус процесса.
ВРЕМЯ: количество процессорного времени, потребляемого процессом.
КОМАНДА: команда, запустившая процесс.

Это общие значения для столбца STAT:

Д: Непрерывный сон. Процесс находится в состоянии ожидания, обычно ожидая ввода или вывода, и не может быть прерван.
I: холостой ход.
Р: Бег.
СУБЪЕКТ: Непрерывный сон.
T: Остановлен сигналом управления заданием.
З: Зомби-процесс. Процесс был остановлен, но не был «очищен» родительским процессом.

За значением в столбце STAT может следовать один из этих дополнительных индикаторов:

<: high-priority="" task="" nice="" to="" other="" processes="" n:="" low-priority="" l:="" process="" has="" pages="" locked="" into="" memory="" used="" by="" real-time="" s:="" a="" session="" leader.="" leader="" is="" that="" launched="" groups.="" shell="" multi-thread="" process.="" foreground="">Мы видим, что Bash имеет состояние Ss. Заглавная буква «S» говорит нам, что оболочка Bash спит, и ее можно прервать. Как только он нам понадобится, он ответит. Строчная буква «s» говорит нам, что оболочка является лидером сеанса.

Команда ping имеет состояние T. Это говорит нам о том, что ping был остановлен сигналом управления заданием. В этом примере мы использовали Ctrl + Z, чтобы поместить его в фон.

Команда ps T имеет состояние R, что означает выполнение. Знак + указывает на то, что этот процесс является членом группы переднего плана. Итак, команда ps T выполняется на переднем плане.

Команда bg

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

Если мы введем команду bg, мы возобновим нашу команду ping:

bg

bg в окне терминала

Команда ping возобновляется, и мы снова видим прокручиваемый вывод в окне терминала. Вам отображается имя перезапущенной команды. Это выделено на скриншоте.

  Как изменить размер тома LVM в Linux

возобновлен фоновый процесс ping с выводом в окно терминала

Но у нас есть проблема. Задача выполняется в фоновом режиме и не принимает ввод. Так как же нам это остановить? Ctrl + C ничего не делает. Мы можем видеть это, когда набираем его, но фоновая задача не получает этих нажатий клавиш, поэтому продолжает весело пинговать.

Фоновая задача, игнорирующая Ctrl + C в окне терминала

Фактически, мы сейчас находимся в странном смешанном режиме. Мы можем вводить текст в окне терминала, но то, что мы набираем, быстро сметается прокручивающимся выводом команды ping. Все, что мы набираем, вступает в силу заранее.

Чтобы остановить нашу фоновую задачу, нам нужно вывести ее на передний план, а затем остановить.

Команда fg

Команда fg выводит фоновую задачу на передний план. Как и команду bg, ее можно использовать с номером задания или без него. Использование его с номером задания означает, что он будет работать с конкретным заданием. Если он используется без номера задания, используется последняя команда, отправленная в фоновый режим.

Если мы введем fg, наша команда ping будет выведена на передний план. Вводимые символы смешиваются с выводом команды ping, но они обрабатываются оболочкой, как если бы они были введены в командной строке как обычно. Фактически, с точки зрения оболочки Bash, именно это и произошло.

fg

Команда fg смешана с выводом команды ping в окне терминала

И теперь, когда у нас снова запущена команда ping на переднем плане, мы можем использовать Ctrl + C, чтобы убить ее.

Ctrl+C

Ctrl + C остановка команды ping в окне терминала

Нам нужно посылать правильные сигналы

Это было не совсем красиво. Очевидно, что выполнение процесса в фоновом режиме работает лучше всего, когда процесс не производит вывода и не требует ввода.

Но, беспорядочно или нет, наш пример действительно выполнил:

Помещение процесса на задний план.
Восстановление процесса в работающее состояние в фоновом режиме.
Возвращение процесса на передний план.
Завершение процесса.

Когда вы используете Ctrl + C и Ctrl + Z, вы отправляете сигналы процессу. Эти стенографические способы использования команды kill. Есть 64 разных сигнала что убить может послать. Используйте kill -l в командной строке, чтобы перечислить их. kill — не единственный источник этих сигналов. Некоторые из них автоматически вызываются другими процессами в системе.

Вот некоторые из наиболее часто используемых.

SIGHUP: сигнал 1. Автоматически отправляется процессу, когда терминал, в котором он запущен, закрыт.
СИГНАЛ: сигнал 2. Отправлено процессу, нажав Ctrl + C. Процесс прерывается и требует прекращения.
SIGQUIT: сигнал 3. Отправляется процессу, если пользователь отправляет сигнал выхода Ctrl + D.
SIGKILL: Сигнал 9. Процесс немедленно завершается и не пытается полностью завершить работу. Процесс не идет изящно.
SIGTERM: сигнал 15. Это сигнал по умолчанию, отправляемый kill. Это стандартный сигнал завершения программы.
SIGTSTP: сигнал 20. Отправляется процессу, когда вы используете Ctrl + Z. Он останавливает процесс и переводит его в фоновый режим.

  Как анализировать использование жесткого диска в Linux с помощью Qdirstat

Мы должны использовать команду kill для выдачи сигналов, которым не назначены сочетания клавиш.

Дальнейший контроль работы

Процесс, перемещенный в фоновый режим с помощью Ctrl + Z, переводится в остановленное состояние. Мы должны использовать команду bg, чтобы снова запустить его. Запустить программу как работающий фоновый процесс очень просто. Добавьте амперсанд & в конец командной строки.

Хотя лучше всего, чтобы фоновые процессы не записывали в окно терминала, мы собираемся использовать примеры, которые это делают. Нам нужно, чтобы на скриншотах было что-то, на что мы могли бы ссылаться. Эта команда запустит бесконечный цикл в фоновом режиме:

пока правда; эхо «Процесс петли компьютерщикам»; сон 3; сделанный &

пока правда;  эхо

Нам сообщают номер задания и идентификатор процесса. Номер нашей работы — 1, а идентификатор процесса — 1979. Мы можем использовать эти идентификаторы для управления процессом.

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

ls

вывод процесса фонового цикла, перемежающийся с выводом других команд

Чтобы остановить наш процесс, мы можем использовать задания, чтобы напомнить себе номер задания, а затем использовать kill.

jobs сообщает, что наш процесс — это задание номер 1. Чтобы использовать это число с kill, мы должны поставить перед ним знак процента%.

jobs
kill %1

jobs и убить% 1 в окне терминала

kill отправляет процессу сигнал SIGTERM, номер 15, и он завершается. При следующем нажатии клавиши Enter отображается состояние задания. В нем процесс отмечен как «завершенный». Если процесс не отвечает на команду kill, вы можете поднять его. Используйте kill с SIGKILL, сигнал номер 9. Просто поставьте цифру 9 между командой kill и номером задания.

kill 9 %1

Вещи, которые мы покрыли

Ctrl + C: отправляет SIGINT, сигнал 2, процессу — если он принимает ввод — и сообщает ему о завершении.
Ctrl + D: отправляет SISQUIT, сигнал 3, процессу — если он принимает ввод — и приказывает ему выйти.
Ctrl + Z: отправляет SIGSTP, сигнал 20, процессу и приказывает ему остановиться (приостановить) и перейти в фоновый процесс.
jobs: перечисляет фоновые задания и показывает их номер.
bg job_number: перезапускает фоновый процесс. Если вы не укажете номер задания, используется последний процесс, который был преобразован в фоновую задачу.
fg job_number: выводит фоновый процесс на передний план и перезапускает его. Если вы не укажете номер задания, используется последний процесс, который был преобразован в фоновую задачу.
командная строка &: добавление амперсанда & в конец командной строки выполняет эту команду как фоновую задачу, которая выполняется.
kill% job_number: отправляет SIGTERM, сигнал 15, процессу для его завершения.
kill 9% job_number: отправляет SIGKILL, сигнал 9, процессу и внезапно завершает его.