
eu tenho umServidor Windows 2016máquina que precisa executar um arquivo que usa o cli, remotamenteusando SSH.
Sabe-se que o logout de uma conexão SSH encerra processos que foram iniciados pelo usuário ssh. Em máquinas Linux, pode-se usar soluções como nohup
ou screen
, fazendo com que o processo não seja encerrado após o logoff.
Porém, essas soluções não funcionarão em máquinas Windows e estou procurando uma maneira de evitar que um processo seja encerrado depois de desconectado.
- Meu cliente é umMáquina Ubuntu
- Meu servidor Windows 2016 é executadoOpenSHH, comPowerShellcomo um shell padrão
- Meu programa está configurado para funcionar no modo daemon e nenhuma janela cmd ou powershell fica aberta
- Usar
Get-Process -Name proc_name
mostra que o processo está realmente em execução - Usar
Get-Process
após o logout do SSH não produz tal processo
Coisas que também tentei:
- Executando o
.exe
arquivo usandocmd
. - Executando um arquivo
.bat
and.ps
que inicia.exe
com seus argumentos.
Existe uma maneira de resolver esse problema em uma máquina Windows?
Responder1
Depois de passar muito tempo procurando soluções, descobri a maneira absolutamente correta de fazer isso usando o PowerShell.
Parece que é um daqueles cmdlets menos usados ou documentados on-line e é quase impossível de descobrir sozinho usando a documentação do MSDN, a menos que você já esteja familiarizado com o enorme mundo do Wmi Objects
.
Resumidamente:
Supondo que eu tenha um programa foo.exe
que precisa ser executado em segundo plano com os argumentos -a
e , devo usar o comando exato:-b
bar
Invoke-WmiMethod -Path 'Win32_Process' -Name Create -ArgumentList 'C:\Users\foo\Desktop\foo.exe -a -b bar'
É claro que se o seu exe for um exe "conhecido" (seja por padrão, como bloco de notas ou ping) ou adicionado por você, um caminho completo não será necessário quando usar o -ArgumentList
nome do exe seria suficiente (bloco de notas, ping e etc. .).
Parâmetros adicionais:
Invoke-WmiMethod
-Credential
suporta parâmetros adicionais , como -ComputerName
(uma boa maneira de usar um PS local para Invoke
algo em uma máquina remota sem usar SSH) -Impersonation
e muitosmais documentado aqui.
Explicação da sintaxe do cmdlet e ferramentas adicionais de cmdlet:
- O
-Path
argumento direciona para umWmiObject
nome. HádezenasdeWmiObjects
, cada um com muitosMethods
eProperties
. - O
-Name
argumento direciona o usadoMethod
. - Para listar todos
Wmi-Objects
os usos disponíveisGet-WmiObject -List
(muito difícil localizar o objeto necessário desta forma). - Para listar e visualizar todos os disponíveis
Win32_Process
Methods
eProperties
usar
Get-WmiObject -List |where{$_.name -match '^Win32_Process$'}
Isso retornará uma saída desta estrutura:
NameSpace: ROOT\cimv2
Name Methods Properties
---- ------- ----------
Win32_Process {Create, Terminat... {Caption, CommandLine, CreationClassName, CreationDate...}
E é claro que o uso |Select-Object -ExpandProperty (_your_property_here_)
revelará todos os disponíveis, Methods
como Create
usamos no comando acima, e todos os disponíveis Properties
(que não usamos).