【问题标题】:How to gracefully terminate a process created from scala如何优雅地终止从 scala 创建的进程
【发布时间】:2012-05-28 01:41:14
【问题描述】:

我目前正在使用 scala 进程 API scala.sys.process但是,我似乎无法弄清楚如何优雅地 终止对 SIGTERM 信号作出反应的进程。我以前在 python 中做过,在进程中有漂亮的terminatesend_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


【解决方案1】:

Scala Process 的东西基于 Java,因此受到同样的限制。 Java 提供了一个非常糟糕的接口。也许它可以在更多系统上使用相同的界面,但它对于那些在 Posix 系统上工作的人来说是难以置信的限制。

【讨论】:

  • 谢谢,我的用例似乎需要依赖平台的代码。
猜你喜欢
  • 2011-01-04
  • 2019-08-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-06-07
  • 1970-01-01
  • 2016-05-31
  • 1970-01-01
相关资源
最近更新 更多