Как указать путь к исполняемому файлу для файла модуля systemd в nix?

Как указать путь к исполняемому файлу для файла модуля systemd в nix?

Я пытаюсь написать файл модуля 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 ~для просмотра домашнего каталога.

Связанный контент