Node.js 子进程的 cwd 和 env 如何设置,为什么会找不到命令?
解释 cwd 只改变子进程工作目录、env 显式对象不会自动与父环境合并,结合绝对可执行路径示例说明 PATH 查找、相对文件路径和跨平台环境键名问题。
Node.js · 进程与线程面试题第 1 页,显示第 1–42 题,共找到 42 道完整解析,可继续按分类、标签与关键词缩小范围。
按稳定语义路径排序
解释 cwd 只改变子进程工作目录、env 显式对象不会自动与父环境合并,结合绝对可执行路径示例说明 PATH 查找、相对文件路径和跨平台环境键名问题。
解释 detached 的平台差异、unref 对父事件循环引用的影响和 stdio 连接的责任,说明它们不提供守护重启或资源管理,并给出后台任务应交给进程管理器的判断依据。
区分 spawn 的参数校验异常、异步启动失败和程序非零退出,解释 ENOENT 的命令与 cwd 来源,并用 Promise 包装示例展示及时监听 error 以及只结算一次的调用接口。
解释 execFile 默认不经过 shell 时元字符如何作为普通参数传递,通过参数回显示例验证边界,并讨论 shell:true、选项注入、路径授权、Windows 脚本与运行权限的限制。
区分子进程退出与标准流关闭,说明 exit 后输出仍可能到达、共享管道为何延迟 close,以及启动失败、退出信号和输出收集任务应如何统一收尾。
说明 fork 是启动 Node 子进程并建立 IPC 的专用方式,区分它与操作系统 fork、共享内存和普通 spawn,并讨论消息序列化、send 回调、业务确认、背压及断连后的任务状态。
解释 exec 与 execFile 收集 stdout、stderr 的缓冲限制,使用中文输出示例区分字符数与字节数,并比较调整有界预算、spawn 流式消费、文件输出和保留有效诊断的处理方式。
围绕“如何实现 Node.js 子进程之间类似 shell 管道 a | b 的数据流转”给出直接结论、机制拆解、可复现验证、常见误区与追问,重点覆盖必须答出将一个子进程的 stdout pipe 到另一个的 stdin 及错误传播处理。
围绕“fork 的子进程 IPC 发送对象时序列化机制是什么,哪些类型不能传”给出直接结论、机制拆解、可复现验证、常见误区与追问,重点覆盖必须答出默认 JSON 序列化丢失函数/undefined/Symbol 及 advanced 序列化的差异。
围绕“spawn 时设置 shell:true 会带来哪些行为变化和代价”给出直接结论、机制拆解、可复现验证、常见误区与追问,重点覆盖必须答出 shell:true 支持管道通配符等 shell 语法但增加注入风险和进程开销。
从 shell 解析、参数传递、输出消费和进程生命周期比较 spawn 与 exec,说明 execFile 的位置、大输出与长任务的选择,以及异步创建进程为什么仍需要处理背压和错误。
按 stdin、stdout、stderr 三个文件描述符解释 stdio 配置,比较管道消费、终端继承和忽略输出,说明 null 流、背压、交互工具及 IPC 对进程退出的影响。
说明同步子进程阻塞当前 Node 线程事件循环的范围,区分 spawnSync 返回结果与 execSync 抛错,并纠正 timeout 一定按时返回的误解,给出 CLI、启动任务和服务请求的选择依据。
围绕“Node.js 父进程异常退出后其子进程会怎样,如何避免孤儿进程”给出直接结论、机制拆解、可复现验证、常见误区与追问,重点覆盖必须答出父进程崩溃不会自动回收子进程及退出钩子/killSignal/tree-kill 的清理方案。
围绕“Node.js cluster 模块如何工作,为什么能监听同一个端口”给出直接结论、机制拆解、可复现验证、常见误区与追问,重点覆盖必须答出主进程创建多个 worker 进程、主进程或操作系统分发连接实现端口共享。
围绕“cluster 模块的轮询调度策略在 Windows 之外如何分发新连接”给出直接结论、机制拆解、可复现验证、常见误区与追问,重点覆盖必须答出默认 round-robin 由主进程接收连接并轮流分发给 worker、可用 schedulingPolicy 修改。
围绕“cluster 模式下 WebSocket 或有状态连接为什么需要粘性会话,如何实现”给出直接结论、机制拆解、可复现验证、常见误区与追问,重点覆盖必须答出轮询分发会把同一会话的连接落到不同 worker、需按客户端标识哈希分发或外置共享状态。
围绕“多核利用场景下 cluster 和 worker_threads 分别适合什么任务”给出直接结论、机制拆解、可复现验证、常见误区与追问,重点覆盖必须答出 cluster 隔离进程适合服务横向扩容与故障隔离、Worker 线程适合计算卸载与共享内存。
围绕“cluster 的主进程和 worker 进程之间如何通信”给出直接结论、机制拆解、可复现验证、常见误区与追问,重点覆盖必须答出 worker 基于 fork 内置 IPC 通道用 send/message 交换消息。
围绕“cluster 中某个 worker 崩溃后如何保证服务整体可用”给出直接结论、机制拆解、可复现验证、常见误区与追问,重点覆盖必须答出监听 exit 事件自动 fork 新 worker、配合重启频率限制防崩溃风暴。
围绕“如何用 cluster 实现 Node.js 服务的平滑重启(零停机发布)”给出直接结论、机制拆解、可复现验证、常见误区与追问,重点覆盖必须答出逐个 fork 新 worker 并优雅关闭旧 worker 先停收新连接再处理完存量请求。
围绕“不引入 worker_threads 时如何把一个长 CPU 计算拆小避免阻塞事件循环”给出直接结论、机制拆解、可复现验证、常见误区与追问,重点覆盖必须答出用 setImmediate/定时器把循环切片让出事件循环及其与 Worker 方案的性能差距。
围绕“设计 Node.js 接口服务时如何判断一个任务应该卸载到 Worker 线程”给出直接结论、机制拆解、可复现验证、常见误区与追问,重点覆盖必须答出按任务耗时与调用频率评估对事件循环的影响、给出生成器分片/Worker 的取舍标准。
围绕“子进程 IPC 消息发送过快时 send 返回 false 意味着什么”给出直接结论、机制拆解、可复现验证、常见误区与追问,重点覆盖必须答出 IPC 通道有内部缓冲、返回 false 表示需等待 drain 否则内存积压。
围绕“Node.js IPC 中 send(message, sendHandle) 传递句柄能实现什么”给出直接结论、机制拆解、可复现验证、常见误区与追问,重点覆盖必须答出可把 TCP server/socket 句柄传给子进程让多个进程共享监听或接管连接。
围绕“进程间通信选择 Node.js 内置 IPC 还是本地 TCP/Unix Socket,依据是什么”给出直接结论、机制拆解、可复现验证、常见误区与追问,重点覆盖必须答出内置 IPC 零配置但仅限 fork 的子进程关系、跨语言跨机器需走标准网络协议。
围绕“进程级隔离和线程级隔离在 Node.js 故障场景下的行为差异是什么”给出直接结论、机制拆解、可复现验证、常见误区与追问,重点覆盖必须答出子进程崩溃不影响父进程、Worker 内崩溃可控但共享内存误写会污染数据。
围绕“在 Worker 线程中 AsyncLocalStorage 等异步上下文能否跨线程传递”给出直接结论、机制拆解、可复现验证、常见误区与追问,重点覆盖必须答出每个 Worker 有独立事件循环与上下文、跨线程传递需显式携带数据。
围绕“Node.js Worker 线程中 Atomics.wait 和 Atomics.notify 解决什么问题”给出直接结论、机制拆解、可复现验证、常见误区与追问,重点覆盖必须答出 SharedArrayBuffer 读写竞争需要 Atomics 做原子操作与阻塞唤醒。
围绕“如何在 Node.js 中创建 Worker 线程执行 CPU 密集计算”给出直接结论、机制拆解、可复现验证、常见误区与追问,重点覆盖必须答出 new Worker 传脚本路径、postMessage 发任务、message 事件收结果的完整流程。
围绕“BroadcastChannel 在 worker_threads 场景下提供什么通信能力”给出直接结论、机制拆解、可复现验证、常见误区与追问,重点覆盖必须答出同名频道多线程发布订阅的广播模型及与 MessagePort 点对点模型的区别。
围绕“为什么 Node.js 的 CPU 密集任务应该放到 worker_threads 而不是主线程”给出直接结论、机制拆解、可复现验证、常见误区与追问,重点覆盖必须答出单线程事件循环被长计算阻塞会拖垮所有请求、Worker 利用多核并行。
围绕“Worker 线程抛出未捕获异常时主线程如何感知和处理”给出直接结论、机制拆解、可复现验证、常见误区与追问,重点覆盖必须答出监听 worker 的 error 与 exit 事件、异常默认终止该 Worker 但不拖垮主线程。
围绕“MessageChannel 如何让两个 Worker 线程不经过主线程直接通信”给出直接结论、机制拆解、可复现验证、常见误区与追问,重点覆盖必须答出创建端口对并把 port 转移给两个 Worker 建立直连通道的场景价值。
围绕“parentPort 和 isMainThread 在 worker_threads 中分别起什么作用”给出直接结论、机制拆解、可复现验证、常见误区与追问,重点覆盖必须答出同一文件双角色写法中用 isMainThread 分流、parentPort 在子线程内与主线程通信。
围绕“如何设计一个 Node.js Worker 线程池来处理批量 CPU 密集任务”给出直接结论、机制拆解、可复现验证、常见误区与追问,重点覆盖必须答出固定数量 Worker、任务队列分发、空闲回收与结果回调映射的设计要点。
围绕“Worker 线程池的线程数量应该依据什么来确定”给出直接结论、机制拆解、可复现验证、常见误区与追问,重点覆盖必须答出 CPU 密集场景按物理核数设置、过多线程增加上下文切换与内存开销。
围绕“Worker 线程的 resourceLimits 选项能限制哪些资源,解决什么问题”给出直接结论、机制拆解、可复现验证、常见误区与追问,重点覆盖必须答出可限制 young/old 代堆大小防止单个 Worker 耗尽内存影响主线程。
围绕“worker.terminate() 的语义是什么,调用后还能复用该 Worker 吗”给出直接结论、机制拆解、可复现验证、常见误区与追问,重点覆盖必须答出 terminate 强制结束线程返回 Promise、Worker 不可复用需重建。
围绕“Worker 线程间如何用 transferList 转移 ArrayBuffer 的所有权”给出直接结论、机制拆解、可复现验证、常见误区与追问,重点覆盖必须答出转移后原线程的 buffer 失效实现零拷贝传递及其与克隆的性能差异。
围绕“worker_threads 与 child_process 在架构上的核心差异是什么”给出直接结论、机制拆解、可复现验证、常见误区与追问,重点覆盖必须答出 Worker 是线程共享内存低开销、子进程独立内存高隔离及选型依据。
围绕“workerData 适合向 Worker 线程传什么,和 postMessage 传参有何不同”给出直接结论、机制拆解、可复现验证、常见误区与追问,重点覆盖必须答出 workerData 是创建时克隆的只读初始化数据、postMessage 用于运行时双向通信。