首页 > 解决方案 > NixOS 服务 systemd 单元的 $PATH 不包含预期的依赖项

问题描述

我有以下定义:

  hello123 = 
    (pkgs.writeScriptBin "finderapp" ''
      #!${pkgs.stdenv.shell}
      # Call hello with a traditional greeting 
      ls ${pkgs.ffmpeg-full}/bin/ffmpeg

      ffmpeg --help

      echo hello
    ''
    );

和服务:

  systemd.services = {
    abcxyz = {
      enable = true;
      description = "abcxyz";
      serviceConfig = {
        WorkingDirectory = "%h/temp/";
        Type      = "simple";
        ExecStart = "${hello123}/bin/finderapp";
        Restart   = "always";
        RestartSec   = 60;
      };
      wantedBy = [ "default.target" ];
    };
  };

但是,这似乎无法执行ffmpeg

Jul 10 19:47:54 XenonKiloCranberry systemd[1]: Started abcxyz.
Jul 10 19:47:54 XenonKiloCranberry finderapp[10042]: /nix/store/9yx9s5yjc6ywafadplblzdfaxqimz95w-ffmpeg-full-4.2.3/bin/ffmpeg
Jul 10 19:47:54 XenonKiloCranberry finderapp[10042]: /nix/store/bxfwljbpvl21wsba00z5dm9dmshsk3bx-finderapp/bin/finderapp: line 5: ffmpeg: command not found
Jul 10 19:47:54 XenonKiloCranberry finderapp[10042]: hello

为什么会失败?我假设它正确地ffmpeg作为运行时依赖项(用 验证nix-store -q --references ...),如此处另一个问题所述:https ://stackoverflow.com/a/68330101/1663462


如果我将 a 添加echo $PATH到脚本中,它会输出以下内容:

Jul 10 19:53:44 XenonKiloCranberry finderapp[12011]: /nix/store/x0jla3hpxrwz76hy9yckg1iyc9hns81k-coreutils-8.31/bin:/nix/store/97vambzyvpvrd9wgrrw7i7svi0s8vny5-findutils-4.7.0/bin:/nix/store/srmjkp5pq8c055j0lak2hn0ls0fis8yl-gnugrep-3.4/bin:/nix/store/p34p7ysy84579lndk7rbrz6zsfr03y71-gnused-4.8/bin:/nix/store/vfzp1mavwiz5w3v10hs69962k0gwl26c-systemd-243.7/bin:/nix/store/x0jla3hpxrwz76hy9yckg1iyc9hns81k-coreutils-8.31/sbin:/nix/store/97vambzyvpvrd9wgrrw7i7svi0s8vny5-findutils-4.7.0/sbin:/nix/store/srmjkp5pq8c055j0lak2hn0ls0fis8yl-gnugrep-3.4/sbin:/nix/store/p34p7ysy84579lndk7rbrz6zsfr03y71-gnused-4.8/sbin:/nix/store/vfzp1mavwiz5w3v10hs69962k0gwl26c-systemd-243.7/sbin

或者这些路径基本上是:

/nix/store/x0jla3hpxrwz76hy9yckg1iyc9hns81k-coreutils-8.31/bin
/nix/store/97vambzyvpvrd9wgrrw7i7svi0s8vny5-findutils-4.7.0/bin
/nix/store/srmjkp5pq8c055j0lak2hn0ls0fis8yl-gnugrep-3.4/bin
/nix/store/p34p7ysy84579lndk7rbrz6zsfr03y71-gnused-4.8/bin
/nix/store/vfzp1mavwiz5w3v10hs69962k0gwl26c-systemd-243.7/bin
/nix/store/x0jla3hpxrwz76hy9yckg1iyc9hns81k-coreutils-8.31/sbin
/nix/store/97vambzyvpvrd9wgrrw7i7svi0s8vny5-findutils-4.7.0/sbin
/nix/store/srmjkp5pq8c055j0lak2hn0ls0fis8yl-gnugrep-3.4/sbin
/nix/store/p34p7ysy84579lndk7rbrz6zsfr03y71-gnused-4.8/sbin
/nix/store/vfzp1mavwiz5w3v10hs69962k0gwl26c-systemd-243.7/sbin

这表明 ffmpeg 不在其中。

标签: nixnixos

解决方案


我不认为这是最优雅的解决方案,因为必须在服务定义而不是包/派生中知道依赖关系,但它仍然是一个解决方案。

我们可以添加额外的路径path = [ pkgs.ffmpeg-full ];

abcxyz = {
  enable = true;
  description = "abcxyz";
  path = [ pkgs.ffmpeg-full ];
  serviceConfig = {
    WorkingDirectory = "%h/temp/";
    Type      = "simple";
    ExecStart = "${hello123}/bin/finderapp";
    Restart   = "always";
    RestartSec   = 60;
  };
  wantedBy = [ "default.target" ];
};

推荐阅读