Scala 检查外部进程 ID (pid) 当前是否为 运行?

Scala check if external process id (pid) is currently running?

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

我只有 PID。

Scala 是否有内部函数,或者我是否需要使用 ps 来解析它?

谢谢。

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

您可以通过ps命令使用PID,如下所示:

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

您可以导入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

当 运行 ScalaJava 9 上时,我们可以利用 JavaProcessHandle 这使得更容易识别和使用原生进程:

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

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

这个:

  • 首先从给定的 pid.

  • 创建一个 Java Optional<ProcessHandle>
  • 如果进程存在,这个Optional必须是present(这可能足以判断进程是否存活,具体取决于系统)。

  • 最后使用 ProcessHandle::isAlive.

  • 检查进程是否存活

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