为什么我不能使用Node JS中的subprocess输出响应?
我正在使用Express和试图执行脚本并通过AJAX将该脚本的输出返回到客户端的节点JS。 该脚本正在成功完成,但出于某种原因,我无法得到输出显示在后响应。
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运行。 如果我看看永久日志,它会显示:
永远检测到的脚本被SIGKILL信号杀死
不确定那是什么意思。 看起来脚本正在成功完成。
编辑为了解决艾康的答案在下面。 我尝试了以下,但仍然没有去。
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 }); }); });
就好像成功函数永远不会启动,因为它永远不会在控制台中logging“完成”。 它只是在控制台中logging了“start …”和上面的SIGKILL错误。
您的脚本可以从subprocess读取输出之前终止(并重新启动)自己的脚本。
再看看你的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(); }); });
- 如果错误不为空,则输出未定义=>失败
- stringify错误之后是空的对象。
'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}))
你的代码中有一个语法错误。 尝试:
res.json({ error: error, output: stdout, error_log: stderr });
或者你可以做:
res.json([ error, stdout, stderr ]);