如何为 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

我想我可以用它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 始终安装 AFIK,但该语法的一个好处${pkgs.nameOfPackage}是您不需要安装该包nameOfPackage;尼克斯会为你拉上它。

答案2

首先,您不需要这些空格和双引号。

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

其次,您是否在系统上尝试过该命令?在你的外壳中:

mkdir -p ~/.config/example/pending

最后,%h 指的是用户的家。但也许您的系统正在定位到另一个位置,因为 mkdir 命令不在正确的位置。echo ~查看您的主目录。

相关内容