nodejs exec命令失败,没有有用的错误消息

Shr*_*lla 11 javascript exec child-process node.js

这是要执行的代码



    cp.exec("cc -Wall /tmp/test.c -o /tmp/test", function(e, stdout, stderr) {
        if (e) {
            var errorstr = "Compilation failed with the following error
"+ e.message.toString() client.send(errorstr) console.log(e, stdout, stderr) ee.prototype.removeAllListeners() } else if (stderr.length > 0) { client.send("Compilion finished with warnings\n"+ stderr + '\n') client.send('compiled') ee.prototype.emit('compiled') } else { client.send("Compilation successful") ee.prototype.emit('compiled') } })
Run Code Online (Sandbox Code Playgroud)

'client'是socket.io的回调参数的参数.'ee'是EventEmitter的一个实例

来了问题.在运行代码时,回调表明该命令不成功.console.log(e,stdout,stderr)是

{ [Error: Command failed: ] killed: false, code: false, signal: undefined } '' ''

/tmp/test.c是一个有效的C代码以及检查目录/ tmp,我发现test.c的是适当的和二进制"测试" 生成并在上壳运行,则适当地执行.所以我不明白为什么它会导致执行不成功.错误对象的信息也没有用.希望得到一些帮助/解释

Aar*_*lla 8

我有点担心控制台的输出.

{ [Error: Command failed: ] killed: false, code: false, signal: undefined }
Run Code Online (Sandbox Code Playgroud)

看起来不像是一个合适的JSON/JavaScript对象,尤其是那个[Error: Command failed: ]部分; 至少有一个逗号丢失.

建议:

  1. 从命令行运行命令并检查退出代码(使用echo $?).如果退出代码是!= 0,那么这意味着命令"失败"(无论这意味着什么).

  2. 当命令失败时,nodejs表示会将退出代码放入e.code(我在输出中缺少...).找出这个值发生了什么.

  3. 尝试if(e !== null)而不是if(e).但是,不应该有所作为.

  4. 不要直接调用编译器,而是调用一个shell脚本,它将stderr/stdout重定向到一个文件(或使用保存副本cc ... |& tee /tmp/cc.log),以确保复杂设置的任何部分都不会吞下重要信息.