【问题标题】:Scala check if external process id (pid) is currently running?Scala检查外部进程ID(pid)当前是否正在运行?
【发布时间】:2016-01-11 11:46:56
【问题描述】:

我需要检查指定的进程当前是否正在使用 Scala 运行。

我只有 PID。

Scala 有内部函数还是我需要使用ps 解析它?

谢谢。

【问题讨论】:

  • 或检查 /proc/{pid} serverfault.com/questions/366474/… 的存在(不确定 scala 但应该是通过常规 file.exists api 的 1 班轮)
  • @zapl 谢谢。此解决方案与解析ps 命令相比如何?
  • @zapl 注意,检查/proc/{pid} 将是严格的 linux 解决方案(例如,它不适用于 osx)
  • @DannyBit 我猜这更容易。但我不知道您最终是否会得到适用于更多系统的代码。 ps 在某些系统上可能不可用或有奇怪的语法(=解析失败?),但在某些 *nix/bsd/odd 事情上,/proc/{pid} 可能会发生同样的事情。我唯一确定的是它可以在我的机器上运行。

标签: java bash scala process pid


【解决方案1】:

您可以导入sys.process._

一般示例

import sys.process._
scala> import sys.process._
import sys.process._

scala> "ps" !

PID TTY           TIME CMD
570 ttys000    0:00.02 -bash
591 ttys000    0:00.01 bash /usr/local/bin/scala

获取进程scala的PID

// !! to get result as String
scala> "\\d+".r.findFirstIn( "ps" #| "grep /usr/local/bin/scala" !! )
res9: Option[String] = Some(591)

欲了解更多信息,请参阅:http://www.scala-lang.org/api/current/index.html#scala.sys.process.package

【讨论】:

    【解决方案2】:

    Java 9 上运行Scala 时,我们可以利用JavaProcessHandle,这使得识别和使用本机进程变得更加容易:

    ProcessHandle.of(5210) match { case p => p.isPresent && p.get.isAlive }
    

    其中 5210 是您有兴趣获取其状态的进程的 pid。

    这个:

    • 首先从给定的pid 创建一个Java Optional<ProcessHandle>

    • 如果进程存在,则此Optional 必须是present(这可能足以判断进程是否处于活动状态,具体取决于系统)。

    • 最后使用ProcessHandle::isAlive检查进程是否处于活动状态。

    无需导入,因为 ProcessHandlejava.lang 的一部分。

    【讨论】:

      【解决方案3】:

      AFAIK、Java 或 Scala 没有这样的功能。如果你在基于 UNIX 的机器上,是的,你最好的选择是使用ps 命令。

      您可以将 PID 与ps 命令一起使用,如下所示:

      ps -p 8238 -o "pid="
      

      这里的PID是8283,我们让ps去搜索,如果存在就打印出来。

      scala> import sys.process._
      import sys.process._
      
      scala> def processExists(pid: Int) = pid == {try { (List("ps", "-p", s"$pid", "-o", "pid=") !!).trim.toInt } catch { case _: Throwable => -1 }}
      warning: there was one feature warning; re-run with -feature for details
      processExists: (pid: Int)Boolean
      
      scala> val pid = 8238
      pid: Int = 8238
      
      scala> processExists(pid)
      res11: Boolean = true
      
      scala> processExists(1234)
      res12: Boolean = false
      

      【讨论】:

      • 是的,我在 Unix 机器上。在 Scala 中解析 ps 的最简洁方法是什么?
      • def processExists(pid: Int)检查更新的答案
      猜你喜欢
      • 2014-03-06
      • 2011-06-30
      • 2011-03-03
      • 2011-02-01
      • 1970-01-01
      • 1970-01-01
      • 2011-06-06
      • 1970-01-01
      相关资源
      最近更新 更多