我有一个在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}}
答案 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")
}
我希望有所帮助!