在 expressJS 应用程序中,是否可以在脚本执行时实时收集写入控制台的数据?
in an expressJS application, is it possible to collect data written to the console in real-time as a script is executing?
我正在尝试将 bash 脚本的输出导入到 ExpressJS 应用程序中,然后我可以将数据发送到客户端。
我在下面创建了一个脚本,它模拟了我将用于我的项目的实际脚本的输出。我希望能够在写入终端时收集这些数据,将其存储在我的 express 应用程序中的一个变量中,然后我可以通过 SSE 或 websocket 发送数据。
n=`expr 10 \* `
executionprocessing="processing"
jobdone="done"
sleep 5
echo $executionprocessing
sleep 5
echo $jobdone
echo $n
我目前拥有的:
app.post('/compute', function(req, res) {
shell.exec('sh ./Scripts/mytestscript.sh 10', function(code, stdout, stderr) {
console.log('code:' + code)
console.log('stdout:' + stdout)
})
})
当有post请求时,shellJS在本地目录中执行一个脚本并将输出写入控制台。问题是,当脚本完成执行时,数据是一次性写入的,而不是数据来了就写入。我希望能够实时与这些数据进行交互。这甚至可能吗?
编辑:
子进程是要走的路。这是我为遇到此问题的其他人提供的解决方案。
const child = spawn('sh',['mytestscript.sh','10'],{cwd:'./Scripts'})
child.stdout.on('data', (data) => {
console.log('code:' + data.toString())
});
据我所知,这不能用 ShellJS 完成。但是,应该可以使用节点的内置子进程模块。您可以将 sh ./Scripts/mytestscript.sh 10
传递给 spawn, which will return a ChildProcess 对象。该对象的属性之一 stdout
是一个可读流,它流式传输脚本的标准输出。
代码可能看起来像这样:
const { spawn } = require('child_process');
var child = spawn('sh ./Scripts/mytestscript.sh 10');
child.stdout.on('data', (data) => {
// do stuff with data chunk that the script sent to stdout
});
如果您只想将数据直接发送到 websocket,那么也可以只执行 child.stdout.pipe(yourWebsocketSteam);
.
我正在尝试将 bash 脚本的输出导入到 ExpressJS 应用程序中,然后我可以将数据发送到客户端。 我在下面创建了一个脚本,它模拟了我将用于我的项目的实际脚本的输出。我希望能够在写入终端时收集这些数据,将其存储在我的 express 应用程序中的一个变量中,然后我可以通过 SSE 或 websocket 发送数据。
n=`expr 10 \* `
executionprocessing="processing"
jobdone="done"
sleep 5
echo $executionprocessing
sleep 5
echo $jobdone
echo $n
我目前拥有的:
app.post('/compute', function(req, res) {
shell.exec('sh ./Scripts/mytestscript.sh 10', function(code, stdout, stderr) {
console.log('code:' + code)
console.log('stdout:' + stdout)
})
})
当有post请求时,shellJS在本地目录中执行一个脚本并将输出写入控制台。问题是,当脚本完成执行时,数据是一次性写入的,而不是数据来了就写入。我希望能够实时与这些数据进行交互。这甚至可能吗?
编辑: 子进程是要走的路。这是我为遇到此问题的其他人提供的解决方案。
const child = spawn('sh',['mytestscript.sh','10'],{cwd:'./Scripts'})
child.stdout.on('data', (data) => {
console.log('code:' + data.toString())
});
据我所知,这不能用 ShellJS 完成。但是,应该可以使用节点的内置子进程模块。您可以将 sh ./Scripts/mytestscript.sh 10
传递给 spawn, which will return a ChildProcess 对象。该对象的属性之一 stdout
是一个可读流,它流式传输脚本的标准输出。
代码可能看起来像这样:
const { spawn } = require('child_process');
var child = spawn('sh ./Scripts/mytestscript.sh 10');
child.stdout.on('data', (data) => {
// do stuff with data chunk that the script sent to stdout
});
如果您只想将数据直接发送到 websocket,那么也可以只执行 child.stdout.pipe(yourWebsocketSteam);
.