Como especifico um caminho para um executável para um arquivo de unidade systemd no nix?

Como especifico um caminho para um executável para um arquivo de unidade systemd no nix?

Estou tentando escrever um arquivo de unidade do systemd.

Como especifico o caminho para um executável? Como posso determinar o que usar?

Neste caso específico estou tentando usar o mkdir.

ExecStartPre = "/bin/mkdir -p %h/.config/example/pending/";

Isso resulta em um erro ao iniciar o arquivo da unidade:

Jan 16 08:46:11 nixos systemd[19577]: example.service: Failed at step EXEC spawning /bin/mkdir: No such file or directory

Suponho que poderia apenas usar whichpara encontrar o caminho para mkdir - mas estou vendo uma ${pkgs.nameOfPackage}configuração de outro nix - então possivelmente eu deveria usar isso?

which mkdir
/run/current-system/sw/bin/mkdir

Responder1

De modo geral, ${pkgs.nameOfPackage}é a sintaxe preferida.

Para o seu exemplo específico, mkdirfaz parte do pacote coreutils; qual (trocadilho intencional) você pode determinar com o comando readlink $(which mkdir). Portanto, sua linha deve ser:

ExecStartPre=${pkgs.coreutils}/bin/mkdir BLAH BLAH BLAH

Embora o coreutils esteja sempre instalado no AFIK, um bom benefício da ${pkgs.nameOfPackage}sintaxe é que você não precisa instalar o pacote nameOfPackage; Nix vai puxar isso para você.

Responder2

Primeiro você não precisa desses espaços e aspas duplas.

ExecStartPre=/run/current-system/sw/bin/mkdir -p %h/.config/example/pending

Em segundo lugar, você tentou o comando em seu sistema conforme está escrito? Na sua concha:

mkdir -p ~/.config/example/pending

Por último, %h refere-se à casa do usuário. Mas talvez o seu sistema esteja direcionado para outro local, já que o comando mkdir não está no lugar certo. echo ~para ver seu diretório inicial.

informação relacionada