В 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 ответ:
Вы можете обернуть свой процесс в
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() }