完全指南:内置默认的进程监督与配置选项)
开发工具CLI【免费下载链接】devenvFast, Declarative, Reproducible, and Composable Developer Environments using Nix项目地址https://gitcode.com/gh_mirrors/de/devenv点击查看免费下载devenv 的native process manager是内置在 devenv 中的原生进程管理器默认启用也是官方推荐的项目进程运行方式。本指南以 supported-process-managers/native.md 为核心结合 processes.mdx 主指南与 native.nix 模块源码系统讲解原生进程管理器的能力模型、运行时适配器、全部配置选项及其底层实现帮助读者掌握用devenv up编排、监督和运维整个开发栈的实战方法。一、什么是 devenv 原生进程管理器原生进程管理器是 devenv 内置的默认进程监督实现开箱即用、无需额外安装或配置。它由 devenv 团队用 Rust 编写核心代码位于 devenv-processes/src不依赖任何外部进程管理工具直接集成在 devenv 的 CLI 与 TUI 中。它的定位与外部管理器process-compose、overmind、mprocs、hivemind、honcho有本质区别那些外部管理器是兼容性选项其行为受外部程序决定只能覆盖 devenv 进程功能的一个子集而原生管理器支持 devenv 完整的进程功能集包括进程监督与依赖管理after/before就绪探针readiness probes重启策略restart policiesSocket activation套接字激活文件监听自动重启file watching自动端口分配automatic port allocation优雅停机控制shutdown signal/graceLinux capabilities 授权后台启动、交互式 attach、单进程控制配置、依赖、就绪探针、重启策略、socket activation、文件监听与自动端口分配的完整用法请参见 Processes 指南。二、能力模型process.managers.native.capabilities.*devenv 的进程子系统采用能力声明机制每个进程管理器声明自己支持哪些生命周期能力CLI 据此决定哪些命令可用。capabilities选项在 native.nix 中定义为internal true; readOnly true的内部选项也就是说它不是供用户在devenv.nix中修改的公共配置而是由管理器模块自身声明、CLI 读取的实现数据。原生管理器的默认能力声明为全部为true选项类型默认值含义process.managers.native.capabilities.background_startbooleantrue管理器能否在启动它的客户端退出后继续后台运行支持devenv up -dprocess.managers.native.capabilities.devenv_attachbooleantruedevenv 能否将交互式客户端 attach 到已存在的管理器devenv processes attachprocess.managers.native.capabilities.wait_readybooleantruedevenv 能否通过管理器等待进程就绪devenv processes waitprocess.managers.native.capabilities.individual_controlbooleantruedevenv 能否通过管理器对单个进程执行 start/stop/restartprocess.managers.native.capabilities.cold_start_subsetbooleantrue管理器能否只冷启动指定名称的子集进程如devenv up -d api worker这五个能力直接决定了用户可见命令的可用性。以外部管理器为例对比即可理解其作用process-compose 支持background_start与cold_start_subset但不支持devenv_attach、wait_ready和individual_controlmprocs 则五项全为false。因此只有原生管理器能让devenv up在发现后台已有运行中的管理器时attach 上去继续控制也只有在原生管理器上devenv processes wait --timeout 120能真正查询就绪状态。三、运行时适配器process.managers.native.adapter.*能力描述能做什么适配器描述运行时如何托管和停止管理器。adapter同样在 native.nix 中声明为内部只读选项原生管理器的默认适配器为选项类型默认值含义process.managers.native.adapter.terminalnone/controllingnone管理器启动器所需的终端。none表示管理器运行期间不依赖控制终端因此可以后台运行process.managers.native.adapter.stopnative-api/command/process-scopenative-api停止运行中管理器所用的适配器process.managers.native.adapter.clientnone/native-apinative-apiattach、就绪查询与单进程控制使用的客户端协议各适配器取值的语义如下terminal 适配器none表示管理器没有持续控制终端需求controlling表示管理器运行期间必须保持与控制终端连接如 mprocs因此它无法后台启动。stop 适配器native-apidevenv 通过自身的原生管理器控制协议请求管理器关闭原生管理器的默认方式commanddevenv 先调用管理器专属停止命令再做最终的进程作用域清理process-scopedevenv 直接终止记录的 OS 进程作用域并验证管理器及其后代进程都已退出。client 适配器指明 attach、就绪、单进程控制所用的协议。native-api使用 devenv 原生管理器的 socketnone表示这些能力必须保持禁用。在 processes.nix 的模块断言中可以看到这些适配器之间的约束关系使用commandstop 适配器的管理器必须提供process.managers.name.stopCommand而使用其他 stop 适配器的管理器必须将其保持为null暴露 attach/就绪/单进程控制能力的管理器必须提供非none的 client 适配器native-apiclient 适配器只能由原生管理器使用。四、快速上手定义并运行进程4.1 基本配置原生管理器不需要任何启用配置默认开启。直接在devenv.nix中用processes属性定义进程即可{ pkgs, ... }: { processes { silly-example.exec while true; do echo hello sleep 1; done; ping.exec ping localhost; server { exec python -m http.server; cwd ./public; }; }; }exec是要运行的 Bash 代码cwd指定进程工作目录缺省时使用当前目录。4.2 启动与停止$ devenv up # 前台启动全部进程并显示实时状态/日志 $ devenv down # 停止后台启动的进程devenv down是devenv processes down的简写。在 CI 等场景下等待所有进程就绪$ devenv processes wait --timeout 120--timeout默认值为 120 秒。4.3 后台启动与 attach原生管理器支持启动客户端退出后管理器仍在后台运行background_start$ devenv up -d # 后台启动全部进程 $ devenv processes stop api $ devenv up api # attach 上去并把 api 重新拉起当后台已有运行中的原生管理器时再次执行devenv up不会失败而是attach 到已运行的管理器它会启动当前已启用但未运行的进程并遵循after/before依赖流式展示进程状态与日志按 Ctrl-C 即分离且进程继续运行。attach 时客户端会报告本次调度了哪些进程、哪些已在运行若没有可启动的进程则以非零码退出。$ devenv processes attach # 仅附加实时视图不启动任何进程仅原生管理器需要注意attach 不拾取配置变更。attach 调度使用的是运行中管理器当初的配置修改devenv.nix后需要重启管理器$ devenv processes down devenv up -d另外裸devenv up只启动start.enable true的进程显式指定的进程名以及devenv processes start name则始终启动即使其start.enable为false。当没有管理器在运行时devenv processes start name会在后台只启动该命名进程的管理器。4.4 进程级选项总览processes.name每个进程的完整可配置项定义于 processes.nix选项类型/默认说明execstring必填运行进程的 Bash 代码cwdnull/ string进程工作目录envattrsOf string进程环境变量start.enableboolean默认true是否随devenv up自动启动false的进程在 TUI 中显示为 stopped可手动选中启动after/beforelistOf string进程/任务依赖支持started、ready进程默认/succeeded任务默认、completed后缀restart子模块onnever/always/on_failure默认on_failuremax最大重启次数默认 5null为无限window滑动限流窗口秒数shutdown子模块signal默认 15即 SIGTERM、grace默认 5 秒之后 SIGKILLready子模块就绪探针exec、http.get、notify三种类型含initial_delay/period/probe_timeout/success_threshold/failure_threshold/timeout计时选项watch子模块paths、extensions、ignore文件变化时自动重启长驻进程或重跑一次性命令listenlistsocket activationTCP 或 unix socket向进程传递LISTEN_FDS/LISTEN_PID/LISTEN_FDNAMESwatchdog子模块systemd 兼容看门狗usec微秒间隔、require_readyports.name.allocateport自动端口分配解析值通过config.processes.name.ports.port.value读取linux.capabilitieslistOf string附加的 Linux ambient capabilities如net_bind_serviceproxy.hostname/proxy.https.enablestring / bool共享 HTTP 代理的.localhost主机名与 HTTPS五、底层实现Nix 侧如何驱动原生管理器从 native.nix 源码可以看到原生管理器的启用与编排是自动完成的自动启用process.managers.native.enable是内部选项internal true且 processes.nix 中process.manager.implementation在 devenv CLI 版本 ≥ 2.0 时默认即为native因此新项目无需任何额外配置。进程即任务在 processes.nix 中每个进程都会被注册为名为devenv:processes:name的 tasktype process进程的env、cwd、after、before、ready、restart、listen、ports、watch、watchdog、shutdown、linux配置会完整映射到该任务上。这解释了为什么进程依赖可以引用devenv:processes:database这种任务名。单次devenv-tasks run驱动devenv up从 Rust 侧直接调用原生任务执行器不再构建 procfile 脚本而对于 processes 容器、nix run .#devenv-upflake-compat与config.ci等代码路径native.nix 将process.manager.command默认设置为一次devenv-tasks run --mode all --cache-dir ... --runtime-dir ...调用使全部进程任务共享同一个 NativeProcessManager 实例。约束断言原生管理器不支持process.manager.before/process.manager.afterprocesses.nix 会直接报错需要前后钩子时应改用带进程依赖的 tasks同时同一时刻只允许启用一个进程管理器assertions中校验。Rust 侧的核心运行时代码分布在 devenv-processes/srcmanager.rs负责管理器主体supervisor.rs/supervisor_state.rs负责单个进程监督process_scope.rs负责进程作用域记录与清理process_guardian.rs负责看门守护即使devenv/devenv-tasks被杀仍执行优雅停机socket_activation.rs实现 socket 传递capabilities.rs实现 Linux 能力授权。六、深度特性Linux capabilities 与能力代理原生管理器允许非 root 运行的服务获得受限的内核能力。例如让 Caddy 绑定 443 端口{ processes.web { exec caddy run; linux.capabilities [ net_bind_service ]; }; }从 capabilities.rs 源码看当前允许的能力共 10 项net_bind_service绑定 1024 以下端口、net_raw、net_admin、ipc_lock、sys_nice、sys_resource、sys_admin、chown、dac_override、fowner。名称支持cap_前缀与全大写拼写。Linux capabilities 当前不能与 socket activation 在同一进程上组合使用。其运行机制是devenv 启动前先用sudo认证一次交互环境中会在 TUI 上显示各进程请求的能力清单并暂停交互等待授权非交互环境需先执行sudo -v随后通过 sudo 拉起一个常驻特权代理capability broker该代理以 root 身份 fork 出目标进程降回你的用户/组 ID 并仅保留请求的 ambient capabilities 后 exec 服务本身。代理只允许启动已声明的能力进程且在管理器生命周期内持续可用因此分离的进程和监督重启不会再重复弹 sudo 提示。在非 Linux 平台上该选项会被忽略并告警进程照常以无特权方式启动保证同一份devenv.nix在 macOS 上也可用。七、与其他进程管理器的取舍原生管理器是默认且功能最全的实现。如果既有工作流强依赖某个外部管理器可通过以下方式切换{ process.manager.implementation process-compose; }各管理器能力对比如下详见 processes.mdx管理器后台启动devenv attach等待就绪单进程控制冷启动子集nativeYesYesYesYesYesprocess-composeYesNoNoNoYesovermindYesNoNoNoYeshonchoYesNoNoNoYeshivemindYesNoNoNoNomprocsNoNoNoNoNo各列含义后台启动对应background_startdevenv up -d可先返回而管理器与进程继续运行devenv attach对应devenv_attach等待就绪对应wait_readydevenv processes wait单进程控制对应individual_controldevenv processes start/stop/restart冷启动子集对应cold_start_subset如devenv up -d api worker。适配器对比管理器终端适配器停止适配器客户端适配器nativenonenative-apinative-apiprocess-composenoneprocess-scopenoneovermindnonecommandnonehonchononeprocess-scopenonehivemindnoneprocess-scopenonemprocscontrollingprocess-scopenone值得注意的是选择某个管理器不代表它支持所有进程命令。CLI 会在启动管理器之前拒绝其能力不支持的操作。此外能力与适配器属于内部实现数据而非公开 Nix 选项当新 CLI 配合未声明这些数据的旧版 Nix 模块使用时CLI 会为已知管理器使用内置的兼容性声明未知管理器不隐式获得任何可选能力。八、版本行为与注意事项TUI 的 Ctrl-C 行为根据 native.nix 中的 changelog原生管理器的交互式 TUI 中第一次 Ctrl-C 不再直接退出而是弹出退出确认提示——按c继续运行按q或再次 Ctrl-C 退出环境。前台 attach 视图中的 Ctrl-C 则仅分离、不停止进程。devenv up采用before模式调度它只运行每个进程的上游依赖不会运行挂在进程下游的 setup 任务如processes.name.before [ devenv:name:configure ]会被跳过。需要时可给该任务加wantedBy [ devenv:processes:name ]2.3.2或用devenv up --mode all。端口分配竞态防护devenv 在配置求值期间持有已分配的端口以防止竞态然后在启动进程前释放供应用绑定严格模式下可用devenv.yaml的strict_ports: true或devenv up --strict-ports让端口冲突直接报错。文件监听路径解析watch.paths相对于devenv.nix项目根目录解析而非进程的cwd请使用./src这类路径字面量会以绝对路径传给 watcher。九、总结devenv 原生进程管理器凭借内置默认、零配置启用、完整能力集与 Rust 原生运行时成为编排开发栈的首选capabilities声明其能做什么后台启动、attach、等待就绪、单进程控制、冷启动子集adapter定义其如何运行none终端、native-api停止与客户端协议二者共同支撑devenv up/down/processes系列命令的完整语义。若需深入了解进程配置的每一项细节就绪探针、重启策略、socket activation、文件监听、端口分配、HTTPS 代理等请继续阅读 Processes 主指南或在仓库中查看 native.nix 模块、processes.nix 进程类型定义与 devenv-processes/src 的 Rust 运行时实现。赞分享开发工具CLI【免费下载链接】devenvFast, Declarative, Reproducible, and Composable Developer Environments using Nix项目地址https://gitcode.com/gh_mirrors/de/devenv点击查看免费下载相关推荐Unison 中 GADT 索引能力GADT-indexed Abilities实战指南类型索引、handler 分支精化与索引感知的覆盖检查Unison 中 GADT 索引能力GADT indexed Abilities实战指南类型索引、handler 分支精化与索引感知的覆盖检查 导读 Un编程语言编译器语言运行时开发工具Hyperf 自定义进程Custom Process完整实战指南从注册、配置到进程生命周期管理Hyperf 自定义进程Custom Process完整实战指南从注册、配置到进程生命周期管理 导读 本文聚焦 Hyperf 框架的自定义进程Custo后端Web框架微服务RPC框架异步编程Hyperf 自定义进程Custom Process完全指南创建、注册、配置与源码原理Hyperf 自定义进程Custom Process完全指南创建、注册、配置与源码原理 Hyperf 基于 Swoole 常驻内存模型构建除了 Mast后端Web框架微服务RPC框架异步编程创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考