使用 scala.sys.process 超时
Using scala.sys.process with timeout
我觉得像
一样使用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(_))
中,如果在超时后它没有 return,则调用 process.destroy()
。
这就是我为我的小 Processor library, e.g. 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()
}
我觉得像
一样使用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(_))
中,如果在超时后它没有 return,则调用 process.destroy()
。
这就是我为我的小 Processor library, e.g. 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()
}