Java Scala系统进程不';不要死后再死

Java Scala系统进程不';不要死后再死,java,scala,jvm,system-calls,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 B

我在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()
  }
}

该进程在单独的操作系统进程上运行。停止创建者进程(jvm)不会杀死子进程。
还使用“!”运行进程使调用线程等待响应。
如果您将调用“run”函数而不是“!”它将返回允许停止的进程

val p=Seq(“ffmpeg”、“-i”、”rtmp://200.136.27.12/live/tv“,”-t“,“-y”,“/tmp/x.wav”)。运行(命令输出)
val f=未来{p.exitValue}
run函数返回一个进程,该进程有两个函数:Int和
destroy():Unit
。exitValue返回进程退出值(与“!”相同),因此需要阻塞(这意味着调用线程等待进程完成)。destroy函数终止进程。 您现在可以执行以下操作:

f.map{uu}match{
案例0=>//状态正常
case=>//处理错误。。。
}}
如果你需要杀死它:

p.destroy()

在杀死父进程时有没有办法杀死子进程?@DanielCukier这与操作系统有关,所以我不这么认为。但是您可以使用jvm关闭钩子:
sys.addShutdownHook{println(“Bye hook!”);p.destroy()}
这将在jvm关闭时终止进程。