2016-04-18 12 views
0

Ich arbeite an einem Stück, wo ich eine Anwendung starten muss und diese Anwendung sollte im Hintergrund laufen. Ich habe versucht, Startprozess Cmdlets wie folgt:Powershell Start-Prozess startet nicht den Prozess auf Remote-Maschine

try { 
    Invoke-Command -Session $newsession -Scriptblock { 
     Write-Host "Cd'ing and starting Vesper on" $loadvm 
     Start-Process cmd -ArgumentList "/c C:\vesper_cpt\Vesper.exe -auto" -verb runas 
    } -ErrorAction Stop 
} catch [Exception] { 
    echo "Error while running the remote command", $_.Exception.GetType().FullName, $_.Exception.Message 
    Remove-PSSession $newsession 
    exit 1 
} 

Remove-PSSession $ NewSession

Was passiert ist, dass ich sehen kann, dass es einen cmd Prozess auf dem Zielcomputer startet, aber dann sofort, es geht weg. Ich bin mir nicht sicher, was ich hier tun soll, um diesen Prozess immer in Gang zu halten. Auf der anderen Seite versuchte ich auch Invoke-Expression Cmdlet und damit kann ich sehen, der Prozess hat gut auf dem Remote-Rechner gestartet, aber das Powershell-Skript kehrt nie zurück und deshalb Start-Prozess gedacht. Irgendwelche Vorschläge?

+0

„Ich bin nicht sicher, was soll ich hier tun, diesen Prozess zu haben und läuft immer“ - ehh, installieren Sie es als Service sagte am entfernten Rechner? Wenn Sie Fehler beheben möchten, hängen Sie '*> C: \ output.log' an die Argument-Zeichenfolge an und überprüfen Sie die Protokolldatei auf dem Remote-Computer –

+0

" C: \ vesper_cpt \ Vesper.exe "- Ist diese Datei auf dem lokalen oder Remote-Computer ? Sie können keine lokale ausführbare Datei auf dem Remote-Computer ausführen. – cezarypiatek

+0

Ja, C: \ vesper_cpt \ Vesper.exe ist eine Datei auf dem Remote-Computer. Bitte beachten Sie, dass der obige Code nicht das vollständige Skript ist. Es erstellt zuerst eine Sitzung mit dem Remote-Computer und startet dann die Vesper.exe-Ausführung. Also, ich starte die Anwendung Vesper auf Remote-Maschine mit Powershell – rapport89

Antwort

1

Nachdem ich so viele Dinge wie Invoke-Expression, Start-Process versucht habe, habe ich den Grund dafür gefunden, warum mein Prozess kurz nach dem Start auf Remote-Maschine beendet wurde. Der Grund dafür ist, dass die Anwendung, die ich verwende, eine Java-Anwendung ist. Und JVM erlaubt einem Daemon-Thread nicht, den Prozess auf dem Computer auszuführen. Wenn mindestens ein Benutzer-Thread aktiv ist, wird die Anwendung durch die Java-Laufzeitumgebung nicht beendet.

In meinem Setup, ich bin die Anwendung auf dem Remote-Computer ausgeführt wird (in diesem Fall Vesper.exe), so war ich eine New-PSSession und dann am Ende zu schaffen, war ich Entfernen-PSSession. Aus diesem Grund war kein Benutzer-Thread mehr vorhanden, um die Anwendung auszuführen, weshalb die Anwendung geschlossen wurde.

Die Lösung hierfür ist statt Entfernen-PSSession Sie Ausfahrt-PSSession tun werden. Exit-PSSession, hält den Thread am Leben und Ihre Anwendung wird nicht beendet. Achten Sie auf das Gesicht, dass Sie selbst dafür verantwortlich sind, wie Sie die Anwendung beenden, denn auch wenn Ihr Programm beendet ist, läuft die Anwendung immer noch auf dem Remote-Computer.

try { 
    Invoke-Command -Session $newsession -Scriptblock { 
     Write-Host "Cd'ing and starting Vesper on" $loadvm 
     Start-Process cmd -ArgumentList "/c C:\vesper_cpt\Vesper.exe -auto" -verb runas 
    } -ErrorAction Stop 
} catch [Exception] { 
    echo "Error while running the remote command", $_.Exception.GetType().FullName, $_.Exception.Message 
    Remove-PSSession $newsession 
    exit 1 
} 

Exit-PSSession 

Dies ist, was Sie tun möchten, wenn Ausnahme gefangen werden. Sie können die Sitzung gemäß Ihrer Umgebung entfernen oder beenden.

fand ich die Antworten aus folgenden zwei Fragen:

Hoffnung, das hilft.

Dank