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

时间:2015-03-15 22:08:01

标签: 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)

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

1 个答案:

答案 0 :(得分:22)

您可以将流程打包到Future(blocking(_)),如果超时后没有返回,则拨打process.destroy()

这就是我为我的小Processor library所做的事情,例如see here。您可以使用!方法,而不是使用run急切等待退出代码。以下是README的改编:

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()
}