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

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

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

Введение

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

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

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

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

Перейдите в директорию проекта:

cd ~/project

Создайте файл с именем long-task.sh с помощью редактора nano:

nano long-task.sh

Добавьте в файл следующее содержимое:

#!/bin/bash
## This script simulates a long-running task
echo "Starting long task..."
for i in {1..10}; do
  echo "Processing step $i..."
  sleep 3
done
echo "Long task completed."

Нажмите Ctrl+O, а затем Enter, чтобы сохранить файл, а затем Ctrl+X, чтобы выйти из nano.

Сделайте скрипт исполняемым, изменив его права доступа:

chmod +x long-task.sh

Теперь запустите скрипт в переднем режиме:

./long-task.sh

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

Нажмите Ctrl+C, чтобы завершить выполнение скрипта до его завершения.

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

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

Запустим наш скрипт long-task.sh в фоновом режиме:

cd ~/project
./long-task.sh &

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

[1] 1234
Starting long task...
Processing step 1...

Здесь [1] - это номер задачи (job number), присвоенный оболочкой, а 1234 - это идентификатор процесса (PID - process ID). Номер задачи используется для обращения к этому фоновому процессу внутри оболочки, в то время как PID используется операционной системой для идентификации процесса.

Обратите внимание, что после начального вывода вы получаете обратно командную строку. Теперь вы можете продолжать вводить другие команды, пока скрипт выполняется в фоновом режиме.

Например, попробуйте создать другой файл:

echo "I can do other work while the script runs" > background-demo.txt
cat background-demo.txt

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

Проверка фоновых процессов

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

Использование команды jobs

Команда jobs показывает статус всех фоновых задач в текущем сеансе оболочки:

jobs

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

[1]+  Running    ./long-task.sh &

Знак + указывает, что это текущая задача по умолчанию, то есть на нее будут действовать команды, такие как fg или bg, если вы не укажете номер задачи.

Использование команды ps

В то время как команда jobs показывает только процессы, запущенные из текущей оболочки, команда ps может показать все процессы, запущенные в системе:

ps aux | grep long-task.sh

В выводе должен быть ряд, соответствующий вашему фоновому скрипту:

labex     1234  0.0  0.0   4508  1996 pts/0    S    12:34   0:00 /bin/bash ./long-task.sh

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

cd ~/project
nano another-task.sh

Добавьте следующее содержимое:

#!/bin/bash
## This script simulates another task
echo "Starting another task..."
for i in {1..20}; do
  echo "Another task - step $i..."
  sleep 5
done
echo "Another task completed."

Сохраните и выйдите из nano (Ctrl+O, Enter, Ctrl+X), затем сделайте скрипт исполняемым:

chmod +x another-task.sh

Запустите этот скрипт также в фоновом режиме:

./another-task.sh &

Теперь снова проверьте свои фоновые задачи:

jobs

Вы должны увидеть обе задачи в списке:

[1]-  Running    ./long-task.sh &
[2]+  Running    ./another-task.sh &

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

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

Перемещение фонового процесса в передний план

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

Переместим нашу первую задачу в передний план:

fg %1

%1 относится к задаче с номером 1. Теперь вы увидите вывод скрипта long-task.sh в терминале, и командная строка будет недоступна до завершения процесса или его остановки.

Чтобы прервать процесс и вернуться к командной строке, нажмите Ctrl+C.

Перемещение процесса из переднего плана в фон

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

Запустите новый процесс в переднем плане:

cd ~/project
./long-task.sh

Через несколько секунд нажмите Ctrl+Z, чтобы приостановить процесс. Вы увидите сообщение, подобное следующему:

[1]+  Stopped    ./long-task.sh

Теперь продолжите его выполнение в фоновом режиме:

bg

Процесс продолжит выполнение в фоновом режиме, и вы увидите:

[1]+ ./long-task.sh &

Вы можете проверить, что процесс запущен, с помощью команды:

jobs

Завершение фоновых процессов

Для завершения фонового процесса вы можете использовать команду kill с номером задачи или идентификатором процесса (PID):

kill %1

Или используя PID (замените 1234 на фактический PID из вывода команды ps):

kill 1234

Чтобы проверить, что процесс был завершен:

jobs

Вы, возможно, увидите сообщение, указывающее, что задача была завершена:

[1]+  Terminated    ./long-task.sh

Запуск процессов после выхода из системы

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

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

cd ~/project
nano persistent-task.sh

Добавьте следующее содержимое:

#!/bin/bash
## This script runs for a very long time
echo "Starting persistent task at $(date)" > persistent-output.log
for i in {1..100}; do
  echo "Iteration $i at $(date)" >> persistent-output.log
  sleep 10
done
echo "Persistent task completed at $(date)" >> persistent-output.log

Сохраните и выйдите из nano, затем сделайте скрипт исполняемым:

chmod +x persistent-task.sh

Теперь запустите его с помощью nohup и отправьте в фон:

nohup ./persistent-task.sh &

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

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

Это означает, что процесс запущен в фоновом режиме и будет продолжать работать даже после выхода из системы. Вывод, который обычно отправляется в терминал, перенаправляется в файл nohup.out.

Вы можете проверить, запущен ли процесс:

ps aux | grep persistent-task.sh

И вы можете просмотреть файл вывода:

cat persistent-output.log

Вывод показывает время начала и итерации долгоживущего задания.

Команда disown

Другой способ сохранить запущенными процессы после выхода из системы - использовать команду disown. Сначала запустите процесс в фоновом режиме:

cd ~/project
./persistent-task.sh &

Затем используйте disown, чтобы отвязать его от терминала:

disown %1

Теперь этот процесс будет продолжать работать даже после закрытия терминала.

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

Резюме

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

  1. Создании и выполнении скриптов как в переднем, так и в фоновом режиме
  2. Запуске процессов в фоновом режиме с использованием оператора &
  3. Проверке статуса фоновых процессов с помощью команд jobs и ps
  4. Управлении процессами с помощью команд fg и bg для перемещения их между передним и фоновым режимами
  5. Завершении фоновых процессов с помощью команды kill
  6. Запуске процессов, которые продолжают работать после выхода из системы, с использованием команд nohup и disown

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