PureScript中如何等待子进程退出?
如何等待Node.js子进程退出后读取stdout?
在使用Node.ChildProcess模块执行命令时,若直接在写入stdin后读取stdout,可能因子进程尚未完成输出导致读取不到内容。以cat命令为例,原代码中Stream.readString仅尝试读取一次数据块,此时cat还未将内容写入stdout,因此返回"nothing"。
解决方案:读取完整的stdout流
Stream.readAllString会等待stdout流结束(子进程关闭输出流时触发),并返回所有输出内容,替代单次读取的Stream.readString即可解决问题。修改后的代码如下:
module Main where import Prelude import Effect (Effect) import Effect.Console (log) import Node.ChildProcess as Proc import Node.Encoding (Encoding(UTF8)) import Node.Stream as Stream main :: Effect Unit main = do child <- Proc.spawn "cat" [] let stdin' = Proc.stdin child _ <- Stream.writeString stdin' UTF8 "hello" _ <- Stream.end stdin' -- 等待stdout流结束并读取全部内容 output <- Stream.readAllString (Proc.stdout child) UTF8 log output
显式等待子进程退出(可选)
若需要明确等待子进程退出事件后再读取输出,可结合Proc.onExit与异步操作实现:
module Main where import Prelude import Effect (Effect) import Effect.Async (async, await) import Effect.Console (log) import Node.ChildProcess as Proc import Node.Encoding (Encoding(UTF8)) import Node.Stream as Stream main :: Effect Unit main = do child <- Proc.spawn "cat" [] let stdin' = Proc.stdin child _ <- Stream.writeString stdin' UTF8 "hello" _ <- Stream.end stdin' -- 等待子进程退出 _ <- async \resolve -> Proc.onExit child \_ -> resolve unit -- 读取全部stdout内容 output <- Stream.readAllString (Proc.stdout child) UTF8 log output
说明
Stream.readString仅读取当前可用的单个数据块,无法保证获取子进程的全部输出;Stream.readAllString会持续读取直到流结束,确保拿到完整结果。- 子进程退出时会自动关闭stdout流,因此
readAllString会在进程完成输出后返回数据。
内容的提问来源于stack exchange,提问作者Hi-Angel
相关产品推荐
相关产品推荐

