Existe alguma maneira de executar processos em segundo plano no Windows? nohup equivalente para windows

12

nohup executa um processo em segundo plano. Existe algum equivalente para o Windows?

Jader Dias
fonte

Respostas:

8

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

Aragorn
fonte
Tanto quanto eu entendo, o STARTcomando 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.
usar o seguinte comando
pelo menos no Windows 7 a command3 não vai morrer, por exemplo u pode entrar em um cmd prompt "começar notepad" em seguida, sair e bloco de notas vai ainda estar em execução
Aragorn
Sim, você está certo. No entanto, eu estava testando de outro idioma, onde tudo o que posso é 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.exemenu Iniciar, onde o processo iniciado parece ficar órfão 'corretamente' quando cmd.exesair. Claramente eu preciso entender isso melhor. :-(
unixhacker2010
6

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.

Spence
fonte
5

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

Evan Anderson
fonte
Qual é a vantagem de fazer isso vs usando schtasks.exe ou a GUI do Agendador de tarefas?
243 Helvick
Não há muita diferença funcional entre essa API e o schtasks.exe. A vantagem da GUI é que você pode fazer isso programaticamente.
Evan Anderson
0

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.

Wesley
fonte
Meu objetivo final é ocultar o processo do usuário. Oculte as janelas que ele gera.
Jader Dias