代码之家  ›  专栏  ›  技术社区  ›  Val

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

  •  15
  • Val  · 技术社区  · 9 年前

    我觉得用起来很酷 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 回复  |  直到 9 年前
        1
  •  24
  •   0__    9 年前

    您可以用 Future(blocking(_)) 如果超时后没有返回,您可以调用 process.destroy() .

    这就是我为我的孩子所做的 Processor library ,例如。 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()
    }