我创建了一个启动远程作业的任务,比如
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
我重定向了远程计算机上的流,但是需要的是本地重定向(即,不将重定向运算符放在引号中)。
答案 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”参数配置任务,该参数是在启动的后台进程的输出中寻找的字符串,以确定何时可以安全进行。