Введение
В этом практическом занятии (лабораторной работе) вы научитесь основам управления задачами в Linux. Управление задачами - это важный навык для пользователей Linux, который позволяет запускать несколько процессов одновременно и контролировать их выполнение. Освоив управление задачами, вы сможете эффективно запускать команды в фоновом режиме, переключаться между задачами в переднем и фоновом режимах и контролировать все запущенные процессы.
В рамках этого практического занятия вы научитесь:
- Как запускать процессы в фоновом режиме
- Как просматривать и управлять запущенными задачами
- Как перевести фоновые задачи в передний план
- Как приостанавливать запущенные задачи и возобновлять их позже
- Как завершать задачи, когда они больше не нужны
Эти навыки особенно полезны при работе с длительно выполняющимися задачами, которые не требуют постоянного взаимодействия, что позволяет вам продолжать работу над другими задачами, пока процессы выполняются в фоновом режиме.
Запуск и управление фоновыми задачами
На этом этапе вы научитесь запускать процесс в фоновом режиме с использованием символа амперсанда (&) и управлять им с помощью команды jobs.
Что такое фоновая задача?
В Linux задача представляет собой процесс, который управляет оболочка (shell). По умолчанию, когда вы запускаете команду в терминале, она выполняется в переднем плане - это означает, что ваш терминал занят до завершения выполнения команды. Однако, добавив символ & в конце команды, вы можете запустить ее в фоновом режиме, освободив терминал для выполнения других задач.
Создание фонового процесса
Создадим простой скрипт, который будет непрерывно работать в фоновом режиме. Это имитирует длительно выполняющуюся задачу, которую вы, возможно, захотите запустить, продолжая работать над другими вещами.
Сначала перейдите в директорию проекта, если вы еще не находитесь в ней:
cd ~/project
Теперь создайте скрипт с именем background_task.sh с помощью текстового редактора nano:
nano ~/project/background_task.sh
Внутри редактора добавьте следующее содержимое:
#!/bin/bash
## A simple script that simulates a long-running task
count=0
while true; do
count=$((count + 1))
echo "Task running: iteration $count"
sleep 5
done
Этот скрипт будет выполняться бесконечно, выводя сообщение каждые 5 секунд.
Нажмите Ctrl+O, а затем Enter, чтобы сохранить файл, а затем Ctrl+X, чтобы выйти из nano.
Далее, сделайте скрипт исполняемым:
chmod +x ~/project/background_task.sh
Теперь запустите скрипт в фоновом режиме, добавив символ & в конце команды:
~/project/background_task.sh &
Вы должны увидеть вывод, похожий на следующий:
[1] 1234
Число в квадратных скобках [1] - это номер задачи, а число после него - это идентификатор процесса (PID). Эти числа могут отличаться на вашей системе.
Проверка запущенных задач
Чтобы просмотреть все текущие фоновые задачи, используйте команду jobs:
jobs
Вы должны увидеть вывод, похожий на следующий:
[1] + running ~/project/background_task.sh
Это подтверждает, что ваш скрипт выполняется в фоновом режиме.
Чтобы получить более подробную информацию о задаче, включая ее PID, используйте:
jobs -l
Вывод должен показать номер задачи, PID и статус:
[1] + 1234 running ~/project/background_task.sh
Ваш терминал остается свободным для выполнения других команд, в то время как скрипт продолжает выполняться в фоновом режиме. Выходные данные скрипта по-прежнему отправляются в терминал, поэтому вы будете периодически видеть появляющиеся сообщения.
Перевод фоновых задач в передний план
На этом этапе вы научитесь переводить фоновую задачу в передний план с помощью команды fg. Это полезно, когда вам нужно взаимодействовать с процессом, который в данный момент выполняется в фоновом режиме.
Что такое перевод в передний план?
Перевод в передний план - это процесс, при котором фоновая задача становится активной в терминале. Когда задача находится в переднем плане, она имеет контроль над терминалом - вы можете напрямую взаимодействовать с ней, но не сможете запускать другие команды, пока задача не завершится или не будет перемещена обратно в фон.
Использование команды fg
Убедитесь, что скрипт background_task.sh, запущенный на предыдущем этапе, все еще выполняется. Вы можете проверить это с помощью команды:
jobs
В списке запущенных задач должен быть ваш скрипт.
Чтобы перевести задачу в передний план, используйте команду fg, за которой следует номер задачи с знаком процента:
fg %1
Если у вас есть только одна фоновая задача, вы можете просто использовать:
fg
После выполнения команды скрипт будет переведен в передний план, и вы увидите его вывод прямо в терминале:
Task running: iteration X
Task running: iteration X+1
...
Вы заметите, что приглашение для ввода команд исчезнет, и теперь скрипт имеет контроль над терминалом. Вы больше не сможете вводить другие команды, пока не завершите скрипт или не переведете его обратно в фон.
Остановка задачи в переднем плане
Чтобы остановить задачу в переднем плане и вернуться к приглашению для ввода команд, нажмите Ctrl+C. Это отправит сигнал прерывания процессу, что приведет к его завершению.
^C
Терминал должен отобразить сообщение о том, что задача была завершена, и вы снова увидите приглашение для ввода команд.
Чтобы убедиться, что задача больше не выполняется, выполните команду:
jobs
Должен быть пустой вывод, что означает, что нет запущенных фоновых задач.
Запустим наш скрипт в фоновом режиме еще раз для следующего этапа:
~/project/background_task.sh &
Вы должны увидеть подтверждение запуска задачи с выводом, похожим на следующий:
[1] 1345
Помните, что номер задачи и PID могут отличаться на вашей системе.
Приостановка и возобновление задач
На этом этапе вы научитесь приостанавливать запущенную задачу в переднем плане и продолжать ее выполнение либо в переднем, либо в фоновом режиме. Это полезно, когда вам нужно временно приостановить процесс без его завершения.
Приостановка задачи в переднем плане
Сначала переведем нашу фоновую задачу в передний план:
fg %1
Теперь вы должны увидеть вывод скрипта в терминале. Чтобы приостановить эту задачу в переднем плане, нажмите Ctrl+Z:
^Z
Вы должны увидеть сообщение, похожее на следующее:
[1] + suspended ~/project/background_task.sh
Это означает, что задача была приостановлена. Задача по-прежнему загружена в память, но не выполняется - она, по сути, "на паузе".
Чтобы убедиться, что задача приостановлена, выполните команду:
jobs
Вы должны увидеть вывод, похожий на следующий:
[1] + suspended ~/project/background_task.sh
Продолжение приостановленной задачи в фоновом режиме
Вы можете продолжить выполнение приостановленной задачи либо в переднем, либо в фоновом режиме. Чтобы продолжить ее в фоновом режиме, используйте команду bg, за которой следует номер задачи:
bg %1
Вы должны увидеть сообщение, подтверждающее, что задача продолжена в фоновом режиме:
[1] + continued ~/project/background_task.sh
Убедитесь, что задача теперь выполняется в фоновом режиме:
jobs
Вывод должен показать, что статус задачи изменился с "suspended" (приостановлена) на "running" (выполняется):
[1] + running ~/project/background_task.sh
Продолжение приостановленной задачи в переднем плане
Приостановим задачу еще раз. Сначала переведем ее в передний план:
fg %1
Затем нажмите Ctrl+Z, чтобы приостановить ее:
^Z
Теперь, вместо использования bg для продолжения задачи в фоновом режиме, используйте fg для продолжения ее в переднем плане:
fg %1
Задача продолжит выполнение, и вы снова увидите ее вывод в терминале.
Остановим задачу, нажав Ctrl+C:
^C
Это завершит задачу и вернет вас к приглашению для ввода команд.
Использование управления задачами в вашем рабочем процессе
Возможность приостанавливать, продолжать в фоновом и переднем планах, а также завершать задачи дает вам мощный контроль над процессами. Этот рабочий процесс особенно полезен, когда:
- Вам нужно проверить что-то еще, пока процесс выполняется.
- Вам нужно временно освободить системные ресурсы.
- Вы хотите запустить несколько процессов с возможностью взаимодействия без открытия нескольких окон терминала.
Для следующего этапа запустите фоновую задачу снова:
~/project/background_task.sh &
Завершение фоновых задач
На этом этапе вы узнаете различные способы завершения фоновых задач, когда они больше не нужны. Корректное завершение задач важно для освобождения системных ресурсов и поддержания производительности системы.
Определение задач для завершения
Сначала проверим, какие задачи в настоящее время выполняются:
jobs
Вы должны увидеть, что ваша фоновая задача запущена:
[1] + running ~/project/background_task.sh
Если вы хотите получить более подробную информацию, включая идентификатор процесса (PID), используйте:
jobs -l
Это выведет информацию, похожую на следующую:
[1] + 1456 running ~/project/background_task.sh
Обратите внимание на PID (число после номера задачи), так как его можно использовать для завершения процесса.
Метод 1: Завершение задачи с использованием ее номера
Самый простой способ завершить фоновую задачу - использовать команду kill с номером задачи:
kill %1
Проверьте, была ли задача завершена:
jobs
Вы, возможно, увидите:
[1] + terminated ~/project/background_task.sh
Если задача все еще выполняется (некоторые процессы могут потребовать более сильного сигнала завершения), вы можете использовать:
kill -9 %1
Флаг -9 отправляет сигнал SIGKILL, который принудительно завершает процесс без возможности его корректного завершения.
Метод 2: Завершение задачи с использованием ее PID
Запустим еще один экземпляр нашего скрипта в фоновом режиме:
~/project/background_task.sh &
Вы должны увидеть вывод, показывающий номер задачи и PID:
[1] 1567
Чтобы завершить эту задачу, используя ее PID, введите:
kill 1567
Замените 1567 на фактический PID вашей задачи.
Проверьте, что задача была завершена:
jobs
Метод 3: Использование имени процесса с командой killall
Запустим еще один экземпляр нашего скрипта:
~/project/background_task.sh &
Если у вас запущено несколько экземпляров одного и того же процесса, вы можете завершить их все сразу, используя команду killall:
killall background_task.sh
Эта команда завершает все процессы с именем background_task.sh.
Проверьте, что больше нет запущенных задач:
jobs
Должен быть пустой вывод, что означает, что все фоновые задачи были завершены.
Понимание сигналов завершения
При использовании команды kill вы отправляете сигнал процессу. По умолчанию команда kill отправляет сигнал SIGTERM (сигнал 15), который просит процесс корректно завершиться. Если процесс не реагирует на SIGTERM, вы можете использовать SIGKILL (сигнал 9) для принудительного завершения:
kill -TERM %1 ## То же, что и kill %1
kill -KILL %1 ## То же, что и kill -9 %1
Другие полезные сигналы включают:
- SIGHUP (сигнал 1): Часто используется для перезагрузки файлов конфигурации.
- SIGINT (сигнал 2): То же, что нажатие Ctrl+C.
- SIGSTOP (сигнал 19): Приостанавливает процесс (не может быть перехвачен или проигнорирован).
- SIGCONT (сигнал 18): Продолжает остановленный процесс.
Для последней демонстрации запустим нашу фоновую задачу еще раз и затем завершим ее:
~/project/background_task.sh &
jobs
kill %1
jobs
Эта последовательность запускает задачу, подтверждает, что она запущена, завершает ее и затем проверяет, что она больше не выполняется.
Резюме
В этом практическом занятии вы научились важным навыкам управления задачами в среде Linux:
Запуск фоновых задач: Вы узнали, как запускать процессы в фоновом режиме с использованием символа
&, что позволяет вам продолжать работу в терминале, пока выполняются длительные задачи.Проверка статуса задач: Вы использовали команду
jobsдля просмотра информации о запущенных задачах, включая их состояние, номер задачи и идентификатор процесса.Перевод фоновых задач в передний план: Вы практиковали перевод фоновых задач в передний план с помощью команды
fg, что позволяет вам напрямую взаимодействовать с ними.Приостановка и продолжение задач: Вы научились приостанавливать запущенные задачи в переднем плане с помощью
Ctrl+Zи продолжать их выполнение либо в переднем (fg), либо в фоновом (bg) режиме.Завершение задач: Вы изучили различные способы завершения задач, когда они больше не нужны, включая использование команды
killс номерами задач или PID, а также использованиеkillallдля завершения нескольких процессов по имени.
Эти навыки управления задачами ценны для любого пользователя Linux, особенно при работе с длительными процессами или при многозадачности в терминальной среде. Управляя тем, как и когда процессы запускаются, вы можете более эффективно использовать системные ресурсы и оптимизировать свой рабочий процесс.
Не забывайте, что с командой kill можно использовать различные сигналы для управления поведением процессов, от корректного завершения до принудительного завершения, что дает вам детальный контроль над процессами системы.



