Der Prozess wird nach der SSH-Abmeldung auf dem Windows-Server beendet

Der Prozess wird nach der SSH-Abmeldung auf dem Windows-Server beendet

Ich habe einWindows Server 2016Maschine, die eine Datei ausführen muss, die die CLI verwendet, remotemit SSH.

Es ist bekannt, dass das Abmelden von einer SSH-Verbindung Prozesse beendet, die vom SSH-Benutzer gestartet wurden. Auf Linux-Rechnern kann man Lösungen wie nohupoder verwenden screen, wodurch ein Prozess beim Abmelden nicht beendet wird.

Solche Lösungen funktionieren allerdings nicht auf Windows-Rechnern und ich suche nach einer Möglichkeit, zu verhindern, dass ein Prozess beendet wird, wenn man sich abmeldet.

  • Mein Kunde ist einUbuntu-Maschine
  • Mein Windows Server 2016 läuftOffene SHH, mitPower Shellals Standard-Shell
  • Mein Programm ist so eingestellt, dass es im Daemon-Modus arbeitet und keine cmd- oder Powershell-Fenster geöffnet bleiben
  • Mit Get-Process -Name proc_namewird angezeigt, dass der Prozess tatsächlich ausgeführt wird
  • Die Verwendung Get-Processnach dem SSH-Logout führt zu keinem solchen Prozess

Dinge, die ich auch versucht habe:

  • Ausführen der .exeDatei mit cmd.
  • Ausführen von a .batund .psDateien, die mit ihren Argumenten beginnen .exe.

Gibt es eine Möglichkeit, dieses Problem auf einem Windows-Computer zu beheben?

Antwort1

Nachdem ich lange nach Lösungen gesucht hatte, fand ich mit PowerShell die absolut richtige Vorgehensweise.

Es scheint sich um eines jener Cmdlets zu handeln, die online am wenigsten verwendet oder dokumentiert werden, und es ist fast unmöglich, es mithilfe der MSDN-Dokumentation selbst herauszufinden, es sei denn, Sie sind bereits sehr vertraut mit der riesigen Welt von Wmi Objects.

Zusamenfassend:

Angenommen, ich habe ein Programm , das im Hintergrund mit den Argumenten , und foo.exeausgeführt werden muss , sollte ich den genauen Befehl verwenden:-a-bbar

Invoke-WmiMethod -Path 'Win32_Process' -Name Create -ArgumentList 'C:\Users\foo\Desktop\foo.exe -a -b bar'

Wenn es sich bei Ihrer EXE um eine „bekannte“ EXE handelt (entweder standardmäßig, z. B. Notepad oder Ping) oder sie von Ihnen hinzugefügt wurde, ist ein vollständiger Pfad natürlich nicht erforderlich, wenn die Verwendung des -ArgumentListEXE-Namens ausreichen würde (Notepad, Ping usw.).

Zusätzliche Parameter:

Invoke-WmiMethodunterstützt zusätzliche Parameter wie -Credential, -ComputerName(eine gute Möglichkeit, einen lokalen PS für Invokeetwas auf einem Remotecomputer zu verwenden, ohne SSH zu verwenden) , -Impersonationund vielemehr hier dokumentiert.

Erklärung der Cmdlet-Syntax und zusätzliche Cmdlet-Tools:

  • Das -PathArgument führt zu einem WmiObjectNamen. Es gibtDutzendevon WmiObjects, jeweils mit vielen Methodsund Properties.
  • Das -NameArgument gibt den verwendeten an Method.
  • Wmi-ObjectsUm alle verfügbaren Verwendungsmöglichkeiten aufzulisten Get-WmiObject -List(auf diese Weise ist es sehr schwierig, das benötigte Objekt zu finden).
  • Zum Auflisten und Anzeigen aller verfügbaren Win32_Process MethodsundProperties
Get-WmiObject -List |where{$_.name -match '^Win32_Process$'}

Dies gibt eine Ausgabe dieser Struktur zurück:

   NameSpace: ROOT\cimv2

Name                                Methods              Properties
----                                -------              ----------
Win32_Process                       {Create, Terminat... {Caption, CommandLine, CreationClassName, CreationDate...}

Und natürlich |Select-Object -ExpandProperty (_your_property_here_)werden durch die Verwendung alle verfügbaren Elemente angezeigt Methods, wie Createwir sie im obigen Befehl verwendet haben, und alle verfügbaren Elemente Properties(die wir nicht verwendet haben).

verwandte Informationen