电子反应从终端命令监听标准输出

问题描述

我正在编写一个电子应用程序,需要从命令行执行一个长时间运行的进程并实时监控输出,但我不知道如何实现这个目标。

基本上如果终端命令打印“找到我!”然后我希望应用程序像处理某种事件一样处理它。

到目前为止,我已经能够做到:

  1. 使用“spawn”从电子启动终端命令
  2. 使用“console.log”打印终端命令的输出
  3. 它似乎一直在异步打印 - 这出乎意料但很好。

tsx:以下代码将打印终端命令的输出

app.example.com

谢谢

解决方法

您应该使用 child_process.spawn 来运行命令,您将监听来自 stdoutstderr 的信号,它们是可读流。当信号到达时,您的应用就应该采取行动。

let subprocess = child_process.spawn(
    'command',// see note
    ['arg1','arg2']
)

subprocess.on('error',() => subprocess = null) // couldn't launch the process
subprocess.stdout.on('data',YOUR_EVENT_HANDLER)
subprocess.stderr.on('data',YOUR_EVENT_HANDLER)
subprocess.on('close',() => subprocess = null)

其中 YOUR_EVENT_HANDLERany function suitable for the "data" event on a readable stream,我认为这意味着它接受单个字符串参数并且其返回值被忽略。

您的 Electron 应用程序的其余部分希望在内容到达时收到通知 - 或者,正确的内容 - 但您不希望您的 Electron 应用程序的其余部分必须了解有关子进程或可读流的任何信息。因此,您可能应该将所有这些都放入一个返回 EventEmitter 实例的函数中,然后 YOUR_EVENT_HANDLER 会在它看到它关心的内容时触发一个干净的事件,其余时间静默不做任何事情。>


注意:对于 Node 的 PATH 上的 shell 内置函数和命令,您可以只使用程序名称,但我遇到了 problems doing that in some contexts,因此我始终建议提供您要运行的命令的绝对路径。

(该链接还有一个示例,展示了如何将命令包装在等待命令终止的 Promise 中,然后使用所有 stdout 或 stderr 进行解析。)