【发布时间】:2012-05-28 01:41:14
【问题描述】:
我目前正在使用 scala 进程 API scala.sys.process但是,我似乎无法弄清楚如何优雅地 终止对 SIGTERM 信号作出反应的进程。我以前在 python 中做过,在进程中有漂亮的terminate 和send_signal 函数,但在scala scala.sys.process.Process 对象上,我看到的只是destroy。对我来说,看起来 scala 会从轨道上摧毁我的进程,这是肯定的,这不是我想要的。
我如何告诉这个进程它应该清理自己并退出我的 scala 代码?
val launcher = Process("myprocess", Seq("args"))
val process = launcher.run()
process.destroy() //Err... no? terminate or equivalent like in python please?
编辑
更多细节:我的 scala 进程正在启动一个 C++ 子进程,它监听信号处理程序(SIGTERM、SIGKILL 等)以了解何时退出。它已经过很好的测试,并且可以正确清洁自己。我的问题是我不知道如何从我的 scala 应用程序发送该信号!因此,我的 C++ 进程总是被拖到外面并被枪杀,而不是被要求停止。
【问题讨论】:
-
你确定
.destroy()会导致 SIGKILL 吗?对于我的外部进程,它似乎会导致 SIGTERM -
好吧,destroy 的 javadocs(scala 所基于)说:“杀死子进程。这个 Process 对象表示的子进程被强制终止”(强调我的)我知道的其他语言有两种方法:杀死和终止(或指定信号的能力)。但也许在内部,在某些平台上,Java 使用 SIGTERM。没有办法确定:(
-
在 Linux 上,我的进程肯定会收到 SIGTERM(刚刚检查过)。事实上,我找不到直接从 Scala/Java 发送 SIGKILL 的方法,我必须打开另一个子进程并杀死 -9 :-( 这得到了stackoverflow.com/questions/10630303/… 的证实@
-
这种语言虽然令人困惑。并非所有平台都有优雅与非优雅的外部进程终止,所以也许他们只是希望您在使用 destroy 方法时做好最坏的准备
-
确实如此。我认为在 Windows 上终止相当于 sigkill (当我最初写这个问题时,我正在做多平台代码)。谢天谢地,there is an API update scheduled for Java 9。也许在两年内,如果幸运的话,我们将能够知道如何正确关闭 Java/scala 中的进程:P
标签: scala