Подтвердить что ты не робот

Использование scala.sys.process с таймаутом

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

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)

Однако бывает, что последний процесс зависает. Можно ли убить его в тайм-аут?

4b9b3361

Ответ 1

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

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