Como faço para bifurcar um processo que não morre quando o shell sai?

29

Se eu executar o emacs a partir do shell:

$ emacs foo &

e depois matar esse shell, o emacs morre.

Como posso executar um comando para que ele não morra quando o shell morre?

Encontrei referências ao nohup, mas isso não parece ajudar:

$ nohup emacs foo &

ainda mata o emacs quando o shell morre.

    
por sligocki 04.08.2010 / 20:04

3 respostas

13

Você não menciona se isso está sendo executado como um aplicativo X ou um aplicativo de console.

Se for um aplicativo de console, é claro que ele precisa ser fechado. Você se livrou de sua entrada / saída, mais tecnicamente o (pseudo) tty estava ligado. É muito improvável que seja isso que você quis dizer, então vamos supor que você esteja falando sobre um aplicativo X.

nohup deve funcionar, não sei porque não é. Quando o shell é fechado, ele envia SIGHUP para todos os processos em seu grupo de processos. nohup diz ao comando para ignorar o SIGHUP.

Você também pode experimentar o setsid, que desconecta o processo do grupo de processos

alias emacs='setsid emacs'

Ou adicione disown após &

    
por 04.08.2010 / 20:10
37

O método mais confiável parece ser:

(setsid emacs &)

Isso usa ( &) para bifurcar para segundo plano e setsid para desanexar do controle tty.

Você pode colocar isso em uma função de shell:

fork() { (setsid "$@" &); }

fork emacs

As possibilidades são:

  • O comando disown builtin:

    emacs &
    disown $!
    

    & age como separador de comando e disown será o padrão para o trabalho mais recente, portanto, isso pode ser reduzido para:

    emacs & disown
    
  • Double- fork() :

    (emacs &)
    

    Os comandos entre parênteses ( ) são executados em um processo de shell separado.

  • setsid , como sugerido por Rich, pode ser a melhor escolha, porque remove o controle do TTY do processo criando uma nova sessão :

    setsid emacs
    

    No entanto, também é um pouco imprevisível - será apenas fork() em segundo plano se for o líder de um grupo de processos (o que não acontecerá se setsid for usado em um script sh , por exemplo Em tais ocasiões, ele apenas se tornará resistente ao Ctrl-C.

por 05.08.2010 / 19:33
5

Verifique as configurações do shell. Você também pode tentar a tela em vez de nohup .

    
por 04.08.2010 / 20:18