Tenho uma máquina Windows server 2016 que precisa executar um arquivo que usa o cli, remotamente usando SSH .
Sabe-se que o logout de uma conexão SSH encerra os processos iniciados pelo usuário ssh. Em máquinas linux, pode-se usar soluções como nohup
ou screen
, resultando em um processo não sendo morto após o logoff.
Essas soluções não funcionarão em máquinas Windows, e estou procurando uma maneira de impedir que um processo seja encerrado uma vez desconectado.
- Meu cliente é uma máquina Ubuntu
- Meu servidor Windows 2016 executa o OpenSHH , com o PowerShell como shell padrão
- Meu programa está configurado para funcionar no modo daemon e nenhuma janela cmd ou powershell é deixada aberta
- Usando
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 esse processo
Coisas que eu também tentei:
- Executando o
.exe
arquivo usandocmd
. - Executando um arquivo
.bat
and que inicia o com seus argumentos..ps
.exe
Existe uma maneira de resolver esse problema em uma máquina Windows?
Depois de passar muito tempo procurando soluções, encontrei a maneira absolutamente correta de fazer isso usando o PowerShell.
Parece que é um daqueles cmdlets menos usados ou documentados online, e é quase impossível descobrir por conta própria usando a documentação do MSDN, a menos que você já esteja muito familiarizado com o enorme mundo do
Wmi Objects
.Resumidamente:
Supondo que eu tenha um programa
foo.exe
que precise ser executado em segundo plano com os argumentos-a
,-b
ebar
, eu deveria estar usando o comando exato:É claro que se o seu exe for um exe "conhecido" (por padrão, como bloco de notas ou ping) ou adicionado por você, um caminho completo não é necessário ao usar o
-ArgumentList
nome e exe seria suficiente (bloco de notas, ping e etc. .).Parâmetros adicionais:
Invoke-WmiMethod
suporta parâmetros adicionais como-Credential
,-ComputerName
(uma boa maneira de usar um PS local paraInvoke
algo em uma máquina remota sem usar SSH)-Impersonation
e muitos outros documentados aqui .Explicação da sintaxe do cmdlet e ferramentas adicionais do cmdlet:
-Path
argumento direciona para umWmiObject
nome. Existem dezenas deWmiObjects
, cada um com muitosMethods
eProperties
.-Name
argumento direciona o usadoMethod
.Wmi-Objects
usos disponíveisGet-WmiObject -List
(muito difícil localizar seu objeto necessário dessa maneira).Win32_Process
Methods
eProperties
usarIsso retornará uma saída desta estrutura:
E é claro que o uso
|Select-Object -ExpandProperty (_your_property_here_)
revelará todos os disponíveisMethods
, comoCreate
usamos no comando acima, e todos os disponíveisProperties
(que não usamos).