nix 上の systemd ユニット ファイルの実行可能ファイルへのパスを指定するにはどうすればよいですか?

nix 上の systemd ユニット ファイルの実行可能ファイルへのパスを指定するにはどうすればよいですか?

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

whichmkdir へのパスを見つけるためにを使用できると思いますが、${pkgs.nameOfPackage}他の nix の設定に が表示されているため、代わりにこれを使用するべきでしょうか?

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

答え1

一般的に言えば、${pkgs.nameOfPackage}が推奨される構文です。

あなたの特定の例では、mkdirは coreutils パッケージの一部です。これは、 コマンド で確認できます (しゃれを意図しています) readlink $(which mkdir)。したがって、行は次のようになります。

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

coreutils は常にインストールされますが、この構文の優れた利点${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 ~ホーム ディレクトリを表示します。

関連情報