我正在将 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/