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 nohup
o 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_name
muestra que el proceso realmente se está ejecutando. - El uso
Get-Process
después del cierre de sesión de SSH no produce tal proceso
Cosas que también probé:
- Ejecutando el
.exe
archivo usandocmd
. - Ejecutando un archivo
.bat
y.ps
que comienza.exe
con 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.exe
que necesita ejecutarse en segundo plano con los argumentos -a
y , debería usar el comando exacto:-b
bar
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 -ArgumentList
nombre del exe sería suficiente (bloc de notas, ping, etc.). .).
Parámetros adicionales:
Invoke-WmiMethod
admite parámetros adicionales como -Credential
( -ComputerName
una buena forma de usar un PS local para Invoke
algo en una máquina remota sin usar SSH) -Impersonation
y muchosmás documentado aquí.
Explicación de la sintaxis de cmdlet y herramientas de cmdlet adicionales:
- El
-Path
argumento apunta a unWmiObject
nombre. HaydocenasdeWmiObjects
, cada uno con muchosMethods
yProperties
. - El
-Name
argumento dirige el utilizadoMethod
. - Para enumerar todos
Wmi-Objects
los usos disponiblesGet-WmiObject -List
(es muy difícil localizar el objeto necesario de esta manera). - Para enumerar y ver todos los disponibles
Win32_Process
Methods
yProperties
utilizar
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, Methods
como los Create
que usamos en el comando anterior, y todos los disponibles Properties
(que no usamos).