问题描述
我正在编写一个电子应用程序,需要从命令行执行一个长时间运行的进程并实时监控输出,但我不知道如何实现这个目标。
基本上如果终端命令打印“找到我!”然后我希望应用程序像处理某种事件一样处理它。
到目前为止,我已经能够做到:
- 使用“spawn”从电子启动终端命令
- 使用“console.log”打印终端命令的输出
- 它似乎一直在异步打印 - 这出乎意料但很好。
app.example.com
谢谢
解决方法
您应该使用 child_process.spawn
来运行命令,您将监听来自 stdout
和 stderr
的信号,它们是可读流。当信号到达时,您的应用就应该采取行动。
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_HANDLER
是 any 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 进行解析。)