Процессы и службы

Что это такое

Процесс — это запущенная программа с идентификатором, пользователем-владельцем и родителем. Служба — это процесс, который система запускает при загрузке и за которым следит, перезапуская его при выходе и собирая его вывод. Всё, что делает хост — база данных, веб-сервер, плановая задача, — это одно или другое, и разница в решении о надзоре, которое кто-то принял.

Почему это важно

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

Ключевые идеи

У каждого процесса есть родитель, и дерево многое объясняет

Процессы создаются другими процессами, вплоть до самого первого, который запускает система. Процесс, чей родитель умер, усыновляется и получает нового родителя — так долго работающая задача, случайно запущенная в сессии терминала, переживает конец этой сессии. Чтение дерева показывает, что что-то запустило и что это переживёт.

инициализация системы -> супервизор -> процесс службы
                      -> оболочка входа -> ваша команда (умирает вместе с оболочкой)

Сигналы — это способ сказать процессу остановиться

Мягкий сигнал просит процесс завершиться аккуратно; жёсткий нельзя перехватить, и он уничтожает процесс немедленно. Служба, игнорирующая мягкий сигнал, теряет работу в полёте. Это тот же вопрос слива, что и в оркестрации, на уровне одного процесса, и ответ имеет ту же форму: перестать принимать новую работу, доделать то, что в полёте, затем выйти.

Надзор — вот что делает процесс службой

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

Ресурсы принадлежат процессу, а не машине

Время CPU, память и открытые файлы удерживаются процессами, и лимиты можно задать на процесс и на пользователя. Когда хост перестаёт отвечать, вопрос в том, какой процесс что потребляет, а когда процесс убит, причина от ядра — обычно исчерпание памяти — записана, и её стоит прочитать, прежде чем что-то перезапускать.

Коды возврата и вывод — это отчёт службы о себе

Служба под надзором сообщает ненулевой код возврата, когда падает, а её вывод идёт в системный журнал. Служба, завершающаяся нулём после ошибки или ничего не пишущая в лог, превращает любое позднейшее расследование в догадки. Требовать ясный код возврата и полезный вывод — небольшая дисциплина, которая окупается в худший момент.

Плановая работа — это процесс с другим триггером

Таймеры запускают команды по расписанию; это те же процессы, с той разницей, что за сбоем никто не смотрит. Направить их вывод куда-то долговечное и поднять тревогу по ненулевому коду — минимум, потому что альтернатива — задача резервного копирования, тихо падающая месяцами.

Практика

Превратите запущенный руками процесс в службу

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

Готово, когда: служба работает после перезагрузки без чьего-либо входа, и её вывод появляется в системном журнале.

Понаблюдайте за аккуратной остановкой

Пошлите службе мягкий сигнал завершения, пока она обрабатывает работу, и понаблюдайте разницу с жёстким.

Готово, когда: вы можете описать, что служба сделала с работой в полёте в каждом случае.

Частые ошибки

  • Запуск службы руками с ожиданием, что она переживёт перезагрузку — её ничто не перезапускает; исправить: объявите её под супервизором.
  • Использование жёсткого сигнала по умолчанию — запросы в полёте теряются; исправить: разрешите аккуратную остановку и дождитесь её.
  • Игнорирование причины убийства от ядра — тот же процесс будет убит снова; исправить: прочитайте журнал и займитесь исчерпанным ресурсом.
  • Плановые задачи, пишущие в никуда — сбои невидимы бесконечно; исправить: перехватывайте их вывод и поднимайте тревогу по ненулевому коду.
  • Запуск служб под неправильным пользователем — тогда модель прав не может их сдержать; исправить: дайте каждой службе свою учётную запись.

Что читать дальше