Зарегистрируйтесь для доступа к 15+ бесплатным курсам по программированию с тренажером

Процессы и сигналы Администрирование Linux

Единица работы в Linux – процесс. Каждый раз, когда мы что-то запускаем, то стартует процесс и, возможно, не один. Нормально, когда одна программа состоит из множества процессов и порождает их во время работы. Зачем это сделано? Что вообще такое процесс? Операционная система сама по себе является программой, и она управляет тем, что мы запускаем внутри неё. Процесс – это представление запущенной программы внутри операционной системы. Благодаря вытесняющей многозадачности, современные операционные системы способны запускать и исполнять сотни и больше процессов вместе. Мы привыкли слушать музыку, серфить в браузере и рядом чатиться практически одновременно, и у нас не вызывает вопросов, как это вообще возможно.

Хороший пример – браузер. У современных браузеров одна вкладка – один процесс. Такой подход позволяет переложить обеспечение одновременной работы разных вкладок на саму операционную систему. Кроме того, процессы в операционной системе изолированы друг от друга. Сбой в одном процессе, как правило, не влияет на другие процессы. Поэтому мы видим, как одна зависшая вкладка не мешает работать с другими. Раньше было не так, и зависшая вкладка приводила к полной блокировке браузера.

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

Каждому процессу внутри операционной системы соответствует структура данных, внутри которой находится вся информация по процессу. Главный параметр – PID (Process Identificator), то есть идентификатор процесса. Кроме этого там хранится информация о том, какой файл был запущен, от какого пользователя, из какой рабочей директории и так далее. Много данных, которые целиком описывают окружение запуска.

# Выводит информацию о процессах. Вывод ниже обрезан для удобства
ps aux

# Второй параметр это PID
root      606827  0:00 nginx: master process nginx -g daemon off;
systemd+  606952  0:01 nginx: worker process
root      607582  0:21 /usr/bin/node /root/.config/coc/extensions/node_modules/coc-
root      612998  0:00 /usr/bin/docker-proxy -proto tcp -host-ip 0.0.0.0 -host-port
root      613006  0:11 containerd-shim -namespace moby -workdir /var/lib/containerd
root      613024  0:00 make webpacker
root      613091  0:00 /bin/sh -c WEBPACKER_DEV_SERVER_PUBLIC=hexletdev4.com bin/we
root      613092  1:46 webpack

С процессами связано понятие сигналов, позволяющее управлять процессами или взаимодействовать с ними снаружи. Простой пример. Мы хотим завершить какую-то программу. Как это сделать? Существует сигнал SIGTERM, который говорит процессу, что его хотят завершить. Код процесса должен поймать этот сигнал и завершить своё выполнение. Отправка сигнала в Linux выглядит так:

# kill – несмотря на название не убивает, а посылает процессу сигналы
# -15 – кодовое обозначение сигнала SIGTERM
# 606827 – pid какого-то процесса
kill -15 606827

Сигнал SIGTERM не обрабатывается сам по себе. Нужно прямо написать код, который его ловит и выполняет остановку сервиса. Вот пример на JS:

// Где-нибудь во время инициализации
process.on('SIGTERM', () => {
  // например, останавливаем запущенный сервер
  server.close(() => {
    process.exit(0);
  });
});

Сигнал SIGTERM не даёт гарантии завершения. Процесс может его вообще проигнорировать или быть настолько загруженным, что он просто не успеет его выполнить за разумный срок. Поэтому в особо важных случаях используют другой сигнал – SIGKILL. Этот сигнал перехватить невозможно, он не попадает внутрь процесса. Операционная система завершает процесс, которому послан такой сигнал, принудительно, в ту же секунду. Процесс будет прерван в любом месте, а значит, скорее всего, он что-то обработает не до конца.

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


Самостоятельная работа

Потренируемся в поиске запущенного ранее процесса.

  1. Запустите веб-сервер в фоновом режиме:

    python3 -m http.server 8000 --bind 127.0.0.1 --directory /var/www/public_html > /dev/null &
    
  2. Выведите список процессов, найдите процесс веб-сервера и завершите его работу

  3. Проверьте что страница больше не открывается в браузере


Дополнительные материалы

  1. Сигнал (Unix)

Аватары экспертов Хекслета

Остались вопросы? Задайте их в разделе «Обсуждение»

Вам ответят команда поддержки Хекслета или другие студенты.

Ошибки, сложный материал, вопросы >
Нашли опечатку или неточность?

Выделите текст, нажмите ctrl + enter и отправьте его нам. В течение нескольких дней мы исправим ошибку или улучшим формулировку.

Что-то не получается или материал кажется сложным?

Загляните в раздел «Обсуждение»:

  • задайте вопрос. Вы быстрее справитесь с трудностями и прокачаете навык постановки правильных вопросов, что пригодится и в учёбе, и в работе программистом;
  • расскажите о своих впечатлениях. Если курс слишком сложный, подробный отзыв поможет нам сделать его лучше;
  • изучите вопросы других учеников и ответы на них. Это база знаний, которой можно и нужно пользоваться.

Об обучении на Хекслете

Для полного доступа к курсу нужен базовый план

Базовый план откроет полный доступ ко всем курсам, упражнениям и урокам Хекслета, проектам и пожизненный доступ к теории пройденных уроков. Подписку можно отменить в любой момент.

Получить доступ
900
упражнений
2000+
часов теории
3200
тестов

Открыть доступ

Курсы программирования для новичков и опытных разработчиков. Начните обучение бесплатно.

  • 130 курсов, 2000+ часов теории
  • 900 практических заданий в браузере
  • 360 000 студентов
Даю согласие на обработку персональных данных, соглашаюсь с «Политикой конфиденциальности» и «Условиями оказания услуг»

Наши выпускники работают в компаниях:

Логотип компании Альфа Банк
Логотип компании Aviasales
Логотип компании Yandex
Логотип компании Tinkoff

Используйте Хекслет по максимуму!

  • Задавайте вопросы по уроку
  • Проверяйте знания в квизах
  • Проходите практику прямо в браузере
  • Отслеживайте свой прогресс

Зарегистрируйтесь или войдите в свой аккаунт

Даю согласие на обработку персональных данных, соглашаюсь с «Политикой конфиденциальности» и «Условиями оказания услуг»

Изображение Тото

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