SystemdDoctor

status=202/FDS в systemd

Код 202/FDS systemd выдаёт на шаге подготовки файловых дескрипторов: он закрывает всё лишнее и расставляет то, что должно достаться программе, и на этом получает отказ. Чаще всего дело в сокет-активации, когда переданные сокеты не удаётся выставить в нужные номера.

Что это значит

Перед вызовом программы systemd приводит таблицу дескрипторов в известное состояние: закрывает унаследованное, а переданные сокеты перекладывает начиная с номера 3, чтобы программа нашла их по соглашению об активации. Отказ на этом шаге почти всегда связан с окружением, а не с самой программой.

Вероятные причины

По порядку: сверху то, что встречается чаще.

  1. Сокет-активация настроена, но сокетов больше, чем службе разрешено дескрипторов

    Если LimitNOFILE= занижен, а сокет-unit передаёт несколько дескрипторов, места под них не хватает.

  2. Указан FileDescriptorStoreMax= или хранилище дескрипторов ведёт себя не так, как ожидается

    Служба просит systemd хранить дескрипторы между перезапусками, а при следующем старте восстановление не проходит — например хранилище переполнено.

  3. Служба запускается в контейнере с ограничением на дескрипторы

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

Диагностика

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

Показывает строку «Failed at step FDS spawning» с причиной от ядра — она отличает нехватку предела от отказа в доступе.

journalctl -xeu myapp.service --no-pager -n 30

Действующие пределы и связанные сокет-unit в одном выводе.

systemctl show myapp.service -p LimitNOFILE -p LimitNOFILESoft -p Sockets

Решение

Решение своё для каждой причины. Сначала определите, какая из них ваша, — иначе правки наложатся друг на друга.

1. Сокет-активация настроена, но сокетов больше, чем службе разрешено дескрипторов
Почему происходит
Если LimitNOFILE= занижен, а сокет-unit передаёт несколько дескрипторов, места под них не хватает.
Как проверить
Посмотрите действующий предел и число передаваемых сокетов.
systemctl show myapp.service -p LimitNOFILE -p Sockets
systemctl show myapp.socket -p Listen
Как исправить
Поднимите LimitNOFILE= до разумного значения (например 65535) или сократите число адресов прослушивания в сокет-unit. Значение infinity не рекомендуется: часть программ выделяет по нему память.
2. Указан FileDescriptorStoreMax= или хранилище дескрипторов ведёт себя не так, как ожидается
Почему происходит
Служба просит systemd хранить дескрипторы между перезапусками, а при следующем старте восстановление не проходит — например хранилище переполнено.
Как проверить
Посмотрите размер хранилища и текущее состояние в статусе службы (строка FD Store).
systemctl show myapp.service -p FileDescriptorStoreMax
systemctl status myapp.service | grep -i "FD Store"
Как исправить
Сбросьте сохранённые дескрипторы полной остановкой службы и запуском заново, либо уберите хранилище, если оно не нужно.
sudo systemctl stop myapp.service && sudo systemctl start myapp.service
3. Служба запускается в контейнере с ограничением на дескрипторы
Почему происходит
В контейнере жёсткий предел на процесс может быть ниже того, что требует unit-файл, и настройка дескрипторов не проходит.
Как проверить
Сравните жёсткий предел в окружении и значение в unit-файле.
ulimit -Hn
systemctl show myapp.service -p LimitNOFILE
Как исправить
Поднимите предел у самого контейнера или снизьте запрос в unit-файле до значения, которое контейнер позволяет.

Пример вывода

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

× myapp.service - My application
     Active: failed (Result: exit-code) since Mon 2026-09-14 14:02:10 MSK; 1s ago
    Process: 8120 ExecStart=/usr/local/bin/myapp (code=exited, status=202/FDS)

systemd[8120]: myapp.service: Failed at step FDS spawning /usr/local/bin/myapp: Too many open files
systemd[1]: myapp.service: Main process exited, code=exited, status=202/FDS

Связанные ошибки

  • status=205/LIMITS в systemd Код 205/LIMITS: systemd не смог применить ограничения ресурсов из Limit*=. Обычно значение недопустимо или превышает жёсткий предел.
  • Too many open files в журнале службы Служба исчерпала лимит файловых дескрипторов. Как правильно поднять LimitNOFILE и когда дело в утечке.
  • Служба не получает сокет при сокет-активации Сокет активен, служба запускается, но не находит переданный дескриптор. Разбор: Accept, FileDescriptorName, соответствие имён.
  • signal=XCPU и signal=XFSZ в systemd Процесс службы убит из-за превышения предела процессорного времени (XCPU) или размера файла (XFSZ) из LimitCPU и LimitFSIZE.
  • status=201/NICE в systemd Код 201/NICE: systemd не смог выставить приоритет процесса из Nice=. Обычно мешает предел LimitNICE или отсутствие прав.
  • status=204/MEMORY в systemd Код 204/MEMORY: systemd не смог выделить память при подготовке запуска службы. Что проверять на машине и в unit-файле.
  • status=208/STDIN в systemd Код 208/STDIN: не удалось настроить стандартный ввод службы. Обычно дело в StandardInput=tty или в отсутствующем файле.
  • Сокет и служба включены одновременно: конфликт при загрузке При сокет-активации в автозапуск включена и служба, и сокет. Порт занимает то, что стартовало первым.

Источники

  • systemd.exec(5)
    202 EXIT_FDS: не удалось закрыть ненужные дескрипторы или настроить переданные.
    официальная документация, systemd 255
    сверено 15 сентября 2026
  • systemd.socket(5)
    Соглашение о передаче дескрипторов начиная с номера 3.
    официальная документация, systemd 255
    сверено 15 сентября 2026
  • Воспроизведено на тестовой машине, systemd 255 (Ubuntu 24.04)
    Воспроизведено на службе с LimitNOFILE=4 и сокет-активацией с тремя адресами.
    собственная проверка, systemd 255
    сверено 15 сентября 2026