Введение
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 600
echo "Process completed"
Этот скрипт:
- Выводит начальное сообщение
- Приостанавливается на 10 минут (имитируя трудоемкую задачу)
- Выводит сообщение о завершении
Чтобы сохранить файл в nano:
- Нажмите
Ctrl+O, чтобы записать файл - Нажмите
Enter, чтобы подтвердить имя файла - Нажмите
Ctrl+X, чтобы выйти из nano
Далее, нам нужно сделать скрипт исполняемым:
chmod +x ~/project/long_running.sh
Теперь давайте сначала выполним скрипт в основном (foreground) режиме, чтобы увидеть, как он работает:
./long_running.sh
Вы увидите:
Starting a long process...
Обратите внимание, что ваш терминал теперь занят в течение 15 секунд, пока скрипт не завершится. Вы не можете вводить новые команды в течение этого времени.
Теперь давайте запустим тот же скрипт в фоновом режиме, добавив амперсанд (&) в конце:
./long_running.sh &
Вы увидите вывод, похожий на:
[1] 1234
Starting a long process...
Вывод показывает:
[1]- номер задания, присвоенный оболочкой (shell)1234- идентификатор процесса (PID), который будет другим числом в вашей системе- Начальное сообщение скрипта
Несмотря на то, что скрипт все еще выполняется, ваша командная строка (shell prompt) возвращается немедленно, позволяя вам вводить новые команды. Через 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...
Обратите внимание, что приглашение оболочки не возвращается - терминал теперь занят этим процессом, запущенным в переднем плане.
Чтобы приостановить этот процесс и восстановить контроль над терминалом:
- Нажмите
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:
Запуск фоновых процессов: Вы узнали, как запускать процессы в фоновом режиме с использованием оператора
&, что позволяет вам продолжать использовать терминал, пока процесс выполняется.Просмотр фоновых процессов: Вы использовали команду
jobsдля просмотра всех фоновых процессов, запущенных в текущей сессии терминала.Перемещение процессов между передним и фоновым планами: Вы практиковали использование комбинации
Ctrl+Zдля приостановки процесса, командыbgдля продолжения его выполнения в фоновом режиме и командыfgдля перемещения его в передний план.Продолжение выполнения процессов после закрытия терминала: Вы использовали команду
nohupдля того, чтобы процессы продолжали выполняться даже после завершения сессии терминала.
Эти навыки являются важными для эффективного мультизадачности в Linux-окружениях. Они позволяют вам запускать несколько процессов одновременно, эффективно использовать ресурсы терминала, поддерживать выполнение длительных процессов без необходимости оставлять терминалы открытыми и управлять состояниями выполнения процессов.
С использованием этих методов вы можете работать более эффективно и продуктивно в Linux-окружениях командной строки, будь то управление серверами, разработка приложений или выполнение задач по системному администрированию.



