如何在Scala中使用PTY生成进程?

4

在 Ruby 中我有:

PTY.spawn("/usr/bin/lxc-monitor -n .+") do |i, o, pid|
  # ...
end

在Scala/Java中如何实现这个功能?
2个回答

3

尝试使用JPtypty4j。这些是使用JNA实现的Java pty。


2

我认为PTY并没有被移植到Java/Scala。您可以使用Java内置的Runtime。

  def run() {
    val rt = Runtime.getRuntime
    val cmds = Array("/usr/bin/lxc-monitor", "-n .+")
    val env = Array("TERM=VT100")
    val p1 = rt.exec(cmds, env)
  }

我用这个页面作为Scala版本的基础。
更新:
要获得输出,您需要获取输入流并读取它(我知道这听起来有些反常,但它是相对于JVM的输入)。下面的示例使用Apache Commons跳过Java的一些冗长部分。
import java.io.StringWriter
import org.apache.commons.io.IOUtils

class runner {

  def run() {
    val rt = Runtime.getRuntime
    val cmds = Array("/usr/bin/lxc-monitor", "-n .+")
    val env = Array("TERM=VT100")
    val p1 = rt.exec(cmds, env)
    val inputStream = p1.getInputStream

    val writer = new StringWriter()
    IOUtils.copy(inputStream, writer, "UTF-8")
    val output = writer.toString()
    println(output)
  }

}

我从这里得到了有关Apache Utils的想法。


1
Java标准库中确实没有PTY支持 -- 如果你真的需要一个(而不仅仅是运行进程并通过流连接其stdin和stdout,这可以使用Java Process对象),那么你需要通过本地代码来实现。screenterm项目在https://github.com/now/screenterm中的terminator.terminal.pty包中支持此功能。 - RM.
关于连接标准输入和输出的观点很好。与PTY相比,Java版本有点繁琐/冗长。 - Noah
当我尝试获取命令输出时,结果为空。在Ruby或Python中,它可以完美地工作。 - Timothy Klim
1
lxc-monitor 需要一个 tty,但是 Java 没有这个。你可以使用 expect 进行一些黑客技巧,或者只需使用 lxc-info 和相关工具即可。 - J-16 SDiZ

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接