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
当 运行 Scala
在 Java 9
上时,我们可以利用 Java
的 ProcessHandle 这使得更容易识别和使用原生进程:
ProcessHandle.of(5210) match { case p => p.isPresent && p.get.isAlive }
其中 5210 是您有兴趣获取其状态的进程的 pid。
这个:
首先从给定的 pid
.
创建一个 Java Optional<ProcessHandle>
如果进程存在,这个Optional
必须是present
(这可能足以判断进程是否存活,具体取决于系统)。
最后使用 ProcessHandle::isAlive
.
检查进程是否存活
不需要导入,因为 ProcessHandle
是 java.lang
的一部分。
我需要检查指定进程当前是否正在 运行 使用 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
当 运行 Scala
在 Java 9
上时,我们可以利用 Java
的 ProcessHandle 这使得更容易识别和使用原生进程:
ProcessHandle.of(5210) match { case p => p.isPresent && p.get.isAlive }
其中 5210 是您有兴趣获取其状态的进程的 pid。
这个:
首先从给定的
pid
. 创建一个 Java 如果进程存在,这个
Optional
必须是present
(这可能足以判断进程是否存活,具体取决于系统)。最后使用
ProcessHandle::isAlive
. 检查进程是否存活
Optional<ProcessHandle>
不需要导入,因为 ProcessHandle
是 java.lang
的一部分。