从Gradle运行后台作业

时间:2014-08-13 20:54:35

标签: gradle background-process

我创建了一个启动远程作业的任务,比如

task mytask(type: Exec) {
    commandLine 'ssh'
    args '-f -l me myserver ./start'.split(' ')
}

并且它有效,但似乎等待作业终止。但它永远不会终止,它不应该。

从命令行执行相同的操作:由于-f开关,ssh命令在后台执行。

我尝试将'>&' /dev/null(csh stdout和stderr redirect)添加到命令行,但没有任何成功。显而易见的&也没有做任何事情。我还将命令行解压缩到一个脚本中,它总是一样的:Gradle等待终止。

解决方案

我通过使用脚本并在脚本中重定向stdout和stderr来解决它。我的问题来自混淆重定向...通过传递'>&' /dev/null我重定向了远程计算机上的流,但是需要的是本地重定向(即,不将重定向运算符放在引号中)。

4 个答案:

答案 0 :(得分:5)

Exec任务总是等待终止。要运行后台作业,请使用Ant任务“Exec”

ant.exec(
  executable: 'ssh',
  spawn: true
) {
   arg '-f'
   arg '-l'
   arg 'me'
   arg 'myserver'
   arg './start'
}

答案 1 :(得分:4)

Exec任务总是等待终止。要运行后台作业,您需要编写自己的任务,例如,可以使用Java ProcessBuilder API。

答案 2 :(得分:3)

正如@ peter-niederwieser所说,ProcessBuilder可能是溶剂。 Tomas Lins ExecWait的某些内容可能适用于您的奖金。

简而言之,它会侦听一个选定的单词,并在任务命中时将任务标记为已完成。

从页面:

class ExecWait extends DefaultTask {
String command
String ready
String directory

@TaskAction
def spawnProcess() {

    ProcessBuilder builder = new ProcessBuilder(command.split(' '))
    builder.redirectErrorStream(true)
    builder.directory(new File(directory))
    Process process = builder.start()

    InputStream stdout = process.getInputStream()
    BufferedReader reader = new BufferedReader(new InputStreamReader(stdout))

    def line
    while ((line = reader.readLine()) != null) {
        println line
        if (line.contains(ready)) {
            println "$command is ready"
            break;
        }
    }
}

答案 3 :(得分:0)

Gradle spawn plugin可以在Gradle构建中启动后台进程,然后再次将其拆除。注意,这在Windows下不起作用,但是在Linux或MacOS X上看起来还不错。如果您发现它启动了后台进程,但是似乎没有检测到后台进程何时完成初始化,因此可以开始集成测试,您可以必须使用“ ready”参数配置任务,该参数是在启动的后台进程的输出中寻找的字符串,以确定何时可以安全进行。