You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在NixOS上构建并部署Keter?exec命令异常求助

解决Keter在NixOS上fork进程后找不到exec命令的问题

我之前也碰到过NixOS下服务依赖系统工具找不到的类似问题,结合你的场景来看,核心原因应该是NixOS的环境隔离特性——Keter在fork子进程时,无法访问到coreutils包里的exec命令。下面是具体的排查和解决步骤:

1. 确保coreutils被纳入Keter的依赖链

NixOS的软件都是沙箱化构建的,默认不会自动包含系统基础工具。你需要手动把coreutils加到Keter的构建配置里:

  • 打开你用cabal2nix生成的keter.nix文件,找到buildInputs或propagatedBuildInputs字段,添加pkgs.coreutils。示例:
    buildInputs = [ pkgs.coreutils /* 保留其他已有依赖 */ ];
    
  • 重新执行nix-build shell.nix完成构建,再把新的闭包部署到VPS上。

2. 给systemd服务配置正确的环境变量

如果Keter的依赖已经包含coreutils,但fork子进程时没能继承正确的PATH,你需要在systemd服务配置里显式指定路径:

  • 如果你用NixOS配置文件定义服务(推荐方式),在服务配置中添加path选项:
    systemd.services.keter = {
      # 保留其他已有配置
      path = with pkgs; [ coreutils ]; # 将coreutils的bin目录加入服务PATH
      serviceConfig = {
        # 保留其他service配置
      };
    };
    
  • 如果你是手动编写.service文件,在[Service]段添加环境变量:
    [Service]
    Environment="PATH=/run/current-system/sw/bin:/nix/store/<coreutils哈希值>/bin"
    
    你可以通过nix-build -A coreutils获取coreutils的具体store路径,替换掉上面的<coreutils哈希值>。

3. 验证Keter的启动环境

有时候Keter启动时会重置环境变量,你可以临时修改systemd启动命令,先打印PATH再启动Keter,确认环境是否正确:

  • 在service配置里把ExecStart改成:
    ExecStart=/bin/sh -c 'echo $PATH >> /tmp/keter-path.log && /你的Keter路径/keter'
    
    启动服务后查看/tmp/keter-path.log,确认里面包含coreutils的bin目录。

补充说明

NixOS里的exec命令确实属于coreutils包,只要确保Keter的运行环境能访问到coreutils的bin目录,这个问题就能解决。另外你用的是NixOS 17.09,虽然coreutils版本偏旧,但完全不影响exec命令的正常使用。

内容的提问来源于stack exchange,提问作者Ben

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.19 03:41:31