nohup executa um processo em segundo plano. Existe algum equivalente para o Windows?
nohup executa um processo em segundo plano. Existe algum equivalente para o Windows?
Respostas:
Você pode usar o comando start para executar um processo em segundo plano da janela de comando.
command1
command2
start command3
command4
O comando2 espera até o comando1 terminar, mas o comando4 não espera que o comando3 termine.
e se você precisar executar independentemente do usuário conectado, inicie o processo como um serviço e poderá usar o anysrv.exe
exec(<some windows executable>)
. Eu posso ver claramente no Process Explorer o relacionamento pai-filho e tudo o que começo de dentro exec()
não sobrevive. Corrija que parece funcionar se eu iniciar um cmd.exe
menu Iniciar, onde o processo iniciado parece ficar órfão 'corretamente' quando cmd.exe
sair. Claramente eu preciso entender isso melhor. :-(
Você pode querer olhar para os serviços do Windows. Existem algumas ferramentas que você pode baixar para hospedar qualquer processo como um serviço do Windows. Isso faz com que o processo seja carregado em segundo plano na inicialização do Windows, portanto, desde que não exija interação do usuário, você poderá hospedá-lo dessa maneira.
Kit de Recursos do Windows Server 2003
A ferramenta que você procura é chamada srvany.exe.
A única maneira, no Windows, de que um processo iniciado por um usuário continue em execução após o logoff (ou seja, o que o "nohup" faz) é iniciá-lo por meio de uma "tarefa agendada" ou como um serviço do Windows. Quando o usuário fizer logoff, todos os processos em sua sessão de logon serão eliminados.
Se você deseja experimentar o método "Tarefas agendadas", convém saber como criá-las programaticamente. A classe W32 Win32_ScheduledJob pode fazer isso. A documentação é fornecida em detalhes aqui: http://www.microsoft.com/technet/scriptcenter/guide/sas_man_rsxs.mspx?mfr=true Basicamente, você está pensando em fazer (roubado descaradamente da Microsoft):
Set objService = GetObject("winmgmts:\\.")
Set objNewJob = objService.Get("Win32_ScheduledJob")
errJobCreated = objNewJob.Create("Program-to-execute.exe", "ugly-formatted-time-string-per-Microsoft-docs",True ,1 OR 4 OR 16, , ,JobID)
If Err.Number = 0 Then
Wscript.Echo "New Job ID: " & JobID
Else
Wscript.Echo "An error occurred: " & errJobCreated
End If
Para conceder ao "joe user" a capacidade de criar tarefas agendadas, você precisará modificar a permissão na pasta% SystemRoot% \ Tasks. Veja aqui algumas informações nessa frente: http://technet.microsoft.com/en-us/library/cc785125(WS.10).aspx
Tudo isso depende do seu objetivo final. Você pode executar uma tarefa agendada com a opção de executar apenas se o usuário estiver conectado e definido como DESATIVADO. Você poderia usar o psexec de uma máquina remota. Melhor ainda: executar o processo como um serviço. Confira esta pesquisa no Google , esta outra pesquisa no Google , este tópico e este outro tópico para obter possíveis pistas na sua busca por uma solução. Por fim, parece que não há equivalente exato ao nohup em uma máquina Windows.
START
comando não desanexa, ou seja, ainda é filho do processo que o criou. No seu exemplo, isso significa que 'command3' morrerá sempre que o processo mãe terminar. O Unix contorna isso ao fazer isso era conhecido como 'fork duas vezes', mas eu não conheço um equivalente no Windows.