
Я пытаюсь написать файл модуля systemd.
Как указать путь к исполняемому файлу? Как определить, что использовать?
В этом конкретном случае я пытаюсь использовать mkdir
.
ExecStartPre = "/bin/mkdir -p %h/.config/example/pending/";
Однако это приводит к ошибке при запуске файла модуля:
Jan 16 08:46:11 nixos systemd[19577]: example.service: Failed at step EXEC spawning /bin/mkdir: No such file or directory
Полагаю, я мог бы просто which
найти путь к mkdir, но я вижу ${pkgs.nameOfPackage}
в конфигурации другого nix, так что, возможно, мне следует использовать это вместо этого?
which mkdir
/run/current-system/sw/bin/mkdir
решение1
В общем случае ${pkgs.nameOfPackage}
это предпочтительный синтаксис.
Для вашего конкретного примера m mkdir
является частью пакета coreutils; который (каламбур) вы можете определить с помощью команды readlink $(which mkdir)
. Так что ваша строка должна выглядеть так:
ExecStartPre=${pkgs.coreutils}/bin/mkdir BLAH BLAH BLAH
Хотя coreutils всегда устанавливается AFIK, приятным преимуществом синтаксиса ${pkgs.nameOfPackage}
является то, что вам не нужно устанавливать пакет nameOfPackage
; Nix установит его за вас.
решение2
Во-первых, вам не нужны эти пробелы и двойные кавычки.
ExecStartPre=/run/current-system/sw/bin/mkdir -p %h/.config/example/pending
Во-вторых, вы пробовали команду в вашей системе так, как она написана? В вашей оболочке:
mkdir -p ~/.config/example/pending
Наконец, %h ссылается на домашний каталог пользователя. Но, возможно, ваша система ориентируется на другое место, поскольку команда mkdir находится не в том месте. echo ~
для просмотра домашнего каталога.