Führen Sie einen hintergrund-job von Gradle
Habe ich einen task starten einer remote-job-wie
task mytask(type: Exec) {
commandLine 'ssh'
args '-f -l me myserver ./start'.split(' ')
}
und es funktioniert, allerdings scheint es, zu warten, für den job zu kündigen. Aber es ist nie beendet, und es sollte nicht sein.
Tun das gleiche von der Kommandozeile funktioniert: Weil der -f
schalten Sie die ssh
Befehl wird im hintergrund ausgeführt.
Habe ich versucht, um '>&' /dev/null
(csh stdout und stderr umleiten) auf der Kommandozeile, aber ohne Erfolg. Auch die offensichtliche &
nichts getan. Ich habe auch extrahiert der Befehl Zeile in einem Skript, und es ist immer das gleiche: Gradle wartet auf Beendigung.
Lösung
Ich habe es gelöst, indem Sie ein Skript und umleiten sowohl stdout und stderr in das Skript. Mein problem kam von verwirrenden Umleitungen... durch die übergabe '>&' /dev/null
ich umgeleitet streams auf dem remote-computer, aber was nötig war, war eine Weiterleitung auf die lokale (d.h., ohne die redirection-operator in Anführungszeichen).
Du musst angemeldet sein, um einen Kommentar abzugeben.
Den
Exec
Aufgabe wartet immer für die Kündigung. Zum ausführen eines hintergrund-Jobs, die Sie benötigen, zu schreiben, Ihre eigene Aufgabe, die, zum Beispiel, verwenden Sie die Java -ProcessBuilder
API.ssh -f
Befehl nicht kündigen (oder geht in den hintergrund oder was auch immer) sofort.-f
ist eine shell-ähnliche Funktion, die nicht funktioniert, wenn diessh
Prozess gestartet wird, die von Java. Das ist auch der Grund, warum>&
wird nicht funktionieren (keine shell hier mit einbezogen).Den Exec-task wartet immer für die Kündigung. Zum ausführen eines hintergrund-Jobs verwenden die Ant-task 'Exec'
Wie @peter-niederwieser schlägt vor,
ProcessBuilder
könnte die Lösung eignet sich auch. Etwas entlang der Linien von Tomas Lins ExecWait funktionieren könnte, um Ihre Gewinne.Kurz gesagt, es wartet auf ein Wort gewählt, und markiert die Aufgabe als erledigt, wenn es Sie trifft.
Aus der Seite:
Den Gradle spawn plugin können, starten Sie einen Hintergrundprozess, der in einen Gradle-build und danach Riss es wieder runter. NB dies funktioniert nicht unter Windows, scheint aber problemlos auf Linux oder Mac OS X. Wenn Sie finden, dass es startet den Prozess im hintergrund, aber scheint nicht zu erkennen, wenn der Prozess im hintergrund beendet die Initialisierung, so dass die integration der Test beginnen kann, müssen Sie konfigurieren Sie die task mit dem parameter "bereit", eine Zeichenfolge, sucht in der Ausgabe des gestarteten hintergrund-Prozesses, um zu bestimmen, Wann es sicher ist zu gehen.