
Ich versuche, eine systemd-Unit-Datei zu schreiben.
Wie gebe ich den Pfad zu einer ausführbaren Datei an? Wie kann ich bestimmen, was verwendet werden soll?
In diesem speziellen Fall versuche ich, zu verwenden mkdir
.
ExecStartPre = "/bin/mkdir -p %h/.config/example/pending/";
Dies führt allerdings zu einem Fehler beim Starten der Unit-Datei:
Jan 16 08:46:11 nixos systemd[19577]: example.service: Failed at step EXEC spawning /bin/mkdir: No such file or directory
Ich nehme an, ich könnte einfach verwenden, which
um den Pfad zu mkdir zu finden – aber ich sehe ein ${pkgs.nameOfPackage}
in der Nix-Konfiguration von anderen – sollte ich also möglicherweise stattdessen dies verwenden?
which mkdir
/run/current-system/sw/bin/mkdir
Antwort1
Im Allgemeinen ${pkgs.nameOfPackage}
ist dies die bevorzugte Syntax.
Für Ihr konkretes Beispiel mkdir
ist m Teil des Coreutils-Pakets; das (Wortspiel beabsichtigt) können Sie mit dem Befehl ermitteln readlink $(which mkdir)
. Ihre Zeile sollte also lauten:
ExecStartPre=${pkgs.coreutils}/bin/mkdir BLAH BLAH BLAH
Während coreutils immer AFIK installiert wird, besteht ein schöner Vorteil der ${pkgs.nameOfPackage}
Syntax darin, dass Sie das Paket nicht installieren müssen nameOfPackage
; Nix lädt es für Sie herunter.
Antwort2
Erstens brauchen Sie diese Leerzeichen und Anführungszeichen nicht.
ExecStartPre=/run/current-system/sw/bin/mkdir -p %h/.config/example/pending
Zweitens, haben Sie den Befehl auf Ihrem System so ausprobiert, wie er geschrieben ist? In Ihrer Shell:
mkdir -p ~/.config/example/pending
Und schließlich bezieht sich %h auf das Home-Verzeichnis des Benutzers. Aber vielleicht zielt Ihr System auf einen anderen Ort ab, da der Befehl mkdir nicht an der richtigen Stelle steht. echo ~
um Ihr Home-Verzeichnis anzuzeigen.