Eu uso o Tilda (terminal suspenso) no Ubuntu como minha "central de comandos" - da mesma forma que outras pessoas podem usar o GNOME Do, Quicksilver ou Launchy.
No entanto, estou lutando para desanexar completamente um processo (por exemplo, Firefox) do terminal do qual foi lançado - ou seja, impedir que esse processo (não) filho
- termina quando fecha o terminal de origem
- "polui" o terminal de origem via STDOUT / STDERR
Por exemplo, para iniciar o Vim em uma janela de terminal "adequada", tentei um script simples como o seguinte:
exec gnome-terminal -e "vim $@" &> /dev/null &
No entanto, isso ainda causa poluição (também, passar um nome de arquivo não parece funcionar).
Respostas:
Em primeiro lugar; Depois de iniciar um processo, você pode colocá-lo em segundo plano, primeiro parando-o (pressionar Ctrl- Z) e digitando
bg
para deixá-lo retomar em segundo plano. Agora é um "trabalho" e seustdout
/stderr
/stdin
ainda está conectado ao seu terminal.Você pode iniciar um processo como segundo plano imediatamente anexando um "&" ao final dele:
Para executá-lo em segundo plano silenciado, use o seguinte:
Algumas informações adicionais:
nohup
é um programa que você pode usar para executar seu aplicativo, de modo que seu stdout / stderr possa ser enviado para um arquivo e que o fechamento do script pai não SIGHUP o filho. No entanto, você precisa ter a previsão de usá-lo antes de iniciar o aplicativo. Por causa da maneira comonohup
funciona, você não pode simplesmente aplicá-lo a um processo em execução .disown
é um bash interno que remove um trabalho de shell da lista de trabalhos do shell. O que isto significa, basicamente, é que você não pode usarfg
,bg
no mais, mas o mais importante, quando você fecha o shell não irá travar ou enviar umaSIGHUP
para aquela criança mais. Ao contrárionohup
,disown
é usado após o processo ser iniciado e em segundo plano.O que você não pode fazer é alterar o stdout / stderr / stdin de um processo depois de iniciá-lo. Pelo menos não da casca. Se você iniciar o seu processo e informar que o stdout é o seu terminal (que é o que você faz por padrão), esse processo está configurado para gerar saída para o seu terminal. Seu shell não se importa com a configuração de FD dos processos, isso é algo que o próprio processo gerencia. O processo em si pode decidir se deseja fechar seu stdout / stderr / stdin ou não, mas você não pode usar seu shell para forçá-lo a fazê-lo.
Para gerenciar a saída de um processo em segundo plano, você tem muitas opções de scripts, "nohup" provavelmente sendo o primeiro a se lembrar. Mas para processos interativos você inicia, mas esquece de silenciar (
firefox < /dev/null &>/dev/null &
), na verdade não pode fazer muito.Eu recomendo que você obtenha o GNU
screen
. Com a tela, você pode fechar o shell em execução quando a saída do processo se tornar um incômodo e abrir um novo (^Ac
).Ah, e a propósito, não use "
$@
" onde você estiver usando.$@
significa,$1
,$2
,$3
..., que iria transformar o seu comando em:Provavelmente não é isso que você quer, porque -e leva apenas um argumento. Use
$1
para mostrar que seu script pode lidar apenas com um argumento.É realmente difícil fazer com que vários argumentos funcionem corretamente no cenário que você forneceu (com o
gnome-terminal -e
) porque-e
leva apenas um argumento, que é uma sequência de comandos do shell. Você teria que codificar seus argumentos em um. A maneira melhor e mais robusta, mas bastante desajeitada, é a seguinte:fonte
disown
, o processo continuará vivo depois que você fechar o shell, pois o bash não o fará mais.$*
vez de$@
corrigir o problema das seqüências separadas?reptyr
para isso.nohup
desanexa completamente o processo (daemonizes)fonte
nohup
apenas ignora oSIGHUP
sinal. Ele executa o processo normalmente. Sem daemonização.init
) se o shell saísse ... certo?Se você estiver usando
bash
, tente ; veja bash (1) .disown [jobspec]
Outra abordagem que você pode tentar é
at now
. Se você não é superusuário, sua permissão para usoat
pode ser restrita.fonte
at
delegar execução a outra pessoa, eu gosto! +1zsh
.disown
não parece ter o efeito desejado comgnome-terminal
-disown
ed processos ainda estão mortos quando as saídas do terminal. Eu adoraria saber por que / como.Lendo essas respostas, tive a impressão inicial de que a emissão
nohup <command> &
seria suficiente. Executando o zsh no gnome-terminal, descobri quenohup <command> &
não impedia meu shell de matar processos filhos na saída. Emboranohup
seja útil, especialmente com shells não interativos, apenas garante esse comportamento se o processo filho não redefinir seu manipulador para oSIGHUP
sinal.No meu caso,
nohup
deveria ter impedido que sinais de interrupção chegassem ao aplicativo, mas o aplicativo filho (VMWare Player neste caso) estava redefinindo seuSIGHUP
manipulador. Como resultado, quando o emulador de terminal sai, ele ainda pode matar seus subprocessos. Isso só pode ser resolvido, que eu saiba, garantindo que o processo seja removido da tabela de tarefas do shell. Senohup
for substituído por um shell incorporado, como às vezes é o caso, isso pode ser suficiente, no entanto, no caso de não ser ...disown
é um escudo embutido nobash
,zsh
eksh93
,ou
se você preferir one-liners. Isso tem o efeito geralmente desejável de remover o subprocesso da tabela de tarefas. Isso permite que você saia do emulador de terminal sem sinalizar acidentalmente o processo filho. Independentemente da
SIGHUP
aparência do manipulador, isso não deve matar o processo filho.Após a rejeição, o processo ainda é filho do seu emulador de terminal (brinque com
pstree
se você quiser assistir a isso em ação), mas após a saída do emulador de terminal, você deverá vê-lo anexado ao processo de inicialização. Em outras palavras, tudo está como deveria ser e como você provavelmente quer que seja.O que fazer se o seu shell não suportar
disown
? Eu seria altamente recomendável mudar para um que sim, mas, na ausência dessa opção, você tem algumas opções.screen
etmux
pode resolver esse problema, mas são soluções muito mais pesadas e não gosto de executá-las para uma tarefa tão simples. Eles são muito mais adequados para situações nas quais você deseja manter um tty, normalmente em uma máquina remota.setopt nohup
. Isso pode ser usado para especificar queSIGHUP
não deve ser enviado para os trabalhos na tabela de trabalhos quando o shell sair. Você pode aplicar isso imediatamente antes de sair do shell ou adicioná-lo à configuração do shell como~/.zshrc
se você sempre o quisesse.tcsh
oucsh
, o que é um pouco perturbador.exec()
. Essa é uma solução muito ruim, mas a fonte deve consistir apenas em algumas dezenas de linhas. Você pode passar comandos como argumentos da linha de comando para o programa C e, assim, evitar uma entrada específica do processo na tabela de tarefas.fonte
nohup $COMMAND &
$COMMAND & disown
setsid command
Eu uso o número 2 há muito tempo, mas o número 3 funciona da mesma forma. Além disso,
disown
possui umnohup
sinalizador de-h
, pode negar todos os processos-a
e pode negar todos os processos em execução-ar
.O silenciamento é realizado por
$COMMAND &>/dev/null
.Espero que isto ajude!
fonte
Eu acho que a tela pode resolver seu problema
fonte
no tcsh (e talvez em outros shells também), você pode usar parênteses para desanexar o processo.
Compare isto:
Para isso:
Isso remove o firefox da lista de empregos, mas ainda está vinculado ao terminal; se você efetuou login neste nó via 'ssh', a tentativa de efetuar logout ainda trará o processo ssh.
fonte
Resposta mais simples e correta para o bash:
Você não precisa desanexar o processo do terminal, mas do shell.
fonte
Para desassociar o tty shell, execute o comando através do sub-shell, por exemplo
(comando)&
Quando o terminal usado sair fechado, mas o processo ainda está ativo.
Verifica -
Abra outro terminal
O processo ainda está vivo.
fonte
O background e o primeiro plano de um trabalho são provavelmente uma das primeiras coisas que todo administrador de sistemas Unix deve saber.
Aqui está como isso é feito com o bash:
fonte
Você pode executar seu comando usando o comando nohup, desanexando seu processo e redirecionando as saídas para um determinado arquivo ... mas não tenho certeza de que é exatamente isso que você precisa.
fonte
Experimente o daemon - deve estar disponível no seu amigável gerenciador de pacotes e cuidar de todas as maneiras de se desassociar do terminal.
fonte
Basta adicionar isso no seu bashrc / zshrc:
Então você pode executar comandos renegados como este:
fonte
No meu .bashrc, tenho essas funções exatamente para esse fim:
Prefixe um comando com
dos
para executá-lo desanexado do terminal.A função foi escrita para trabalhar com
bash
ezsh
.fonte
( "$@" & disown) &> /dev/null
. Ele também faz não muito sentido usar1>
e2>
, porque você está usandodisown
, o que significa que você está usando bash, e em bash você pode apenas fazer facilmente&>
redirecionar ambos stdout e stderrrun_disowned
funcionalidade em outros lugares nos meus arquivos de ponto. Você está certo sobre a&>
coisa, é claro.Eu descobri no Mac OS X que preciso usar nohup AND disown para garantir que o processo filho não seja interrompido pelo terminal.
fonte
Eu uso o seguinte script para fazer isso. Ele interrompe a impressão do processo no terminal, desconecta
nohup
e sai com o status de retorno se o comando terminar dentro doTIMEOUT
.Exemplo de uso:
fonte
sudo apt install ucommon-utils
pdetach command
Ai está :)
fonte
Muitas respostas sugeriram o uso de nohup . Prefiro sugerir o uso do pm2 . O uso do pm2 sobre nohup tem muitas vantagens, como manter o aplicativo ativo, manter arquivos de log para aplicativos e muito mais outros recursos. Para mais detalhes, verifique isso .
Para instalar o pm2, você precisa fazer o download do npm . Para sistema baseado em Debian
e para Redhat
Ou você pode seguir estas instruções . Após instalar o npm, use-o para instalar o pm2
Feito isso, você pode iniciar seu aplicativo
Para monitoramento de processo, use os seguintes comandos:
Gerencie processos usando o nome do aplicativo ou a identificação do processo ou gerencie todos os processos juntos:
Os arquivos de log podem ser encontrados em
fonte
nohup
é um comando POSIX padrão comum, portanto, a mesma observação: de nenhuma maneira é preterido. @see unix.com/man-page/posix/1p/nohupSe seu objetivo é simplesmente iniciar um aplicativo de linha de comando sem manter a janela do terminal, tente executar o aplicativo depois de iniciar o terminal com alt-F2.
fonte