为什么我不能回应Node JS中子进程的输出?

时间:2016-07-21 02:15:37

标签: javascript node.js bash express

我正在使用Node JS和Express,并尝试执行脚本并通过AJAX将该脚本的输出返回给客户端。该脚本已成功完成,但由于某些原因,我无法在后置响应中显示输出。

let childProcess = require('child_process');

router.post('/update', (req, res) => {
    childProcess.exec('/home/dir/app/update.sh', { shell: '/bin/bash' }, (error, stdout, stderr) => {
        res.json({ error, stdout, stderr });
    });
});

使用Forever运行Node进程。如果我查看永远日志,它会显示:

  

永远检测到的脚本被信号杀死:SIGKILL

不确定这意味着什么。看来脚本正在成功完成。

修改 解决Aikon的答案如下。我试过以下但仍然没有去。

router.post('/update', (req, res) => {
    console.log('start...');

    childProcess.exec('/home/dir/app/update.sh', { shell: '/bin/bash' }, (error, stdout, stderr) => {
        console.log('done');

        error = error || '';
        stdout = stdout || '';
        stderr = stderr || '';

        res.json({ error, stdout, stderr });
    });
});

就好像成功函数永远不会被触发,因为它永远不会在控制台中记录“完成”。它只是在控制台中记录“start ...”和上面的SIGKILL错误。

3 个答案:

答案 0 :(得分:1)

  1. 如果错误不为空,则输出为undefined =>失败
  2. stringify错误后是空对象。
  3. 'use strict';
    let error = new Error('err');
    let str = 'text';
    let obj = {a: 10, b: 15}; // Try comment to get fall
    console.log(JSON.stringify({error, str, obj}))
    

答案 1 :(得分:1)

你的脚本在之前杀死(并重新启动),它可以读取子进程的输出。

再次查看update.sh

#!/bin/bash
git pull
npm install
npm run build

#this command restarts your script
forever restartall

您可以删除update.sh的最后一行,并在发送响应后退出脚本,forever应该使用更新版本重新启动它。

router.post('/update', (req, res) => {
  childProcess.exec('/home/dir/app/update.sh', { shell: '/bin/bash' }, 
  (error, stdout, stderr) => {
    res.json({ error, stdout, stderr });
    process.exit();
  });
});

答案 2 :(得分:0)

您的代码中存在语法错误。尝试:

res.json({ error: error, output: stdout, error_log: stderr });

或者你可以这样做:

res.json([ error, stdout, stderr ]);