Процессы и службы
Что это такое
Процесс — это запущенная программа с идентификатором, пользователем-владельцем и родителем. Служба — это процесс, который система запускает при загрузке и за которым следит, перезапуская его при выходе и собирая его вывод. Всё, что делает хост — база данных, веб-сервер, плановая задача, — это одно или другое, и разница в решении о надзоре, которое кто-то принял.
Почему это важно
Классический отказ хоста — процесс, отлично работавший, когда его запускали руками, и не вернувшийся после перезагрузки, потому что за ним никто не следил. Второй классический отказ — служба, перезапускающаяся без конца и прячущая ошибку в выводе, которого никто не читает. Понимание состояний процессов, сигналов и надзора превращает оба из загадок в обычную диагностику, и это ещё и модель, на которой построены контейнерные платформы и системы оркестрации.
Ключевые идеи
У каждого процесса есть родитель, и дерево многое объясняет
Процессы создаются другими процессами, вплоть до самого первого, который запускает система. Процесс, чей родитель умер, усыновляется и получает нового родителя — так долго работающая задача, случайно запущенная в сессии терминала, переживает конец этой сессии. Чтение дерева показывает, что что-то запустило и что это переживёт.
инициализация системы -> супервизор -> процесс службы
-> оболочка входа -> ваша команда (умирает вместе с оболочкой)
Сигналы — это способ сказать процессу остановиться
Мягкий сигнал просит процесс завершиться аккуратно; жёсткий нельзя перехватить, и он уничтожает процесс немедленно. Служба, игнорирующая мягкий сигнал, теряет работу в полёте. Это тот же вопрос слива, что и в оркестрации, на уровне одного процесса, и ответ имеет ту же форму: перестать принимать новую работу, доделать то, что в полёте, затем выйти.
Надзор — вот что делает процесс службой
Супервизор запускает процесс при загрузке, перезапускает его при выходе, перехватывает его вывод и хранит его конфигурацию. Как только служба объявлена там, перезапуск, проверка состояния и чтение её логов — по одной команде каждое, поэтому запущенные руками процессы — ложная экономия.
Ресурсы принадлежат процессу, а не машине
Время CPU, память и открытые файлы удерживаются процессами, и лимиты можно задать на процесс и на пользователя. Когда хост перестаёт отвечать, вопрос в том, какой процесс что потребляет, а когда процесс убит, причина от ядра — обычно исчерпание памяти — записана, и её стоит прочитать, прежде чем что-то перезапускать.
Коды возврата и вывод — это отчёт службы о себе
Служба под надзором сообщает ненулевой код возврата, когда падает, а её вывод идёт в системный журнал. Служба, завершающаяся нулём после ошибки или ничего не пишущая в лог, превращает любое позднейшее расследование в догадки. Требовать ясный код возврата и полезный вывод — небольшая дисциплина, которая окупается в худший момент.
Плановая работа — это процесс с другим триггером
Таймеры запускают команды по расписанию; это те же процессы, с той разницей, что за сбоем никто не смотрит. Направить их вывод куда-то долговечное и поднять тревогу по ненулевому коду — минимум, потому что альтернатива — задача резервного копирования, тихо падающая месяцами.
Практика
Превратите запущенный руками процесс в службу
Возьмите долго работающую команду, которую сейчас запускают руками, объявите её службой с правильным пользователем, поведением перезапуска и местом вывода, и перезагрузите хост.
Готово, когда: служба работает после перезагрузки без чьего-либо входа, и её вывод появляется в системном журнале.
Понаблюдайте за аккуратной остановкой
Пошлите службе мягкий сигнал завершения, пока она обрабатывает работу, и понаблюдайте разницу с жёстким.
Готово, когда: вы можете описать, что служба сделала с работой в полёте в каждом случае.
Частые ошибки
- Запуск службы руками с ожиданием, что она переживёт перезагрузку — её ничто не перезапускает; исправить: объявите её под супервизором.
- Использование жёсткого сигнала по умолчанию — запросы в полёте теряются; исправить: разрешите аккуратную остановку и дождитесь её.
- Игнорирование причины убийства от ядра — тот же процесс будет убит снова; исправить: прочитайте журнал и займитесь исчерпанным ресурсом.
- Плановые задачи, пишущие в никуда — сбои невидимы бесконечно; исправить: перехватывайте их вывод и поднимайте тревогу по ненулевому коду.
- Запуск служб под неправильным пользователем — тогда модель прав не может их сдержать; исправить: дайте каждой службе свою учётную запись.
Что читать дальше
- Пользователи и права (06-cloud-devops/09-linux-administration/01-users-and-permissions) — идентичность, под которой работают эти процессы.
- Администрирование Linux (06-cloud-devops/09-linux-administration) — хост, на котором живут эти службы.
- Файловая система (06-cloud-devops/09-linux-administration/03-the-filesystem) — где службы читают и пишут и что заполняется, когда за этим не следят.