Como manter uma tarefa remota em execução depois de executá-la em um console SSH? [duplicado]

3

Possible Duplicates:
How to keep program running after ssh disconnection.
How can I use ssh to run a command on a remote Unix machine and exit before the command completes?

Estou executando um servidor mongo em uma máquina de produção. Eu acesso através de um console ssh. Se eu executar o servidor mongo, ele será executado em primeiro plano. Se eu fechar a janela do SSH no meu cliente, o processo do mongo morre no servidor.

Mesmo que eu o execute como "mongod &" no fundo, ele ainda morre se a conexão for perdida.

Como eu executo este daemon corretamente para que ele não dependa de uma sessão SSH ativa?

edit: usando o console do Ubuntu 10 como o servidor

    
por bluebit 21.01.2011 / 13:18

2 respostas

6

Quando você fecha um shell, ele envia um sinal SIGHUP para todos os trabalhos gerados. Por padrão, o SIGHUP encerrará qualquer processo.

Se você souber que precisa "mantê-lo em execução" ao gerar o processo, poderá usar nohup para gerar seu processo. Como efeito colateral, ele redirecionará stdout e stderr para um arquivo nohup.out se esses fluxos estivessem apontando para o terminal. Você pode redirecioná-los você mesmo se não quiser este arquivo.

Você também pode executá-lo usando setsid , o que cria um novo grupo de processos. Seu shell não enviará mais SIGHUP para ele, pois não está no grupo de processos do shell.

Se você já iniciou seu programa e está executando o bash ou zsh (muito provavelmente no Linux), você pode usar disown .

Execute o comando com & para forçar o plano de fundo ou execute-o normalmente digite Ctrl-Z para suspendê-lo e bg %1 (assumindo que é o trabalho nº 1) para suspendê-lo e executá-lo como plano de fundo processo. Então você digita disown %1 para fazer o bash / zsh esquecer isso.

disown é o meu método usual, não preciso me lembrar de mexer com fluxos de saída como nohup requer.

    
por 21.01.2011 / 17:20
2

Tente usar nohup mongod & . Isso impedirá que o programa receba sinais SIGHUP que são enviados quando o shell sai (após a conexão ser perdida). Este é um shell padrão embutido em todos os shells.

Você também pode usar setsid mongod & , o que desassociaria o programa do terminal, portanto, quando o shell sair, um sinal SIGHUP não será enviado. (Outras coisas acontecem também, mas este é o efeito colateral primário.) O Setsid não é padrão em todos os shells, mas está no bash no Ubuntu 10.

Você também pode iniciar o gnu-screen, que manterá a sessão em execução após a perda da conexão, permitindo que você se reconecte e interaja com o shell novamente. O estado do programa não será alterado, ele continuará sendo executado enquanto desconectado.

    
por 21.01.2011 / 14:03