O processo termina após o logout do SSH no servidor Windows

O processo termina após o logout do SSH no servidor Windows

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 nohupou 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_namemostra que o processo está realmente em execução
  • Usar Get-Processapós o logout do SSH não produz tal processo

Coisas que também tentei:

  • Executando o .exearquivo usando cmd.
  • Executando um arquivo .batand .psque inicia .execom 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.exeque precisa ser executado em segundo plano com os argumentos -ae , devo usar o comando exato:-bbar

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 -ArgumentListnome do exe seria suficiente (bloco de notas, ping e etc. .).

Parâmetros adicionais:

Invoke-WmiMethod-Credentialsuporta parâmetros adicionais , como -ComputerName(uma boa maneira de usar um PS local para Invokealgo em uma máquina remota sem usar SSH) -Impersonatione muitosmais documentado aqui.

Explicação da sintaxe do cmdlet e ferramentas adicionais de cmdlet:

  • O -Pathargumento direciona para um WmiObjectnome. Hádezenasde WmiObjects, cada um com muitos Methodse Properties.
  • O -Nameargumento direciona o usado Method.
  • Para listar todos Wmi-Objectsos usos disponíveis Get-WmiObject -List(muito difícil localizar o objeto necessário desta forma).
  • Para listar e visualizar todos os disponíveis Win32_Process Methodse Propertiesusar
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, Methodscomo Createusamos no comando acima, e todos os disponíveis Properties(que não usamos).

informação relacionada