应用程序死亡后,Scala系统进程不会死亡

时间:2014-09-13 23:12:36

标签: java scala jvm system-calls

我在Scala中有一个应用程序,它对ffmpeg进行系统调用。有时ffmpeg会永远挂起。 我在Mac OS X Eclipse中运行此应用程序。当我在ffmpeg命令运行时终止java应用程序时,ffmpeg进程不会被杀死。为什么?

import scala.sys.process.ProcessLogger
import scala.sys.process.stringSeqToProcess
import scala.sys.process.stringToProcess

object BugStreaming {
  def callFfmpeg(): (Int, String, String) = {
    val err = new StringBuilder
    val out = new StringBuilder

    val commandOutputs = ProcessLogger(
      (o: String) => out.append(o + "\n"),
      (e: String) => err.append(e + "\n"))

    println(s"ffmpeg saving...")

    val status = Seq("ffmpeg", "-i", "rtmp://200.136.27.12/live/tv", "-t", "5", "-y", "/tmp/x.wav") ! commandOutputs

    (status, out.toString, err.toString)
  }

  def main(args: Array[String]) {
    val (s, out, err) = callFfmpeg()
  }
}

1 个答案:

答案 0 :(得分:0)

该过程在单独的OS进程上运行。停止创建者进程(jvm)不会杀死孩子 同时使用'!'运行流程让调用者线程等待响应。
如果您打电话给'运行'功能而不是'!'它将返回允许停止的过程。

val p = Seq("ffmpeg", "-i", "rtmp://200.136.27.12/live/tv", "-t", "5", "-y", "/tmp/x.wav").run(commandOutputs)
val f = Future { p.exitValue }

run函数返回一个包含两个函数exitValue(): Intdestroy(): Unit的进程。 exitValue返回进程退出值(与'!'相同)并且为此需要阻塞(这意味着调用线程等待进程完成)。 destroy函数终止进程。 你现在可以这样做:

f.map{_ match {
  case 0 => //status ok
  case _ => //handling errors...
}}

如果你需要杀死它:

p.destroy()