
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
which
mkdir へのパスを見つけるためにを使用できると思いますが、${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 ~
ホーム ディレクトリを表示します。