2

我正在尝试将 bash 脚本的输出输入到 ExpressJS 应用程序中,然后我可以将数据发送到客户端。我在下面创建了一个脚本,它模仿了我将用于我的项目的实际脚本的输出。我希望能够在写入终端时收集这些数据,将其存储在我的 express 应用程序中的一个变量中,然后我可以通过 SSE 或 websocket 发送数据。

n=`expr 10 \* $1`
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())
});
4

1 回答 1

2

据我所知,这不能用 ShellJS 完成。但是,应该可以使用节点的内置子进程模块。您可以传递sh ./Scripts/mytestscript.sh 10spawn,它将返回一个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);.

于 2019-01-07T08:45:57.810 回答