gpt4 book ai didi

scala - 处理执行产生无限输出的 Unix 命令

转载 作者:行者123 更新时间:2023-12-04 19:06:51 25 4
gpt4 key购买 nike

一些 unix 命令,例如 tail -f或启动 python web 服务器(即cherrypy)将产生无穷无尽的输出,即停止它的唯一方法是Ctrl-C .我正在开发一个执行类似命令的scala应用程序,我的实现是:

import scala.sys.process._
def exe(command: String): Unit = {
command !
}

但是,由于该命令产生了一个无穷无尽的输出流,因此应用程序会卡在那里,直到我终止它或终止该命令启动的进程。我还尝试在命令末尾添加 & 以便在后台运行它,但我的应用程序仍然挂起。

因此,我正在寻找另一种在不挂起应用程序的情况下执行命令的方法。

最佳答案

您可以使用自定义 ProcessLogger处理输出,但你希望它一可用。

val proc = 
Process(command).run(ProcessLogger(line => (), err => println("Uh-oh: "+err)))

您可以使用 destroy 终止进程方法。
proc.destroy

如果您在杀死它之前等待获得某个输出,您可以创建自定义 ProcessLogger可以调用 destroy一旦它拥有了它需要的东西,它就可以在它自己的过程中。

您可能更喜欢使用 lines (在 2.10 中;名称在 2.11 中更改为 lineStream)而不是 run收集标准输出,因为这会给你一个流,当没有新的输出可用时会阻塞。然后你把整个东西包在 Future ,从流中读取行直到你有你需要的,然后终止进程——这简化了阻塞/等待。

关于scala - 处理执行产生无限输出的 Unix 命令,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22408112/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com