O melhor método é iniciar o processo em um multiplexador de terminal. Como alternativa, você pode fazer com que o processo não receba o sinal HUP.
Um multiplexador de terminal fornece terminais "virtuais" que funcionam independentemente do terminal "real" (na verdade, todos os terminais hoje são "virtuais", mas esse é outro tópico para outro dia). O terminal virtual continuará funcionando, mesmo que seu terminal real esteja fechado com sua sessão ssh.
Todos os processos iniciados no terminal virtual continuarão em execução com esse terminal virtual. Quando você se reconecta ao servidor, pode se reconectar ao terminal virtual e tudo será como se nada tivesse acontecido, exceto o tempo que passou.
Dois populares multiplexadores de terminal são screen e tmux .
A tela possui uma curva de aprendizado acentuada. Aqui está um bom tutorial com diagramas explicando o conceito: http://www.ibm.com/developerworks/aix/library/au-gnu_screen/
O sinal HUP (ou SIGHUP) é enviado pelo terminal para todos os seus processos filhos quando o terminal é fechado. A ação comum ao receber o SIGHUP é terminar. Assim, quando sua sessão ssh for desconectada, todos os seus processos serão encerrados. Para evitar isso, você pode fazer com que seus processos não recebam SIGHUP.
Dois métodos fáceis de fazer isso são nohup
e disown
.
Para obter mais informações sobre como nohup
e disown
funciona, leia esta pergunta e resposta: https://unix.stackexchange.com/questions/3886/difference-between-nohup-disown-and
Nota: embora os processos continuem em execução, você não pode mais interagir com eles porque eles não estão mais conectados a nenhum terminal. Esse método é útil principalmente para processos em lote de execução longa que, uma vez iniciados, não precisam mais de nenhuma entrada do usuário.
screen
oferece muito mais opções, mas se você estiver usandoauthorized_keys
para permitir que as pessoas executem um script remotamentessh
, anohup
opção é uma maneira simples e agradável de o script iniciar processos que duram mais do que assh
sessão usada para iniciá-los .Existem algumas maneiras de fazer isso, mas a que acho mais útil é usar o GNU Screen .
Depois de entrar, corra
screen
. Isso iniciará outro shell em execução na tela. Execute seu comando e faça um Ctrl- a d.Isso irá "desconectá-lo" da sessão da tela. Neste ponto, você pode sair ou fazer qualquer outra coisa que desejar.
Quando você deseja se reconectar à sessão de tela, basta executar
screen -RD
no prompt do shell (como o mesmo usuário de uso que criou a sessão).fonte
Em
bash
, adisown
palavra-chave é perfeitamente adequada para isso. Primeiro, execute seu processo em segundo plano (use&
ou^Z
digitebg
):Ao digitar,
jobs
você pode ver que o processo ainda pertence ao shell:Se você fosse desconectado nesse ponto, a tarefa em segundo plano também seria eliminada. No entanto, se você executar
disown
, o bash desconecta o trabalho e permite que ele continue em execução:Você pode confirmar isso:
Você pode até combinar o
&
edisown
na mesma linha, como:Isso é melhor do que rodar
nohup
na minha opinião porque não deixanohup.out
arquivos espalhados por todo o sistema de arquivos. Além disso,nohup
deve ser executado antes da execução do comando -disown
pode ser usado se você decidir posteriormente mais tarde que deseja colocar em segundo plano e desanexar a tarefa.fonte
A ferramenta nohup, disponível na maioria das caixas Linux, fará isso.
fonte
Apenas para ser completo, vou apontar o tmux , que tem a mesma idéia básica da tela:
No entanto, é aproximadamente infinitamente mais fácil procurar no Google.
fonte
"gnu screen"
como sua consulta de pesquisa funciona muito bem.A tela é um exagero apenas para manter os processos em execução quando você se desconecta.
Tente dtach :
fonte
Aqui está uma maneira de daemonize qualquer processo de shell, sem necessidade de programas externos:
Quando você fecha sua sessão, o trabalho continuará sendo executado, conforme evidenciado pelo arquivo output.txt (que possui buffering, demorando um pouco para mostrar um valor diferente de zero). Não se esqueça de matar o seu emprego após o teste.
Então, tudo o que você precisa fazer é fechar o stdin e colocar em segundo plano o trabalho. Para ser realmente bom, primeiro,
cd /
para não se agarrar a uma montaria.Isso funciona mesmo em sh simples no Solaris.
fonte
-
operador? Qual é a diferença entre< /dev/null
e&-
? Eu acho que o STDIN (e outros STDOUT e STDERR) podem receber um arquivo< file
ou um fluxo<& stream
no caso de STDIN. Seria o mesmo usando< /dev/null
no seu exemplo acima? E o operador-
acima se refere a um nulo como fluxo?O
at
comando pode ser útil para esse tipo de situação. Por exemplo, digite:E você pode inserir um comando ou uma série de comandos que serão executados. Os resultados devem ser enviados por e-mail para você, se o e-mail estiver configurado corretamente na máquina.
Em vez de
now
, você pode especificar uma hora opcionalmente com uma data ou uma expressão de hora comonow + 15 minutes
. Vejaman at
para mais detalhes.fonte
byobu
no Ubuntu é um bom front-end para a tela. PressionandoCtrl - ?você obtém uma lista de todos os atalhos do teclado. Ele adiciona uma barra de status que pode ser útil para observar a carga da CPU, espaço em disco, etc. No geral, fornece uma experiência que eu descreveria como uma conexão VNC baseada em terminal.nohup
permite iniciar um trabalho em segundo plano com sua saída roteada para um arquivo de log, que sempre pode ser redirecionado para / dev / null, se não for necessário.fonte