我在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()
}
}
答案 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(): Int
和destroy(): Unit
的进程。 exitValue返回进程退出值(与'!'相同)并且为此需要阻塞(这意味着调用线程等待进程完成)。 destroy函数终止进程。
你现在可以这样做:
f.map{_ match {
case 0 => //status ok
case _ => //handling errors...
}}
如果你需要杀死它:
p.destroy()