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


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


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.


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


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.


Meu objetivo final é ocultar o processo do usuário. Oculte as janelas que ele gera.
Jader Dias
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.