#Когда возникает ошибка в Debian и какие условия важны
После перевода Debian-сервиса на отдельного пользователя клиентская программа перестаёт подключаться к UNIX-сокету: журнал сообщает Permission denied или Connection refused. Сокет может быть обычным файлом процесса или управляться отдельным socket-unit systemd.
#Причины и как отличить их друг от друга
| Возможная причина | Как узнать | Что делать |
|---|---|---|
| Владелец сокета больше не совпадает | ls -l показывает прежнего пользователя/группу. | Проверить режим доступа и способ создания сокета. |
| Нет права прохода к родительскому каталогу | Сам сокет имеет разрешения, но namei -l выявляет закрытый каталог. | Изменить только требуемый каталог или RuntimeDirectory. |
| Сокет остался после сбоя, но никто не слушает | Файл существует, однако ss -xl не показывает слушающий процесс. | Проверить socket-unit и процесс, не удалять объект вслепую. |
#Пошаговая диагностика и устранение
- 1. Уточните полный путь сокета и точный код ошибкиОткройте терминал Debian, найдите в конфигурации приложения полный путь /run/имя/имя.sock. Если известен лишь Connection refused, нужно проверить, запущен ли владелец сокета, а не менять права. Запишите имя исходного пользователя и новой учётной записи.
- Чтение данных и диагностикаLinux · Терминал (Bash)КомандаЧтение данных и диагностика. Изменений нет.
systemctl status ИМЯ.service --no-pagerjournalctl -u ИМЯ.service -b --no-pager -n 90
- 2. Определите, кто создаёт сокетВыполните ss -xlpn для локальных UNIX-сокетов. Если отдельный объект .socket активен, изучите его параметры SocketUser, SocketGroup, SocketMode и ListenStream. Обычный файл сокета в /run может исчезать при перезагрузке; создание вручную не является исправлением.
- Команды только смотрят слушателей и объектыLinux · Терминал (Bash)КомандаНужен sudoКоманды только смотрят слушателей и объекты.
sudo ss -xlpnsystemctl list-units --type=socket --all --no-pager
- 3. Проверьте владельца конечного объекта и папокУкажите настоящий путь. ls -l покажет тип s для сокета, а namei -l — разрешения на всех уровнях каталога. Если есть ACL, обычных прав может быть недостаточно для объяснения доступа. Не выполняйте chmod 777, особенно в общих каталогах /tmp.
- Чтение данных и диагностикаLinux · Терминал (Bash)КомандаЧтение данных и диагностика. Изменений нет.
ls -l /run/ПАПКА/ИМЯ.socknamei -l /run/ПАПКА/ИМЯ.sock
- 4. Сопоставьте системного пользователя и группыПроверьте id новой учётной записи и unit приложения, находящегося по обе стороны соединения. Добавление пользователя в существующую группу даёт дополнительные права не только на данный сокет; предпочтительнее отдельная служебная группа с минимальным доступом, если это поддерживается приложением.
- Чтение данных и диагностикаLinux · Терминал (Bash)КомандаЧтение данных и диагностика. Изменений нет.
id ПОЛЬЗОВАТЕЛЬsystemctl show ИМЯ.service -p User -p Group -p SupplementaryGroups
- 5. Найдите источник разрешений и пересоздания сокетаДля systemd socket-unit посмотрите его файл и параметры режима; при обычном приложении изучайте настройки самого приложения, создающего сокет. Удаление файла /run/*.sock вручную при работающем процессе может нарушить соединения. Стандартный способ — исправить постоянную настройку и штатно перезапустить владельца.
- Чтение данных и диагностикаLinux · Терминал (Bash)КомандаЧтение данных и диагностика. Изменений нет.
systemctl cat ИМЯ.socketsystemctl cat ИМЯ.service
- 6. Проверьте каталог времени исполненияЕсли служба использует RuntimeDirectory=, systemd может создавать папку под правильным владельцем и с заданным режимом при старте. Посмотрите значения через show; это надёжнее, чем вручную менять права на каталоги /run после каждой загрузки. Для сокета со сторонним создателем механизм может отличаться.
- Чтение данных и диагностикаLinux · Терминал (Bash)КомандаЧтение данных и диагностика. Изменений нет.
systemctl show ИМЯ.service -p RuntimeDirectory -p RuntimeDirectoryMode -p User -p Group
- 7. Проверяйте соединение от нужного пользователяПосле адресной правки настроек перезапустите только соответствующую службу и проверьте статус socket и возможность подключения штатным клиентом. Если Permission denied исчезло, но есть Connection refused, проверьте слушателя через ss, а не добавляйте новые полномочия.
- Если отдельный .socket не существует, его status вернёт not found — это нормальноLinux · Терминал (Bash)КомандаНужен sudoЕсли отдельный .socket не существует, его status вернёт not found — это нормально.
sudo ss -xlpnsystemctl status ИМЯ.socket --no-pagersystemctl status ИМЯ.service --no-pager
#Проверка результата и действия при неуспехе
Успех — клиент с минимально достаточными полномочиями подключается к UNIX-сокету после перезапуска и перезагрузки, а владелец файла создаётся корректно автоматически.