Como definir o comando em segundo plano, feche o terminal e retorne ao fg?

10

Estou tentando descobrir como executar um comando em segundo plano e trazê-lo para o primeiro plano mais tarde. Estou farto de tutoriais e respostas em que as pessoas afirmam que é simples, basta anexar &ao final do comando para executá-lo em segundo plano. Está funcionando apenas dentro de uma única janela do terminal. Quero colocar o comando em segundo plano em um terminal e recuperá-lo em primeiro plano depois de reabrir o terminal

Exemplo:

$ grunt &
$ jobs
$ [1]+  Running  grunt &

Obviamente, após o fechamento do terminal, nenhum trabalho é encontrado.

Próximo exemplo:

$ grunt & disown #the same behavior has: $ setsid grunt &
$ jobs
$ [nothing] #but ps shows that grunt is working

after close terminal, grunt doesn't work

O que eu fiz errado? Alguém poderia me explicar como executar o comando em segundo plano e recuperá-lo em primeiro plano.

Timur Fayzrakhmanov
fonte

Respostas:

11

É impossível da maneira que você deseja.

Vamos revisar alguns conceitos básicos:

  • Um grupo de processos é uma coleção de processos relacionados que podem ser sinalizados de uma só vez.
  • Uma sessão é uma coleção de grupos de processos, que estão conectados a um único dispositivo de terminal (conhecido como terminal de controle) ou não estão conectados a nenhum terminal.

Se você fechou o terminal, todos os processos na sessão estão mortos, exceto aqueles (daemons) reparados no processo init. E não há como dar a eles um terminal de controle novamente.

Em uma palavra, o reparo do processo é altamente restrito nos sistemas POSIX (daemonizing é uma exceção) e seus requisitos não podem ser satisfeitos.

sgx1
fonte
6
Tecnicamente, esta é a resposta correta, mas acredito que os visitantes que estão tendo esse problema encontrarão "sua solução" nas outras respostas que mencionam screen / byobu / tmux.
Programster
Você está certo .., mas do meu ponto de vista, os conceitos básicos são mais importantes para entender o sistema funcionando melhor e entender o que você quer e faz de errado. Obrigado a ambos!
Timur Fayzrakhmanov
16
  1. Instalar screen:

    sudo apt-get install screen
  2. Início screen:

    screen -S session_name
  3. Execute seus comandos do que você precisa.

  4. Desconecte screen-se do terminal (seus comandos ainda estarão em execução):

    Pressione CTRL+ a+d

  5. Feche o terminal

  6. Abra outro terminal e reconecte a última screensessão:

    screen -r

Para obter mais informações e opções extras para screenprocurar man screen.

falcoeiro
fonte
2
Tela ou byobu (especialmente se você estiver executando o ubuntu). O Byobu é baseado na tela, se estiver correto, mas acho que ele tem uma funcionalidade extra que acho útil e mais fácil de usar, mas isso é uma questão de opinião.
Programster
Obrigado boa sugestão! Talvez seja necessário no recurso!) Da Rússia com amor <3
Timur Fayzrakhmanov
@ Programmer, sim, Byobu é ex. tela. Possui byobu-screen e byobu-tmux.
user.dz
1
Eu recomendo tmuxcomo uma alternativa para screen.
gerrit
5

Você já tentou: byobuou tmuxquais são os multiplexadores de terminal. Não é exatamente o que você está procurando, mas tem um comportamento semelhante.

byobu-screen

Em seguida, execute seu comando para desanexar:

byobu-screen -d

Para retomar:

byobu-screen -r

Consulte https://help.ubuntu.com/community/Screen

user.dz
fonte
Aqueles também, +1.
Falconer