Executando programas em segundo plano a partir do terminal

124

Como faço para executar um programa no fundo de um shell, com a capacidade de fechar o shell, deixando o programa em execução? Vamos dizer que minha interface do usuário está tendo problemas ou, por algum motivo, eu preciso inicializar um programa a partir da janela do terminal, digamos, nm-applet :

nm-applet

Quando é iniciado, ocupa o primeiro plano da janela do terminal.

Existe alguma maneira simples de executar o programa em segundo plano sem precisar deixar o terminal aberto ou tê-lo ocupado por todo o terminal?

Nessa nota, encontrei uma maneira de executar programas do terminal e permitir outras entradas, anexando um e comercial ( & ) ao comando como tal:

nm-applet &

Mas isso não é muito útil, pois qualquer processo iniciado no terminal é interrompido quando o terminal é fechado.

    
por OVERTONE 22.02.2012 / 01:07
fonte

8 respostas

157

Recentemente, eu gostei de setsid . Começa parecendo que você está apenas executando algo do terminal, mas você pode desconectar (fechar o terminal) e ele simplesmente continua.

Isso ocorre porque o comando realmente se bifurca e, enquanto a entrada chega ao terminal atual, pertence a um pai completamente diferente (que permanece ativo depois que você fecha o terminal).

Um exemplo:

setsid gnome-calculator

Também sou parcial em relação a disown , que pode ser usado para separar um processo da árvore atual. Você o usa em conjunto com o "e comercial" de plano de fundo:

gnome-calculator & disown

Eu também aprendi sobre spawning subshells com parênteses. Este método simples funciona:

(gnome-calculator &)

E, claro, há nohup como você mencionou. Eu não sou louco por nohup porque ele tem uma tendência a escrever para ~/nohup.out sem que eu peça. Se você confiar nisso, pode ser para você.

nohup gnome-calculator

E para os processos de longo prazo, existem coisas como screen e outros terminais virtuais que mantêm as sessões ativas entre as conexões. Eles provavelmente não se aplicam a você porque você quer apenas acesso temporário à saída do terminal, mas se você quiser voltar algum tempo depois e visualizar a última atividade do terminal, a tela provavelmente seria a melhor escolha.

A internet está cheia de tutoriais screen , mas aqui está um simples início rápido:

por Oli 22.02.2012 / 01:41
fonte
48

Aqui estão as duas maneiras que eu iria. Em primeiro lugar, não executá-lo a partir de um terminal; pressione Alt + F2 para abrir o diálogo de execução, e execute-o de lá (sem & amp;).

De um terminal, execute

nm-applet &

Mas não feche o terminal você mesmo. Ou seja, não aperte o botão X para fechar e não use Arquivo - > Saia da sua barra de menus. Se você fechar o terminal dessa forma, ele enviará um sinal HUP (Hang UP) para o bash rodando dentro, que por sua vez enviará o sinal HUP para todos os seus filhos (é por isso que nohup funciona neste caso).

Em vez disso, saia do shell executando exit ou pressionando Ctrl + D . O bash irá então ignorar seus filhos e, em seguida, sair, deixando os processos em segundo plano ainda em execução. E quando o bash sai, o terminal perdeu seu processo filho, então ele irá fechar também.

Fazendo tudo de uma vez:

nm-applet & exit
    
por geirha 23.02.2012 / 12:45
fonte
13

Como você apontou, você pode executar

nohup nm-applet &  

para ignorar o sinal final ao fechar o terminal. Não há problema com isso.

    
por desgua 22.02.2012 / 01:17
fonte
10

Uma coisa que muitas outras respostas estão faltando é como desanexar um processo em execução que atualmente bloqueia o shell. Na maioria dos terminais e shells, Ctrl + Z interromperá o processo em execução e retornará a um prompt de entrada. Então, você pode emitir

bg

para enviar o processo em execução para o segundo plano. Problema

fg

em vez disso, coloque o processo em execução novamente em primeiro plano.

EDITAR : Mais detalhes em esta resposta que descobri mais tarde.

    
por krlmlr 31.03.2015 / 16:37
fonte
7

Use (exec PROGRAM &> /dev/null & ) para permitir que o PID de subshell seja assumido por PROGRAM . Eu testei essa abordagem várias vezes com vários programas diferentes. Fechar o terminal original não afeta o programa recém-criado

Pequena demonstração:

$ # this is before running
$ (exec firefox &> /dev/null &)
$ # and look, we still in side the terminal and can continue working
    
por Sergiy Kolodyazhnyy 30.11.2015 / 12:35
fonte
2

Eu posso recomendar o terminal byobu. Você pode facilmente destacar seu processo pressionando a tecla F6.

    
por speter 05.03.2013 / 01:07
fonte
1

Embora haja boas respostas acima, gostaria de dar meus 2 centavos em como eu uso o MATLAB em segundo plano.

sudo -b matlab

A tag -b do sudo pode executar aplicativos em segundo plano. Você também pode fechar o terminal depois de executar este comando.

Provavelmente, não relacionado, mas há um site maravilhoso que você pode usar para explicar os comandos do shell. link

    
por user3342981 28.06.2016 / 16:39
fonte
0

Eu não sei qual é o caminho certo, mas eu só começo outra sessão, deixando o anterior sozinho. Por exemplo eu corri um servidor web simples no meu framboesa. o web.py. Então eu começo uma nova sessão enquanto a deixo sozinha. é isso aí. também é útil desde que você ainda esteja atualizado, mesmo que esteja trabalhando na outra sessão.

    
por leo 06.07.2016 / 00:15
fonte