javascript - 为什么我无法响应 Node JS 中子进程的输出?

标签 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 });
    });
});

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

Forever detected script was killed by signal: 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 错误。

最佳答案

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

再次查看您的update.sh:

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

#this command restarts your script
forever restartall

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

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();
  });
});

关于javascript - 为什么我无法响应 Node JS 中子进程的输出?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38493776/

相关文章:

javascript - 如何通过原型(prototype) Ajax.Request() 传递 HTTP AUTH 值?

linux - 如何将文件中的变量读取到shell脚本中?

linux - 这个基于 RANDOM 的命令在 bash 中意味着什么?

javascript - Sails.js - 尝试显示模型数据时出现问题

javascript - 获取对象字面量内定义的符号的值并迭代其值

java - Google V8 的工作方式与 Java 虚拟机类似吗?

windows - WSL2 : Launching VSCode from the command line using a *. 代码工作区文件

javascript - 如何阻止表单提交进入循环?

c# - 需要 javascript 验证下拉列表

javascript - 如何在 Typescript 中使用绝对路径?