¿Cómo especifico una ruta a un ejecutable para un archivo de unidad systemd en nix?

¿Cómo especifico una ruta a un ejecutable para un archivo de unidad systemd en nix?

Estoy intentando escribir un archivo de unidad systemd.

¿Cómo especifico la ruta a un ejecutable? ¿Cómo puedo determinar qué usar?

En este caso específico estoy intentando usar mkdir.

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

Sin embargo, esto produce un error al iniciar el archivo de la unidad:

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

Supongo que podría usar whichpara encontrar la ruta a mkdir, pero veo un ${pkgs.nameOfPackage}en la configuración de nix de otros, entonces, ¿posiblemente debería usar esto en su lugar?

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

Respuesta1

En términos generales, ${pkgs.nameOfPackage}es la sintaxis preferida.

Para su ejemplo específico, mkdires parte del paquete coreutils; que (juego de palabras intencionado) puedes determinar con el comando readlink $(which mkdir). Entonces tu línea debería leer:

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

Si bien coreutils siempre está instalado AFIK, una buena ventaja de la ${pkgs.nameOfPackage}sintaxis es que no es necesario instalar el paquete nameOfPackage; Nix lo hará por ti.

Respuesta2

Primero, no necesitas esos espacios ni comillas dobles.

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

En segundo lugar, ¿ha probado el comando en su sistema tal como está escrito? En tu caparazón:

mkdir -p ~/.config/example/pending

Por último, %h se refiere a la casa del usuario. Pero tal vez su sistema esté apuntando a otro lugar, ya que el comando mkdir no está en el lugar correcto. echo ~para ver su directorio personal.

información relacionada