#Как распознать проблему и где применимы действия
Служба не может открыть Unix-сокет или подключиться к нему. Это не обязательно ошибка network: у файлового сокета свои права, владелец, каталог и активатор *.socket. Перед выполнением определите название программы, редакцию Linux и управляющий сервис. Значения примеров в командах не являются готовой конфигурацией вашего устройства.
#Возможные причины и диагностические признаки
| Возможная причина | Как узнать | Что делать |
|---|---|---|
| Доступ к файлу сокета закрыт | Ошибка EACCES при connect или bind | Проверить владельца, режим файла и каталог |
| Сокет занят другой службой | Журнал содержит Address already in use | Определить владельца через ss, не удалять файл наугад |
| Сокет создаёт отдельный .socket unit | Есть активный сокет-юнит с ListenStream и SocketMode | Менять настройки владельца в socket unit, не в service |
#Пошаговая диагностика и исправление
- Шаг 1. Уточните сокет по журналуЗапишите точный путь /run/..., упомянутый в сообщении. Permission denied и Address already in use требуют противоположных действий. Если журнал содержит только системный код, включите предусмотренную приложением диагностику.
- Терминал Linux на сервере/клиенте, указанном в шагеLinux · Терминал (Bash)КомандаТерминал Linux на сервере/клиенте, указанном в шаге. Обычно достаточно прав пользователя; имя.service, пути, адрес server.example.org, имена пользователей и другие демонстрационные значения необходимо заменить фактическими. После команды сравните результат с описанием шага; при ошибке остановитесь и выясните её причину.
UNIT='имя.service'; journalctl -b -u "$UNIT" -n 90 --no-pager
- Шаг 2. Проверьте, есть ли активатор socketИмя socket-юнита может отличаться от имени service. Список сокетов показывает LISTEN и активируемую службу; не перезапускайте незнакомые системные сокеты.
- Терминал Linux на сервере/клиенте, указанном в шагеLinux · Терминал (Bash)КомандаТерминал Linux на сервере/клиенте, указанном в шаге. Обычно достаточно прав пользователя; имя.service, пути, адрес server.example.org, имена пользователей и другие демонстрационные значения необходимо заменить фактическими. После команды сравните результат с описанием шага; при ошибке остановитесь и выясните её причину.
systemctl list-sockets --all --no-pager
- Шаг 3. Определите владельца открытого сокетаКоманда ss -xlpn показывает локальные Unix-сокеты и процессы. Для подробных PID нужны права администратора. Не удаляйте файл сокета из /run, пока в нём работает процесс. Команды sudo или sudoedit выполняются с полномочиями администратора; если sudo не установлен, используйте разрешённую административную сессию.
- Терминал Linux на сервере/клиенте, указанном в шагеLinux · Терминал (Bash)КомандаНужен sudoТерминал Linux на сервере/клиенте, указанном в шаге. Нужны права администратора; имя.service, пути, адрес server.example.org, имена пользователей и другие демонстрационные значения необходимо заменить фактическими. После команды сравните результат с описанием шага; при ошибке остановитесь и выясните её причину.
sudo ss -xlpn
- Шаг 4. Посмотрите права и право проходаПодставьте найденный путь. У каталога сокета должен быть x для учётной записи сервиса; права на конечный файл сами по себе не решают отсутствие прохода.
- Терминал Linux на сервере/клиенте, указанном в шагеLinux · Терминал (Bash)КомандаТерминал Linux на сервере/клиенте, указанном в шаге. Обычно достаточно прав пользователя; имя.service, пути, адрес server.example.org, имена пользователей и другие демонстрационные значения необходимо заменить фактическими. После команды сравните результат с описанием шага; при ошибке остановитесь и выясните её причину.
namei -l /run/имя-программы/приложение.sockstat -c '%A %U:%G %n' /run/имя-программы/приложение.sock
- Шаг 5. Проверьте параметры socket unitЕсли сокетом управляет systemd, проверьте ListenStream, SocketUser, SocketGroup и SocketMode. Изменять надо конкретную настройку socket-юнита через drop-in, если это предусмотрено архитектурой приложения.
- Терминал Linux на сервере/клиенте, указанном в шагеLinux · Терминал (Bash)КомандаТерминал Linux на сервере/клиенте, указанном в шаге. Обычно достаточно прав пользователя; имя.service, пути, адрес server.example.org, имена пользователей и другие демонстрационные значения необходимо заменить фактическими. После команды сравните результат с описанием шага; при ошибке остановитесь и выясните её причину.
systemctl cat имя.socketsystemctl show имя.socket -p ActiveState -p Listen
- Шаг 6. Проверьте доступ от пользователя сервисаПосле точечных разрешённых изменений прав либо корректировки socket unit выполните контролируемый restart затронутого компонента. Это может разорвать соединения; заранее согласуйте простой. Команды sudo или sudoedit выполняются с полномочиями администратора; если sudo не установлен, используйте разрешённую административную сессию.
- Терминал Linux на сервере/клиенте, указанном в шагеLinux · Терминал (Bash)С осторожностьюНужен sudoТерминал Linux на сервере/клиенте, указанном в шаге. Нужны права администратора; имя.service, пути, адрес server.example.org, имена пользователей и другие демонстрационные значения необходимо заменить фактическими. После команды сравните результат с описанием шага; при ошибке остановитесь и выясните её причину.
sudo systemctl restart имя.socketsystemctl status имя.socket --no-pagerКоманда может изменить состояние системы или её настройки. Проверьте параметры и последствия перед запуском.
#Как проверить, что проблема действительно устранена
Повторите операцию приложения, которая раньше возвращала Permission denied. Если ошибка осталась, изучите SELinux/AppArmor и ограничители sandboxing (ProtectSystem, RuntimeDirectory) — не отключайте их глобально.
#Если результат не получен
Вернитесь к самому раннему отличающемуся результату диагностики и проверьте точный текст ошибки, текущую загрузку и фактическую версию программы. Не повторяйте опасную команду с другими правами наугад. Если это рабочий сервер, передайте администратору обезличенные отрывки журнала за момент сбоя и уже выполненные действия.