El proceso finaliza después del cierre de sesión SSH en el servidor Windows

El proceso finaliza después del cierre de sesión SSH en el servidor Windows

tengo unservidor windows 2016máquina que necesita ejecutar un archivo que usa el cli, de forma remotausando SSH.

Se sabe que cerrar sesión en una conexión SSH finaliza los procesos iniciados por el usuario ssh. En máquinas Linux, se pueden usar soluciones como nohupo screen, lo que da como resultado que el proceso no se cancele una vez que se cierra la sesión.

Sin embargo, estas soluciones no funcionan en máquinas con Windows y estoy buscando una manera de evitar que un proceso finalice una vez que se cierra la sesión.

  • Mi cliente es unmáquina ubuntu
  • Mi servidor Windows 2016 se ejecutaAbiertoSHH, conPotencia Shellcomo shell predeterminado
  • Mi programa está configurado para funcionar en modo demonio y no queda ninguna ventana de cmd o powershell abierta
  • El uso Get-Process -Name proc_namemuestra que el proceso realmente se está ejecutando.
  • El uso Get-Processdespués del cierre de sesión de SSH no produce tal proceso

Cosas que también probé:

  • Ejecutando el .exearchivo usando cmd.
  • Ejecutando un archivo .baty .psque comienza .execon sus argumentos.

¿Hay alguna manera de solucionar este problema en una máquina con Windows?

Respuesta1

Después de pasar mucho tiempo buscando soluciones, encontré la forma absolutamente correcta de hacerlo usando PowerShell.

Parece que es uno de esos cmdlets menos utilizados o documentados en línea, y es casi imposible descifrarlo por su cuenta usando la documentación de MSDN, a menos que ya esté muy familiarizado con el enorme mundo de los archivos Wmi Objects.

En breve:

Suponiendo que tengo un programa foo.exeque necesita ejecutarse en segundo plano con los argumentos -ay , debería usar el comando exacto:-bbar

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

Por supuesto, si su exe es un exe "conocido" (ya sea de forma predeterminada, como el bloc de notas o el ping) o lo agregó usted, no se necesita una ruta completa cuando usar el -ArgumentListnombre del exe sería suficiente (bloc de notas, ping, etc.). .).

Parámetros adicionales:

Invoke-WmiMethodadmite parámetros adicionales como -Credential( -ComputerNameuna buena forma de usar un PS local para Invokealgo en una máquina remota sin usar SSH) -Impersonationy muchosmás documentado aquí.

Explicación de la sintaxis de cmdlet y herramientas de cmdlet adicionales:

  • El -Pathargumento apunta a un WmiObjectnombre. Haydocenasde WmiObjects, cada uno con muchos Methodsy Properties.
  • El -Nameargumento dirige el utilizado Method.
  • Para enumerar todos Wmi-Objectslos usos disponibles Get-WmiObject -List(es muy difícil localizar el objeto necesario de esta manera).
  • Para enumerar y ver todos los disponibles Win32_Process Methodsy Propertiesutilizar
Get-WmiObject -List |where{$_.name -match '^Win32_Process$'}

Esto devolverá una salida de esta estructura:

   NameSpace: ROOT\cimv2

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

Y, por supuesto, el uso |Select-Object -ExpandProperty (_your_property_here_)revelará todos los disponibles, Methodscomo los Createque usamos en el comando anterior, y todos los disponibles Properties(que no usamos).

información relacionada