Управление фоновыми процессами в Linux

LinuxLinuxBeginner
Практиковаться сейчас

💡 Этот учебник переведен с английского с помощью ИИ. Чтобы просмотреть оригинал, вы можете перейти на английский оригинал

Введение

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

В этом практическом занятии (лабораторной работе) вы научитесь основным техникам управления фоновыми процессами в системах Linux. Эти навыки являются важными для эффективного мультизадачности в командной строке и регулярно используются системными администраторами и разработчиками.

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

Запуск процесса в фоновом режиме

В Linux вы можете запустить команду в фоновом режиме, добавив символ амперсанда (&) в конец команды. Это сообщает оболочке (shell) запустить процесс в фоновом режиме, что позволяет вам продолжать использовать терминал, пока выполняется команда.

Давайте создадим и запустим простой скрипт, который имитирует длительный процесс.

Сначала убедитесь, что вы находитесь в директории проекта:

cd ~/project

Теперь создадим файл скрипта с именем long_running.sh с помощью текстового редактора nano:

nano ~/project/long_running.sh

Когда откроется редактор nano, введите следующий код:

#!/bin/bash
echo "Starting a long process..."
sleep 15
echo "Process completed"

Этот скрипт:

  1. Выводит сообщение о начале выполнения
  2. Приостанавливается на 15 секунд (имитируя затратную по времени задачу)
  3. Выводит сообщение о завершении

Чтобы сохранить файл в nano:

  1. Нажмите Ctrl + O для записи файла
  2. Нажмите Enter для подтверждения имени файла
  3. Нажмите Ctrl + X для выхода из nano

Далее нам нужно сделать скрипт исполняемым:

chmod +x ~/project/long_running.sh

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

./long_running.sh

Вы увидите:

Starting a long process...

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

Теперь давайте запустим тот же скрипт в фоновом режиме, добавив амперсанд (&) в конце:

./long_running.sh &

Вы увидите вывод, похожий на следующий:

[1] 1234
Starting a long process...

Вывод показывает:

  • [1] - номер задания (job number), присвоенный оболочкой
  • 1234 - идентификатор процесса (PID), который будет другим на вашей системе
  • Сообщение о начале выполнения скрипта

Даже если скрипт все еще выполняется, приглашение оболочки возвращается сразу, позволяя вам вводить новые команды. Через 15 секунд вы увидите появление сообщения о завершении:

Process completed
[1]+  Done                    ./long_running.sh

Это подтверждает, что фоновый процесс завершил свое выполнение.

Просмотр фоновых процессов

После запуска процессов в фоновом режиме вам нужно знать, как отслеживать их. Linux предоставляет команду jobs для отображения всех фоновых процессов, запущенных в текущей сессии терминала.

Давайте запустим несколько фоновых процессов и затем посмотрим на них:

## Start the first background process
./long_running.sh &

Вы увидите вывод, похожий на следующий:

[1] 1234
Starting a long process...

Теперь запустим второй фоновый процесс:

## Start the second background process
./long_running.sh &

Вы увидите вывод, похожий на следующий:

[2] 1235
Starting a long process...

Чтобы увидеть все свои фоновые процессы (задания), используйте команду jobs:

jobs

Вы должны увидеть вывод, похожий на следующий:

[1]  Running                 ./long_running.sh &
[2]- Running                 ./long_running.sh &

Это показывает, что у вас запущено два фоновых задания. Числа в квадратных скобках - это идентификаторы заданий (job IDs), которые вы можете использовать для обращения к конкретным заданиям с помощью других команд.

Команда jobs поддерживает несколько полезных опций:

  • jobs -l - отображает идентификаторы процессов (process IDs) вместе с информацией о заданиях
  • jobs -p - отображает только идентификаторы процессов заданий

Попробуйте опцию -l, чтобы увидеть больше деталей:

jobs -l

Вывод будет включать идентификаторы процессов:

[1]  1234 Running                 ./long_running.sh &
[2]- 1235 Running                 ./long_running.sh &

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

Process completed
[1]+  Done                    ./long_running.sh
Process completed
[2]+  Done                    ./long_running.sh

Перемещение процессов между передним и фоновым планами

Linux позволяет перемещать процессы между состояниями переднего и фонового планов. Это особенно полезно, когда:

  • Вы запустили процесс в переднем плане и вам нужно использовать терминал для других задач
  • Вы хотите переместить фоновый процесс в передний план, чтобы взаимодействовать с ним

Давайте научимся делать это с помощью команд fg (foreground - передний план) и bg (background - фоновый план), а также с использованием приостановки процессов.

Сначала запустим наш скрипт с длительным выполнением в переднем плане (без &):

./long_running.sh

Вы увидите:

Starting a long process...

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

Чтобы приостановить этот процесс и восстановить контроль над терминалом:

  1. Нажмите Ctrl + Z

Вы увидите вывод, похожий на следующий:

^Z
[1]+  Stopped                 ./long_running.sh

Процесс теперь приостановлен и не выполняется. Вы можете убедиться в этом с помощью команды jobs:

jobs

Вывод:

[1]+  Stopped                 ./long_running.sh

Чтобы продолжить выполнение приостановленного процесса в фоновом режиме, используйте команду bg:

bg %1

%1 относится к номеру задания 1. Вы увидите:

[1]+ ./long_running.sh &

Процесс теперь выполняется в фоновом режиме. Подтвердите это с помощью команды jobs:

jobs

Вывод:

[1]+  Running                 ./long_running.sh &

Чтобы переместить фоновый процесс в передний план, используйте команду fg:

fg %1

Процесс теперь снова будет выполняться в переднем плане, и терминал будет занят до его завершения:

./long_running.sh
Process completed

После завершения процесса приглашение оболочки вернется.

Продолжение выполнения процессов после закрытия терминала

Когда вы запускаете процесс в фоновом режиме с помощью &, он завершится, если вы закроете терминал. Чтобы процесс продолжал выполняться даже после закрытия терминала, вы можете использовать команду nohup.

nohup (сокращение от "no hang up" - не отключать) предотвращает получение процессом сигнала SIGHUP (отключение), который отправляется процессам при закрытии терминала.

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

nano ~/project/long_running.sh

Обновите содержимое до следующего:

#!/bin/bash
echo "Starting a very long process..."
sleep 60
echo "Process completed" > ~/project/completed.txt

Сохраните и выйдите из nano (Ctrl+O, Enter, Ctrl+X).

Теперь запустим скрипт с использованием nohup:

nohup ./long_running.sh &

Вы увидите вывод, похожий на следующий:

[1] 1234
nohup: ignoring input and appending output to 'nohup.out'

Вывод скрипта не будет отображаться в терминале. Вместо этого он будет перенаправлен в файл с именем nohup.out. Вы можете проверить этот файл:

cat nohup.out

Вы должны увидеть:

Starting a very long process...

Даже если вы закроете терминал сейчас, процесс продолжит выполняться. По завершении он запишет данные как в nohup.out, так и в completed.txt.

Чтобы увидеть процессы, запущенные в фоновом режиме во всех терминалах, используйте команду ps:

ps aux | grep long_running.sh

Вы увидите что-то вроде этого:

labex     1234  0.0  0.0   8160   736 pts/0    S    12:34   0:00 /bin/bash ./long_running.sh
labex     1235  0.0  0.0  14428  1020 pts/0    S+   12:34   0:00 grep --color=auto long_running.sh

Подождите, пока процесс завершится (или завершите его, если хотите):

## If you want to terminate the process:
kill %1

Резюме

В этом практическом занятии вы изучили важные методы управления фоновыми процессами в Linux:

  1. Запуск фоновых процессов: Вы узнали, как запускать процессы в фоновом режиме с использованием оператора &, что позволяет вам продолжать использовать терминал, пока процесс выполняется.

  2. Просмотр фоновых процессов: Вы использовали команду jobs для просмотра всех фоновых процессов, запущенных в текущей сессии терминала.

  3. Перемещение процессов между передним и фоновым планами: Вы практиковали использование комбинации Ctrl+Z для приостановки процесса, команды bg для продолжения его выполнения в фоновом режиме и команды fg для перемещения его в передний план.

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

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

С использованием этих методов вы можете работать более эффективно и продуктивно в Linux-окружениях командной строки, будь то управление серверами, разработка приложений или выполнение задач по системному администрированию.