O que é equivalente a 'nohup' no Linux PowerShell?

Nov 06 2020

Sei muito bem da existência de perguntas duplicadas . Mas essa pergunta está marcada como respondida e acho que não responde de forma alguma à pergunta original.

O $ nohup commandcontinua executando o comando mesmo se o processo pai (shell) do nohup morrer. Mais informações aqui: Qual é a diferença entre nohup e e comercial .

No caso da API Win32, vejo a linha Quando o sistema está encerrando um processo, ele não encerra nenhum processo filho criado pelo processo. Terminar um processo não gera notificações para procedimentos de gancho WH_CBT. . Este é o comportamento desejado sobre o qual estou perguntando. Isso funciona com win32 powershell automaticamente. Mas com o PowerShell do Linux Start-Jobé apenas um trabalho de segundo plano no contexto do PowerShell, no sentido de que ele é encerrado quando o PowerShell é morto.

Exemplo:

➜  ~ powershell-preview -c "Start-Job { /bin/sleep 1000 }"

Id     Name            PSJobTypeName   State         HasMoreData     Location             Command
--     ----            -------------   -----         -----------     --------             -------
1      Job1            BackgroundJob   Running       True            localhost             /bin/sleep 1000

➜  ~ ps ux  | grep sleep
mvaidya   166986  0.0  0.0   9032   664 pts/11   S+   18:59   0:00 grep --color=auto --exclude-dir=.bzr --exclude-dir=CVS --exclude-dir=.git --exclude-dir=.hg --exclude-dir=.svn --exclude-dir=.idea --exclude-dir=.tox sleep

Respostas

2 mklement0 Nov 06 2020 at 09:23

Usar o operador de segundo plano doStart-Job PowerShell v6 + não é uma opção, porque encerrar o trabalho também encerrará os processos filho iniciados a partir dele, que são os trabalhos - tanto no Windows quanto em plataformas semelhantes ao Unix .&

No entanto, você pode obter um nohupcomportamento semelhante por meio do Start-Processcmdlet:

Em plataformas semelhantes ao Unix , você pode combinar Start-Processcom nohup:
O exemplo a seguir inicia uma instância do PowerShell em segundo plano que permanece ativa mesmo depois de fechar o terminal de inicialização; ele emite um a .cada segundo e nohupcoleta as saídas stdout e stderr no arquivo nohup.outno diretório atual, anexando a esse arquivo se ele já existir:

# Runs for 2 minutes and appends both stdout and stderr output to ./nohup.out
Start-Process nohup 'pwsh -nop -c "1..120 | % { write-host . -nonewline; sleep 1 }"'

No Windows , onde Start-Processpor padrão cria um processo independente em uma nova janela do console, você pode usar -WindowStyle Hiddenpara iniciar esse processo em uma janela oculta que permanecerá ativa independentemente do shell de inicialização.

# Runs for 2 minutes and appends success output to ./nohup.out
Start-Process -WindowStyle Hidden pwsh '-nop -c "1..120 | % { Add-Content -nonewline nohup.out -Value .; sleep 1 }"'