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.
command-line bash process console
— 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:
http://thingsilearned.com/2009/05/26/gnu-screen-super-basic-tutorial/
— 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
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.