【问题标题】:NixOS service systemd unit's $PATH does not contain expected dependencyNixOS 服务 systemd 单元的 $PATH 不包含预期的依赖项
【发布时间】:2021-07-10 18:51:46
【问题描述】:

我有以下定义:

  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


如果我在脚本中添加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 不在其中。

【问题讨论】:

  • 致电${pkgs.ffmpeg-full}/bin/ffmpeg --help。最佳做法是不要不必要地依赖 PATH 查找。
  • (在动态链接而不是尝试构建 LD_LIBRARY_PATH 到依赖项时,使用 rpath 的 nix 最佳实践背后的推理相同)
  • 有替代方案吗?这个问题是一个简化的例子。现在我有一个依赖ffmpeg 的构建应用程序可以在 PATH 中访问。
  • 通常的方法是对该应用程序本身的派生包括一个包装器,该包装器在启动真实/底层可执行文件之前将 ffmpeg 放入其 PATH 中。

标签: nix nixos


【解决方案1】:

除了前面的答案

  • 不使用PATH
  • 通过 systemd 配置添加到 PATH

如果 ffmpeg 或任何其他命令需要它,您可以将其添加到包装脚本内的PATH,使脚本更加自给自足,并使扩展的PATH 可用于子进程(在这种情况下可能不需要) .

ls 命令对后续命令没有影响,就像它不应该的那样。

你想要的是将它添加到PATH

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

      ffmpeg --help

      echo hello
    ''
    );

${PATH:+:${PATH}} 部分负责处理: 和预先存在的PATH,如果有的话。简单的:${PATH} 可以在. 为空时有效地添加到PATH,尽管这种情况很少见。

【讨论】:

  • 虽然这是一个解决方案,但它似乎是一种解决方法。这可能有原因在 systemd 单元上下文中不起作用吗?如前所述,在执行 nix-store -q --references...? 时会列出预期的依赖项
  • 这些东西(bash、Nix、PATH)按预期工作。您希望您的 finderapp 脚本通过什么机制找到 ffmpeg 而无需设置 PATH
【解决方案2】:

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

我们可以用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" ];
};

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-11-26
    • 1970-01-01
    • 2018-05-17
    • 2014-04-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多