我刚刚看了一下新的scala.sys和scala.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;Take-Command:
IFF %@Connect[localhost 5554] lt 0 THEN
ECHO [TCC] Start emulator
DETACH emulator -avd Nexus-One -no-boot-anim
ENDIFF在这两种情况下,仿真器都会启动并继续运行,即使在脚本结束之后也是如此。当然,必须编写两次脚本是一种浪费。因此,我现在研究Scala,以便在不使用cygwin或xml语法的情况下进行统一的进程处理。
发布于 2011-05-16 14:43:39
第一次导入:
import scala.sys.process.Process然后创建一个ProcessBuilder
val pb = Process("""ipconfig.exe""")那么你有两个选择:
val exitCode =pb。!
Process实例val p= pb.run
然后,您可以使用以下命令从进程中获取退出代码(如果进程仍在运行,它将一直阻塞,直到退出)
val exitCode = p.exitValue
如果想要处理流程的输入和输出,可以使用ProcessIO
import scala.sys.process.ProcessIO
val pio = new ProcessIO(_ => (),
stdout => scala.io.Source.fromInputStream(stdout)
.getLines.foreach(println),
_ => ())
pb.run(pio)发布于 2011-05-16 14:38:22
考虑到您必须显式地等待它退出,并且您需要使用线程来看管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)
}发布于 2011-05-16 14:49:10
已从SBT导入进程。下面是关于如何使用SBT中出现的流程库的详细指南。
https://stackoverflow.com/questions/6013415
复制相似问题