2014-07-25 6 views
0

나는 스칼라 프로그램 내에서 시작되는 장기 실행 외부 프로세스를 가지고 있으며 스칼라 프로세스가 종료되거나 죽을 때 프로세스를 종료하려고합니다. 이것을 달성하는 가장 간단한 방법은 무엇입니까?scala 프로세스가 종료 될 때 sys.process를 종료 하시겠습니까?

참고로

는 여기에 몇 가지 코드 (ps aux | grep [a]vahiMain 후 종료를 실행하여 볼 때 avahi-publish 여전히 실행되므로주의)이다 :

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 
} 
+0

java에서 비슷한 질문을 보려면 https://stackoverflow.com/questions/269494/how-can-i-cause-a-child-process-to-exit-when-the-parent-does를 참조하십시오. 동일한 대답이 여기에 적용되어야합니다. – gourlaysama

답변

2

나는 당신이 무엇을 할 수있는 보장 방법이 확실하지 않다 묻지 만 가까이 올 수 있습니다. 스칼라 (및 자바)에서는 종료 훅 (Shutdown Hook)에서 종료하기 전에 코드 블록을 실행하도록 VM에 지시 할 수 있습니다. 후크를 정의하면 VM이 종료되기 전에 프로세스를 중지 시키려고 할 수 있습니다.

sys.addShutdownHook의 Scaladoc에는 경고 : Note that shutdown hooks are NOT guaranteed to be run.이 있습니다.

당신이 당신의 프로세스를 구성하는 방법을 변경하는 경우 (난 그냥 간단한 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") 

} 

도움이 되었기를 바랍니다.

관련 문제