如何在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
相关产品推荐
相关产品推荐

