我正在使用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错误。
答案 0 :(得分:1)
'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 ]);