scala进程死亡时杀死sys.process?

时间:2014-07-25 21:04:02

标签: scala process

我有一个在scala程序中启动的长时间运行的外部进程,我想让scala进程终止(或被杀死)时进程死掉。实现这一目标的最简单方法是什么?

供参考,以下是一些代码(请注意avahi-publish即使在ps aux | grep [a]vahi终止后仍然可以执行Main,但object Main extends App { Executors.newSingleThreadScheduledExecutor.submit( new Runnable { override def run(): Unit = { while (true) { println("starting avahi publish") Try { val cmd = "avahi-publish-service 'aname' '_foobar._tcp' 1234" Seq("sh", "-c", cmd).! } match { case Success(r) => println(s"avahi publish terminated: $r") case Failure(e) => println(s"avahi publish error: $e") } } } }) // etc etc } 仍会执行。

{{1}}

1 个答案:

答案 0 :(得分:3)

我不确定是否有保证可以按照你的要求行事,但你可以接近。在Scala(和Java)中,您可以告诉VM在它退出所谓的关闭钩子之前为您运行一段代码。通过定义一个钩子,你可以让它在VM退出之前试图杀死你的进程。

请注意,在sys.addShutdownHook的Scaladoc中,有一个警告:Note that shutdown hooks are NOT guaranteed to be run.

如果改变构造Process的方式,你可以获得对后台运行的任务的引用并在钩子中使用它,如下所示(我只是使用一个简单的sleep命令) :

import scala.sys.process.Process

object AppShutdown extends App {
  println("Starting application")
  val proc = Process(Seq("sleep", "50000"))
  val bgProc = proc.run
  sys addShutdownHook {
     println("Caught shutdown, killing process")
     bgProc.destroy
     println(s"Process finished in shutdown hook with code $ev")
  }
  val ev = bgProc.exitValue
  println(s"Process finished naturally with code $ev")

}

我希望有所帮助!