Not a directory в журнале службы
Сообщение Not a directory (номер 20, ENOTDIR) означает, что в середине пути встретился обычный файл. Частый случай — путь вида /var/lib/myapp/data, где myapp оказался файлом, а не каталогом.
Вероятные причины
По порядку: сверху то, что встречается чаще.
-
В середине пути находится файл
Программа или установщик создал файл там, где ожидался каталог. Дальше по пути пройти нельзя.
-
Символическая ссылка ведёт на файл
Ссылка выглядит каталогом в выводе, но указывает на файл. Обращение к пути внутри неё даёт эту ошибку.
-
Путь в настройках указан с лишним элементом
Опечатка вроде
/etc/myapp.conf/configдаёт эту ошибку: первый элемент — файл.
Диагностика
Команды идут в том порядке, в котором их стоит выполнять: каждая следующая проверяет то, что осталось после предыдущей.
Тип объекта на каждом уровне пути.
namei -l /путь/из/сообщенияТочный путь из сообщения.
journalctl -u myapp.service -n 20 --no-pager | grep -i "not a directory"Решение
Решение своё для каждой причины. Сначала определите, какая из них ваша, — иначе правки наложатся друг на друга.
- Почему происходит
- Программа или установщик создал файл там, где ожидался каталог. Дальше по пути пройти нельзя.
- Как проверить
-
Пройдите по пути целиком.
namei -l /var/lib/myapp/data/state.db
- Как исправить
- Уберите или переименуйте лишний файл и создайте каталог. Команда прохода по пути сразу показывает, на каком уровне обрыв.
- Почему происходит
- Ссылка выглядит каталогом в выводе, но указывает на файл. Обращение к пути внутри неё даёт эту ошибку.
- Как проверить
-
Посмотрите, куда ведёт ссылка.
ls -l /var/lib/myapp && readlink -f /var/lib/myapp
- Как исправить
- Исправьте ссылку так, чтобы она указывала на каталог.
- Почему происходит
- Опечатка вроде
/etc/myapp.conf/configдаёт эту ошибку: первый элемент — файл.
- Как проверить
-
Посмотрите путь из сообщения и настройки.
journalctl -u myapp.service -n 20 --no-pager | grep -i "not a directory"
- Как исправить
- Исправьте путь в настройках или в unit-файле.
Пример вывода
В середине пути оказался файл. Пример показательный: он собран на тестовой машине специально для этой страницы, а не взят из чужого журнала.
myapp[4100]: error: open /var/lib/myapp/data/state.db: not a directory
$ namei -l /var/lib/myapp/data/state.db
d /
d var
d lib
- myapp
? data/state.db - Not a directory
Связанные ошибки
- No such file or directory в журнале службы Служба не находит файл или каталог. Разбор: путь, момент запуска, изоляция unit-файла, символические ссылки, приватный /tmp.
- status=200/CHDIR в systemd Код 200/CHDIR означает, что systemd не смог перейти в каталог из WorkingDirectory= до запуска программы. Причины и решение.
- Permission denied в журнале службы Отказ в доступе у службы systemd: права на файл, каталоги по пути, пользователь службы, параметры изоляции, SELinux и AppArmor.
- Too many levels of symbolic links Ошибка 40: цикл символических ссылок или слишком глубокая цепочка.
- Argument list too long в службе или скрипте Список аргументов слишком длинный: подстановка имён файлов дала тысячи аргументов. Как переписать вызов.
- Bad file descriptor в журнале службы Ошибка 9 при операции с файлом: дескриптор закрыт или не тот. Разбор для служб и сокет-активации.
- Could not open file и cannot open shared object file Программа не может открыть файл или библиотеку: путь, права, отсутствующая зависимость сборки, изоляция.
- Device or resource busy при операции с файлом Ошибка 16: файл или устройство заняты. Разбор для точек монтирования, устройств и файлов конфигурации.
Источники
- open(2): ошибка ENOTDIR
-
Воспроизведено на тестовой машине, systemd 255 (Ubuntu 24.04)
Воспроизведено файлом на месте ожидаемого каталога.