gradle - 从Gradle运行后台作业

  显示原文与译文双语对照的内容
127 5

我已经创建了一个任务,启动远程作业

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

但是它很有用,它似乎等待作业终止。但它永远不会终止而且不应该。

在 命令行 工作中执行相同操作:由于 -f switch,ssh 命令在后台执行。

我试图将 '>&'/dev/null ( csh stdout和stderr重定向) 添加到 命令行 中,但没有成功。显然 & 没有做什么。我还将 命令行 提取到一个脚本中,它总是相同的:Gradle等待终止。

解决方案

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

时间:原作者:0个回答

106 0

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

原作者:
125 2

就像 @peter-niederwieser 所暗示的,ProcessBuilder 可能是 sollution 。Tomas的ExecWait winnings winnings 。

简而言之,它监听一个选中的单词,并在它点击时标记任务。

从页面中:

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;
 }
 }
}
原作者:
147 0

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

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