scala - 使用带有超时的 scala.sys.process

标签 scala processbuilder

我发现使用 standard syntax 非常酷喜欢

import scala.sys.process._
    val countLogger = ProcessLogger(line => {println ("out line: " + line)},
                                 line => {println ("err line: " + line)})

    val exitCode = ("cat prog.c" #&& "gcc prog.c -o prog -lm" 
            #&& "echo running, this may hang" #&& "prog.exe") ! countLogger

    println("exitCode = " + exitCode)

然而,最后一个进程挂起。是否有可能在超时时杀死它?

最佳答案

您可以将您的流程包装在 Future(blocking(_)) 中如果超时后它没有返回,请调用process.destroy() .

这就是我为我的小Processor library所做的,例如see here .而不是使用 !要急切地等待退出代码,您可以使用 run方法。这是自述文件的改编:

import scala.concurrent._
import ExecutionContext.Implicits.global
import scala.sys.process._

val p = "sleep 100".run()               // start asynchronously
val f = Future(blocking(p.exitValue())) // wrap in Future
val res = try {
  Await.result(f, duration.Duration(2, "sec"))
} catch {
  case _: TimeoutException => 
    println("TIMEOUT!")
    p.destroy()
    p.exitValue()
}

关于scala - 使用带有超时的 scala.sys.process,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29066754/

相关文章:

java.library.path 未从 runtime.exec/ProcessBuilder 正确设置

java - 如何从 Java 中的相对路径运行可执行文件

Scala 编译器无法正确推断类型

java - ProcessBuilder 和带空格的命令

java - 能够从主方法触发器下载文件,但不能通过 wget 从 Java 中的 Rest Service 后面下载文件

scala - 在 Anorm 2.4 中使用 Parser API 和可空列

java - 通过 ProcessBuilder 创建 postgresql 的备份

scala - 全局禁用 sbt supershell

templates - playframework : i18n + scala

scala - 使用 Scala Guice 将特征绑定(bind)到对象