Às vezes, quero iniciar um processo e esquecê-lo. Se eu iniciá-lo na linha de comando, assim:
redshift
Não consigo fechar o terminal ou isso acabará com o processo. Posso executar um comando para fechar o terminal sem interromper o processo?
Às vezes, quero iniciar um processo e esquecê-lo. Se eu iniciá-lo na linha de comando, assim:
redshift
Não consigo fechar o terminal ou isso acabará com o processo. Posso executar um comando para fechar o terminal sem interromper o processo?
yourExecutable &
e as saídas continuem aparecendo na tela eCtrl+C
não pare nada, basta digitar cegamentedisown;
e pressionarEnter
mesmo que a tela esteja rolando com saídas e você não possa ver o que você está digitando. O processo será contestado e você poderá fechar o terminal sem que o processo acabe.Respostas:
Um dos 2 a seguir deve funcionar:
ou
Veja o seguinte para obter mais informações sobre como isso funciona:
man nohup
help disown
Diferença entre nohup, renegado e & (não deixe de ler os comentários também)
fonte
redshift & disown
) funcionou para mim no Ubuntu 10.10. Parece funcionar bem, colocando tudo em uma linha. Existe alguma razão para eu não fazer isso?nohup redshift &
, o mesmo ocorre). E colocar o segundo em uma linha é bom, apesar de geralmente você se separar de;
(redshift &; disown
);
e&
são separadores de comando e têm precedência igual. A única diferença é a execução síncrona versus assíncrona (respectivamente). Não há necessidade de usar&;
apenas a preferência&
(funciona, mas é um pouco redundante).redshift &!
negará o desvio para o vermelho imediatamente.Se o seu programa já estiver em execução, você pode pausá-lo
Ctrl-Z
, puxá-lo para segundo planobg
e, em seguidadisown
, da seguinte maneira:fonte
disown
não desconecta stdout ou stderr. No entantonohup
, assim como>/dev/null
(desconecte a saída padrão),2>/dev/null
(desconecte o erro padrão). (disown
) Desconecta o controle do trabalho.A boa resposta já foi publicada por @StevenD, mas acho que isso pode esclarecer um pouco mais.
O motivo pelo qual o processo é interrompido na finalização do terminal é que o processo iniciado é um processo filho do terminal. Depois de fechar o terminal, isso também matará esses processos filhos. Você pode ver a árvore de processos com
pstree
, por exemplo, ao executarkate &
no Konsole:Para tornar o
kate
processo desanexadokonsole
quando você terminakonsole
, usenohup
com o comando, como este:Após o fechamento
konsole
,pstree
ficará assim:e
kate
vai sobreviver. :)Uma alternativa é usar
screen
/tmux
/byobu
, que manterá o shell em execução, independente do terminal.fonte
Você pode executar o processo como este no terminal
setsid process
Isso executará o programa em uma nova sessão. Como explicado http://hanoo.org/index.php?article=run-program-in-new-session-linux
fonte
nohup.out
. 2) Ele não permanece na lista de tarefas do seu shell, portanto não atrapalha a saída dejobs
.Embora todas as sugestões funcionem bem, descobri que minha alternativa é usar
screen
, um programa que configura um terminal virtual na tela.Você pode pensar em iniciá-lo . A tela pode ser instalada em praticamente todos os derivados Linux e Unix. Pressionar + e (em minúsculas) iniciará uma segunda sessão. Isso permitiria alternar entre a sessão inicial pressionando + e ou a sessão mais recente pressionando + e . Você pode ter até dez sessões em um terminal. Eu costumava iniciar uma sessão no trabalho, ir para casa, ssh na minha máquina de trabalho e depois invocar . Isso reconectará você a essa sessão remota.
screen -S session_name
CtrlACCtrlA0CtrlA1screen -d -R session_name
fonte
screen -d -m command
irá iniciá-lo dentro da tela já desanexada:~# screen -d -m top ~# screen -ls There is a screen on: 10803..Server-station (Detached) 1 Socket in /root/.screen. ~# screen -x
.... e você está dentro.A maneira apenas de shell de fazer tudo isso é fechar o stdin e colocar em segundo plano o comando:
Então não será encerrado quando você sair do shell. Redirecionar stdout é uma boa opção opcional.
A desvantagem é que você não pode fazer isso depois do fato.
fonte
Eu tenho um script para:
Executar comandos arbitrários em segundo plano
Impeça que sejam mortos com a janela do terminal
Suprimir sua saída
Lida com o status de saída
Eu o uso principalmente para
gedit
, etcevince
,inkscape
todos com muita saída terminal irritante. Se o comando terminar antesTIMEOUT
, o status de saída do nohup será retornado em vez de zero.exemplos...
fonte
Eu prefiro:
(Nome da Aplicação &)
por exemplo:
linux@linux-desktop:~$ (chromium-browser &)
Certifique-se de usar parênteses ao digitar o comando!
fonte
nohup
evita qualquer saída tty e na verdade eu só queria redirecionar a saída para um arquivo e isso impedia que essa fosse a melhor solução para mim.Você pode definir um processo (PID) para não receber um sinal HUP ao sair e fechar a sessão do terminal. Use o seguinte comando:
fonte
Indiscutivelmente semelhante à resposta oferecida por apolinsky , uso uma variante em
screen
. O comando vanilla é assimA sessão pode ser desconectada Ctrl ACtrl De reconectada no caso simples com
screen -r
. Eu tenho isso envolto em um script chamadosession
que mora no meuPATH
pronto para acesso conveniente:Isso só funciona quando você sabe com antecedência que deseja desconectar um programa. Ele não prevê que um programa já em execução seja desconectado.
fonte
Da mesma forma que outras respostas postadas anteriormente, pode-se transferir um processo em execução para usar a "tela" retrospectivamente, graças ao reptyr e depois fechar o terminal. Os passos estão descritos nesta publicação . Os passos a seguir são:
fonte