`ChildProcess.run` puts `null` or a string into `exitCode : Int` after a timeout, a signal or too much output
还没有人认领这个 Issue。
评估
- 难度
- 3/5
- 预计耗时
- 1-2 天
- 新手友好度
- 74/100
- Issue 类型
- 缺陷
- 描述清晰度
- 描述清楚
- 活跃度
- 活跃
- 技术栈
- javascript, node.js
调研方向
Start with Gren/Kernel/ChildProcess.js and run the linked 2026-09-14-childprocess-exitcode reproduction in gren-bug-reports. Inspect how execFile errors map err.code, err.killed, and err.signal into ProgramError, then cover normal exit, timeout, signal, and maximum-output cases with regression tests. Done means exitCode consistently matches its declared Int type and the termination cases remain distinguishable.
由索引模型根据 Issue 内容生成。
描述
Found against: gren 0.6.6, gren-lang/core 7.4.2, gren-lang/node 6.1.3, node 22
Reproduction: in https://github.com/gilramir/gren-bug-reports, 2026-09-14-childprocess-exitcode; ./run.sh prints the run
below.
Summary
ChildProcess.run fails with ProgramError { exitCode : Int, … } whenever the
program was started and did not succeed. When the program did not exit with a
code, which is what runDuration and a signal do, and when it wrote more than
maximumBytesWrittenToStreams, exitCode is not an Int:
| how the program ended | String.fromInt e.exitCode |
e.exitCode + 1 |
e.exitCode > 0 |
|---|---|---|---|
sh -c "exit 3" |
3 |
4 |
True |
stopped by runDuration = Milliseconds 100 |
null |
1 |
False |
wrote past maximumBytesWrittenToStreams = 4 |
ERR_CHILD_PROCESS_STDIO_MAXBUFFER |
ERR_CHILD_PROCESS_STDIO_MAXBUFFER1 |
False |
killed by a signal (kill -9 $$) |
null |
1 |
False |
Every value in the last three rows is one no Int can be, so a program that
checks the exit code gets an answer that means nothing, and arithmetic on it
yields a string. A program cannot tell a timeout from a signal, or either from
too much output, except by inspecting a value its type says is a number.
The cause is in Gren/Kernel/ChildProcess.js, where execFile's error becomes
the ProgramError:
__$exitCode: err.code,
Node's err.code is the exit code only when the process exited. After a
timeout or a signal it is null, and err.killed and err.signal say what
happened. When the output passed maxBuffer it is the error's own code, the
string ERR_CHILD_PROCESS_STDIO_MAXBUFFER.
Reproduction
$ node app
exit 3: ProgramError, exitCode = 3, exitCode + 1 = 4, exitCode > 0 = True
killed by runDuration: ProgramError, exitCode = null, exitCode + 1 = 1, exitCode > 0 = False
past maximumBytesWrittenToStreams: ProgramError, exitCode = ERR_CHILD_PROCESS_STDIO_MAXBUFFER, exitCode + 1 = ERR_CHILD_PROCESS_STDIO_MAXBUFFER1, exitCode > 0 = False
killed by a signal: ProgramError, exitCode = null, exitCode + 1 = 1, exitCode > 0 = False
- 主要语言
- JavaScript
- 星标
- 13
- 派生
- 6
- 平均合并
- 4 天 10 小时
- 30 天内合并 PR
- 4
环境准备
这个项目没有提供开发容器、Dockerfile 或贡献指南,环境需要你自己搭建:先看它的 README,通用步骤见我们的新手贡献指南。
从这里开始
- 先读完整个 Issue,再读项目的贡献指南。
- 在 Issue 下留言说明你要接手 —— 这能避免两个人做同样的事。
- Fork 仓库,在一个分支上完成修改。
- 提交 Pull Request,并在描述里引用这个 Issue 编号。
gren-lang/node 的其他 Issue
-
bug
难度 2/5 1-3 小时 新手友好度 86/100
-
`ChildProcess.spawn` with `NoShell` looks for a program named after the program and its arguments未关闭bug
难度 2/5 1-3 小时 新手友好度 82/100
-
bug
难度 2/5 1-3 小时 新手友好度 78/100
-
breaking enhancement
难度 3/5 1-2 天 新手友好度 42/100
-
breaking bug
难度 3/5 1-2 天 新手友好度 64/100
相似的 Issue
-
feature task
难度 2/5 1-3 小时 新手友好度 72/100
RealDevSquad/website-www#1178 ·
-
难度 2/5 1-3 小时 新手友好度 68/100
netlify-labs/nax#56 · 2 条评论 · 1 个 reaction ·
-
accessibility bug revealjs
难度 2/5 1-3 小时 新手友好度 84/100
quarto-dev/quarto-cli#14961 ·
维护者通常 1 天内回复
-
难度 1/5 1 小时以内 新手友好度 88/100
PnX-SI/GeoNature#4435 · 2 条评论 ·
维护者通常 1 天内回复
-
bug
难度 2/5 1-3 小时 新手友好度 85/100
openlayers/openlayers#17648 ·
维护者通常 1 天内回复