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 nohup
oder 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_name
wird angezeigt, dass der Prozess tatsächlich ausgeführt wird - Die Verwendung
Get-Process
nach dem SSH-Logout führt zu keinem solchen Prozess
Dinge, die ich auch versucht habe:
- Ausführen der
.exe
Datei mitcmd
. - Ausführen von a
.bat
und.ps
Dateien, 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.exe
ausgeführt werden muss , sollte ich den genauen Befehl verwenden:-a
-b
bar
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 -ArgumentList
EXE-Namens ausreichen würde (Notepad, Ping usw.).
Zusätzliche Parameter:
Invoke-WmiMethod
unterstützt zusätzliche Parameter wie -Credential
, -ComputerName
(eine gute Möglichkeit, einen lokalen PS für Invoke
etwas auf einem Remotecomputer zu verwenden, ohne SSH zu verwenden) , -Impersonation
und vielemehr hier dokumentiert.
Erklärung der Cmdlet-Syntax und zusätzliche Cmdlet-Tools:
- Das
-Path
Argument führt zu einemWmiObject
Namen. Es gibtDutzendevonWmiObjects
, jeweils mit vielenMethods
undProperties
. - Das
-Name
Argument gibt den verwendeten anMethod
. Wmi-Objects
Um alle verfügbaren Verwendungsmöglichkeiten aufzulistenGet-WmiObject -List
(auf diese Weise ist es sehr schwierig, das benötigte Objekt zu finden).- Zum Auflisten und Anzeigen aller verfügbaren
Win32_Process
Methods
undProperties
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 Create
wir sie im obigen Befehl verwendet haben, und alle verfügbaren Elemente Properties
(die wir nicht verwendet haben).