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.
fonte
Respostas:
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:
Eu também sou bastante parcial para o
disown
qual pode ser usado para separar um processo da árvore atual. Você o usa em conjunto com o e comercial em segundo plano:Eu também acabei de aprender sobre a criação de subcascas entre parênteses. Este método simples funciona:
E é claro que há
nohup
como você mencionou. Eu não sou louconohup
por isso, porque tem uma tendência a escrever~/nohup.out
sem que eu peça. Se você confiar nisso, pode ser para você.E para os processos de longo prazo, existem coisas como
screen
e 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
screen
tutoriais, mas aqui está um simples início rápido:fonte
sh -c "sleep 10s && cvlc '/home/omm.ogg'" & disown
. Essa é praticamente a minha solução para tudo, para garantir que ele funcione corretamente.--replace
faz 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.nohup.out
pode ser suprimida com o redirecionamento de stdout e sterr para/dev/null
o seguinte: #nohup firefox &> /dev/null &
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
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
exit
ou 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:
fonte
matlab & exit
Executando como dois comandos separados funcionou bem:matlab &
exit
Como você apontou, você pode executar
ignorar o sinal final ao fechar o terminal. Não há problema com isso.
fonte
echo command | at now
que eu não consegui fazer funcionar.exec
fornece uma alternativanohup <command> &
para executar um processo em segundo plano e retornar o prompt do shell atual.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
para enviar o processo em execução em segundo plano. Questão
em vez disso, coloque o processo em execução novamente em primeiro plano.
EDIT : Mais detalhes nesta resposta que descobri mais tarde.
fonte
Use
(exec PROGRAM &> /dev/null & )
para permitir que o PID do subshell seja assumidoPROGRAM
. Eu testei essa abordagem várias vezes com vários programas diferentes. Fechar o terminal original não afeta o programa recém-geradoPequena demonstração:
fonte
(exec firefox)
trava o terminal até eu sair do Firefox ... e fechar o terminal SIGHUPs o shell e o subshellEu posso recomendar o terminal byobu. Você pode desanexar seu processo facilmente pressionando a tecla F6.
fonte
Embora haja boas respostas acima, gostaria de dar meus 2 centavos sobre como uso o MATLAB em segundo plano.
A
-b
tag 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
fonte
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.
fonte
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 okstart.cpp
código-fonte para referência . Como você vê a partir daí, ele usaKProcess::startDetached
eKProcess
é derivado deQProcess
estartDetached
inicia um novo processo e o desanexa.)Similar é também
kde-open
ouxdg-open
ougnome-open
.fonte