Java Scala系统进程不';不要死后再死
我在Scala中有一个应用程序,它对ffmpeg进行系统调用。有时ffmpeg永远挂起。 我正在Mac OS X Eclipse中运行此应用程序。当我在ffmpeg命令运行时终止java应用程序时,ffmpeg进程不会终止。为什么?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
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关闭时终止进程。