Scala 2.9的“scala.sys.process”是如何工作的?

我只是看看新的scala.sysscala.sys.process包,看看这里是否有帮助。 但是,我完全失去了。

有没有人有如何真正开始一个过程的例子?

而且,这对我来说最有趣:你可以分离进程吗?

当父进程结束时,分离的进程将继续运行,并且是Ant的弱点之一。

更新:

似乎有一些混乱是什么分离。 从我目前的项目中获得一个真实的实例。 一次使用z-Shell,一次使用TakeCommand:

Z-shell:

 if ! ztcp localhost 5554; then echo "[ZSH] Start emulator" emulator \ -avd Nexus-One \ -no-boot-anim \ 1>~/Library/Logs/${PROJECT_NAME}-${0:t:r}.out \ 2>~/Library/Logs/${PROJECT_NAME}-${0:t:r}.err & disown else ztcp -c "${REPLY}" fi; 

接收指令:

 IFF %@Connect[localhost 5554] lt 0 THEN ECHO [TCC] Start emulator DETACH emulator -avd Nexus-One -no-boot-anim ENDIFF 

在这两种情况下,它是火,忘了,模拟器启动,并将继续运行,即使脚本已经结束。 当然不得不两次写脚本是一件浪费。 所以我现在看着Scala进行统一的stream程处理,没有cygwin或xml语法。

首先import:

 import scala.sys.process.Process 

然后创build一个ProcessBuilder

 val pb = Process("""ipconfig.exe""") 

那么你有两个select:

  1. 运行并阻塞,直到进程退出

     val exitCode = pb.! 
  2. 在后台运行进程(分离)并获得一个Process实例

     val p = pb.run 

    然后你可以从进程中得到exitcode(如果进程仍在运行,它会阻塞直到它退出)

     val exitCode = p.exitValue 

如果你想处理input和输出的过程,你可以使用ProcessIO

 import scala.sys.process.ProcessIO val pio = new ProcessIO(_ => (), stdout => scala.io.Source.fromInputStream(stdout) .getLines.foreach(println), _ => ()) pb.run(pio) 

我很确定分离的进程工作得很好,考虑到你必须明确地等待它退出,你需要使用线程来照顾stdout和stderr。 这是非常基本的,但这是我一直在使用:

 /** Run a command, collecting the stdout, stderr and exit status */ def run(in: String): (List[String], List[String], Int) = { val qb = Process(in) var out = List[String]() var err = List[String]() val exit = qb ! ProcessLogger((s) => out ::= s, (s) => err ::= s) (out.reverse, err.reverse, exit) } 

工艺是从SBTimport的。 以下是关于如何使用SBT中显示的过程库的详细指南。

https://github.com/harrah/xsbt/wiki/Process

有没有人有如何真正开始一个过程的例子?

 import sys.process._ // Package object with implicits! "ls"! 

而且,这对我来说最有趣:你可以分离进程吗?

 "/path/to/script.sh".run() 

你要做的大部分事情都是和sys.process.ProcessBuilder相关的。 了解这一点。

有一些sys.process使得使用更sys.process ,并且它们可以通过包对象sys.process 。 导入其内容,如示例中所示。 另外,看看它的scaladoc。

如果有以下文件,以下function将允许使用:

 def #<<< (command: String) (hereDoc: String) = { val process = Process (command) val io = new ProcessIO ( in => {in.write (hereDoc getBytes "UTF-8"); in.close}, out => {scala.io.Source.fromInputStream(out).getLines.foreach(println)}, err => {scala.io.Source.fromInputStream(err).getLines.foreach(println)}) process run io } 

可悲的是,我没能(没有时间)把它作为中缀操作。 build议的呼叫约定是:

 #<<< ("command") {""" Here Document data """} 

如果有人能够给我一个关于如何使它像一个更像呼叫的shell的提示,

 "command" #<<< """ Here Document data """ ! 

logging过程稍好一些,大概是两个月的时间。 你可以从我从来没有得到的事实推断我的名单。 不像大多数事情我不这样做,这是我说我会做的事情,所以我很遗憾,它仍然是无证的,因为它到达时。 剑,准备好自己! 我落在你身上!

如果我理解了这个对话框,那么原始问题的一个方面还没有得到答案:

  1. 如何“分离”产生的进程,以便继续独立于父Scala脚本运行

主要的困难是参与产生进程的所有类必须在JVM上运行,并且当JVM退出时它们不可避免地被终止。 但是,一个解决方法是通过利用shell来代表您“脱离”来间接实现目标。 下面这个启动gvim编辑器的scala脚本看起来可以正常工作:

 val cmd = List(
    “斯卡拉”
    “-e”
    “”“import scala.sys.process._;”gvim“.run; System.exit(0);”“”
 )
 val proc = cmd.run

它假定scala在PATH中,并且(不可避免地)保留了JVM父进程的运行。