
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 which
para 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, mkdir
es 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.