В Scala.sys.процесс с таймаутом


Я нахожу чрезвычайно крутым использовать стандартный синтаксис как

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 13

1 ответ:

Вы можете обернуть свой процесс в Future(blocking(_)), и если он не возвращается после тайм-аута, вы вызываете process.destroy().

Вот что я сделал для моей небольшой процессорной библиотеки, например смотрите здесь. Вместо того, чтобы использовать ! для нетерпеливого ожидания кода выхода, вы используете метод 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()
}