Executando programas em segundo plano a partir do terminal

136

Como executo um programa no fundo de um shell, com a capacidade de fechá-lo enquanto deixo o programa em execução? Digamos que minha interface do usuário esteja com problemas ou, por algum motivo, 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 ocupar todo o terminal?

Nessa nota, eu encontrei uma maneira de executar programas a partir do terminal e permitir outras entradas, anexando um e comercial ( &) ao comando da seguinte maneira:

nm-applet &

Mas isso não é muito útil, pois todos os processos iniciados no terminal são eliminados quando o terminal é fechado.                                                                        

SUBSTITUIÇÃO
fonte
7
nohup 'command' & Isso parece funcionar. Algum problema com isso?
22712

Respostas:

173

Eu recentemente vim a gostar setsid. Ele começa a parecer que você está executando algo do terminal, mas pode desconectar (fechar o terminal) e continua.

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

Um exemplo:

setsid gnome-calculator

Eu também sou bastante parcial para o disownqual pode ser usado para separar um processo da árvore atual. Você o usa em conjunto com o e comercial em segundo plano:

gnome-calculator & disown

Eu também acabei de aprender sobre a criação de subcascas entre parênteses. Este método simples funciona:

(gnome-calculator &)

E é claro que há nohupcomo você mencionou. Eu não sou louco nohuppor isso, porque tem uma tendência a escrever ~/nohup.outsem 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 screene outros terminal-muxers virtuais que mantêm as sessões ativas entre as conexões. Isso provavelmente não se aplica realmente a você, porque você só quer acesso temporário à saída do terminal, mas se você quiser voltar um pouco mais tarde e ver a atividade mais recente do terminal, a tela provavelmente será sua melhor escolha.

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

Oli
fonte
Oli, no caso de DISPLAY =: 0 unidade - substitua qual das opções acima você usaria e por quê?
Noz sobre natty
4
@nuttyaboutnatty embrulhar o lote inteiro em sua própria sessão shell: sh -c "sleep 10s && cvlc '/home/omm.ogg'" & disown. Essa é praticamente a minha solução para tudo, para garantir que ele funcione corretamente.
Oli
1
@nuttyaboutnatty Isso é o que quero dizer, mas você não terminaria com duas instâncias, porque --replacefaz o que parece e na verdade termina a instância antiga. A execução da segunda vez a partir da xsession encerraria a cópia vinculada ao TTYn e permitiria que você a usasse no futuro, se necessário. Provavelmente existe uma maneira melhor de fazê-lo, mas apenas o que vem à minha mente cada vez que preciso.
Oli
1
Perfeito, o que funcionou para mim foi o subshell '(gnome-calculator &)'. Eu o uso para iniciar um aplicativo de console mono em segundo plano. Com as outras técnicas, o aplicativo mono trava instantaneamente.
Nikolaos Georgiou
2
Nota para usuários futuros : a criação de nohup.outpode ser suprimida com o redirecionamento de stdout e sterr para /dev/nullo seguinte: #nohup firefox &> /dev/null &
Sergiy Kolodyazhnyy
55

Aqui estão as duas maneiras que eu usaria. Em primeiro lugar, não executá-lo a partir de um terminal; pressione Alt+ F2para abrir a caixa de diálogo de execução e execute-a a partir daí (sem &).

Em um terminal, execute

nm-applet &

Mas NÃO feche o terminal você mesmo. Ou seja, não pressione o botão X para fechar e não use Arquivo -> Sair na barra de menus. Se você fechar o terminal dessa maneira, ele enviará um sinal HUP (Hang UP) para o bash, que por sua vez enviará o sinal HUP a todos os seus filhos (e é por isso que nohup funciona nesse caso).

Em vez disso, saia do shell executando exitou pressionando Ctrl+ D. O bash então repudia seus filhos e sai, deixando os processos em segundo plano ainda em execução. E quando o bash sai, o terminal perde o processo filho e fecha também.

Fazendo tudo de uma vez:

nm-applet & exit
Geirha
fonte
Isso é incrível! Nunca soube disso e você parece ser a única pessoa a mencionar isso. Definitivamente, essa é minha abordagem favorita quando em um ambiente de desktop. Pena que eu não posso upvote mais; p
7hi4g0
Eu tentei isso com um aplicativo diferente e ele falhou: matlab & exitExecutando como dois comandos separados funcionou bem:matlab & exit
MattKelly
Fiquei me perguntando por que OP disse que fechar o terminal causou um travamento nos seus programas em segundo plano. Nunca tentei fechar um terminal com o botão "x" na janela.
user1717828
o botão x é finalizado, ele não sai corretamente, o comando exit sai. você poderia remapear o botão x para um comando de saída em vez disso ...
Tim Baker
14

Como você apontou, você pode executar

nohup nm-applet &  

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

desgua
fonte
Alguma outra alternativa? Apenas para knowings bem, não para qualquer outra coisa
Harmônica
Na wikipedia ( en.wikipedia.org/wiki/Nohup ), há uma sugestão de uso echo command | at nowque eu não consegui fazer funcionar.
Des
2
Gostaria de saber como funciona a partir da interface do usuário quando você clica duas vezes em um ícone ou programa.
23412
execfornece uma alternativa nohup <command> &para executar um processo em segundo plano e retornar o prompt do shell atual.
JSStuball 30/07
12

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

bg

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

fg

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

EDIT : Mais detalhes nesta resposta que descobri mais tarde.

krlmlr
fonte
7

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

Pequena demonstração:

$ # this is before running
$ (exec firefox &> /dev/null &)
$ # and look, we still in side the terminal and can continue working
Sergiy Kolodyazhnyy
fonte
Hmmm (exec firefox)trava o terminal até eu sair do Firefox ... e fechar o terminal SIGHUPs o shell e o subshell
kos
Eu editei minha resposta. Testei com vários outros programas. Eu não tenho observado firefox ou outro programa de pendurar o terminal de controle nesta versão
Sergiy Kolodyazhnyy
funciona bem para mim
Zanna
Não acredito que seja necessário usar o exec do bash; pode ser que você precise do PID por algum motivo.
marinara
2

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

speter
fonte
1

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

sudo -b matlab

A -btag sudo pode executar aplicativos em segundo plano. Você também pode fechar o terminal após executar este comando.

Provavelmente, não relacionado, mas há um site maravilhoso que você pode usar para explicar os comandos do shell. http://explainshell.com/explain/8/sudo

user3342981
fonte
0

Eu não sei o caminho certo, mas eu apenas começo outra sessão, deixando a anterior sozinha. Por exemplo, eu executei um servidor web simples na minha framboesa. o web.py. então inicio uma nova sessão, deixando-a sozinha. é isso aí. também é útil, pois você ainda está atualizado, mesmo trabalhando na outra sessão.

leo
fonte
2
Bem-vindo ao Ask Ubuntu! Eu recomendo editar esta resposta para expandi-la com detalhes específicos sobre como fazer isso. (Veja também Como faço para escrever uma boa resposta? Para o conselho geral sobre que tipos de respostas são consideradas mais valiosas no Pergunte Ubuntu.)
David Foerster
0

Caso o KDE seja usado, você também pode usá-lo kstart, o que iniciará seu programa desanexado do terminal. Também garante que o ambiente do KDE esteja configurado corretamente para o comando. (Consulte o kstart.cppcódigo-fonte para referência . Como você vê a partir daí, ele usa KProcess::startDetachede KProcessé derivado de QProcesse startDetachedinicia um novo processo e o desanexa.)

Similar é também kde-openou xdg-openou gnome-open.

Albert
fonte
Tal como está, parece quase mais um comentário do que uma resposta. Por favor edite a se expandir. Não dê apenas uma frase; explique por que você está certo, idealmente com citações. Respostas sem explicação estão sujeitas a remoção.
anonymous2