Could not open file и cannot open shared object file
Сообщения про невозможность открыть файл делятся на две группы: отсутствующие данные (файл настроек, сертификат, база) и отсутствующие библиотеки. Вторые узнаются по строке cannot open shared object file и разбираются иначе.
Вероятные причины
По порядку: сверху то, что встречается чаще.
-
Отсутствует общая библиотека
Программа собрана с зависимостью, которой нет в системе. Частая ситуация при ручной установке и при переносе сборки между дистрибутивами.
-
Библиотека есть, но в нестандартном каталоге
Программа ищет библиотеки в стандартных путях. Своя библиотека в /opt без настройки не находится.
-
Файла данных нет или он недоступен
Обычная ситуация: путь неверен, файл удалён, прав не хватает, путь скрыт изоляцией службы.
Диагностика
Команды идут в том порядке, в котором их стоит выполнять: каждая следующая проверяет то, что осталось после предыдущей.
Недостающие библиотеки, если сообщение про них.
ldd /путь/к/программе | grep "not found"Точный путь, который не удалось открыть.
journalctl -u myapp.service -n 30 --no-pager | grep -iE "cannot open|could not open"Права и наличие на каждом уровне пути.
namei -l /путь/из/сообщенияРешение
Решение своё для каждой причины. Сначала определите, какая из них ваша, — иначе правки наложатся друг на друга.
- Почему происходит
- Программа собрана с зависимостью, которой нет в системе. Частая ситуация при ручной установке и при переносе сборки между дистрибутивами.
- Как проверить
-
Посмотрите недостающие библиотеки.
ldd /usr/local/bin/myapp | grep "not found"
- Как исправить
- Установите пакет с нужной библиотекой или соберите программу под этот дистрибутив.
- Почему происходит
- Программа ищет библиотеки в стандартных путях. Своя библиотека в /opt без настройки не находится.
- Как проверить
-
Посмотрите настроенные пути и содержимое каталога.
cat /etc/ld.so.conf.d/*.conf 2>/dev/null | head ls -l /opt/myapp/lib/
- Как исправить
-
Добавьте каталог в настройки загрузчика библиотек и обновите кеш. Переменную окружения с путями лучше задавать в unit-файле, а не в профиле.
echo "/opt/myapp/lib" | sudo tee /etc/ld.so.conf.d/myapp.conf && sudo ldconfig
- Почему происходит
- Обычная ситуация: путь неверен, файл удалён, прав не хватает, путь скрыт изоляцией службы.
- Как проверить
-
Посмотрите путь из сообщения целиком.
namei -l /путь/из/сообщения
- Как исправить
- Создайте файл, исправьте путь или права. При включённой изоляции путь нужно разрешить в unit-файле.
Пример вывода
Не найдена общая библиотека. Пример показательный: он собран на тестовой машине специально для этой страницы, а не взят из чужого журнала.
myapp[4600]: /usr/local/bin/myapp: error while loading shared libraries: libssl.so.1.1: cannot open shared object file: No such file or directory
systemd[1]: myapp.service: Main process exited, code=exited, status=127
Связанные ошибки
- No such file or directory в журнале службы Служба не находит файл или каталог. Разбор: путь, момент запуска, изоляция unit-файла, символические ссылки, приватный /tmp.
- status=203/EXEC в systemd Код 203/EXEC означает, что systemd не смог выполнить программу из ExecStart=. Разбор причин: путь, права, интерпретатор, синтаксис оболочки.
- Permission denied в журнале службы Отказ в доступе у службы systemd: права на файл, каталоги по пути, пользователь службы, параметры изоляции, SELinux и AppArmor.
- status=127 в systemd: команда не найдена Код 127 без имени: оболочка не нашла команду. Появляется, когда ExecStart запускает скрипт или sh -c, а внутри команды нет.
- Argument list too long в службе или скрипте Список аргументов слишком длинный: подстановка имён файлов дала тысячи аргументов. Как переписать вызов.
- Bad file descriptor в журнале службы Ошибка 9 при операции с файлом: дескриптор закрыт или не тот. Разбор для служб и сокет-активации.
- Device or resource busy при операции с файлом Ошибка 16: файл или устройство заняты. Разбор для точек монтирования, устройств и файлов конфигурации.
- File exists при создании файла или сокета Ошибка 17: объект уже существует. Разбор для сокетов, файлов блокировки и каталогов службы.
Источники
- ld.so(8): порядок поиска библиотек
-
Воспроизведено на тестовой машине, systemd 255 (Ubuntu 24.04)
Воспроизведено удалением библиотеки, от которой зависит программа.