status=202/FDS в systemd
Код 202/FDS systemd выдаёт на шаге подготовки файловых дескрипторов: он закрывает всё лишнее и расставляет то, что должно достаться программе, и на этом получает отказ. Чаще всего дело в сокет-активации, когда переданные сокеты не удаётся выставить в нужные номера.
Что это значит
Перед вызовом программы systemd приводит таблицу дескрипторов в известное состояние: закрывает унаследованное, а переданные сокеты перекладывает начиная с номера 3, чтобы программа нашла их по соглашению об активации. Отказ на этом шаге почти всегда связан с окружением, а не с самой программой.
Вероятные причины
По порядку: сверху то, что встречается чаще.
-
Сокет-активация настроена, но сокетов больше, чем службе разрешено дескрипторов
Если
LimitNOFILE=занижен, а сокет-unit передаёт несколько дескрипторов, места под них не хватает. -
Указан
FileDescriptorStoreMax=или хранилище дескрипторов ведёт себя не так, как ожидаетсяСлужба просит systemd хранить дескрипторы между перезапусками, а при следующем старте восстановление не проходит — например хранилище переполнено.
-
Служба запускается в контейнере с ограничением на дескрипторы
В контейнере жёсткий предел на процесс может быть ниже того, что требует 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Решение
Решение своё для каждой причины. Сначала определите, какая из них ваша, — иначе правки наложатся друг на друга.
- Почему происходит
- Если
LimitNOFILE=занижен, а сокет-unit передаёт несколько дескрипторов, места под них не хватает.
- Как проверить
-
Посмотрите действующий предел и число передаваемых сокетов.
systemctl show myapp.service -p LimitNOFILE -p Sockets systemctl show myapp.socket -p Listen
- Как исправить
-
Поднимите
LimitNOFILE=до разумного значения (например 65535) или сократите число адресов прослушивания в сокет-unit. Значение infinity не рекомендуется: часть программ выделяет по нему память.
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
- Почему происходит
- В контейнере жёсткий предел на процесс может быть ниже того, что требует 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.socket(5)
Соглашение о передаче дескрипторов начиная с номера 3. -
Воспроизведено на тестовой машине, systemd 255 (Ubuntu 24.04)
Воспроизведено на службе с LimitNOFILE=4 и сокет-активацией с тремя адресами.