Manter um processo em execução após o PuTTY ou o terminal ter sido fechado [duplicado]

57

Estou executando um servidor Node.js de uma máquina Raspbian (Debian) e eu d gostaria de iniciar e parar o servidor remotamente. Isso significa para mim usar o PuTTY para acessar o shell, exceto quando eu fecho o terminal do PuTTY ou ele expira, meu servidor cai com isso, porque eu apenas executo meu servidor em primeiro plano.

Existe uma maneira de continuar, mas ainda tem um jeito de matar o processo depois?

    
por Spencer 05.09.2013 / 07:11

4 respostas

43

Sua pergunta foi um pouco carente de detalhes, então estou assumindo que você quer dizer que você digitou o comando para iniciar seu servidor no console do seu Pi, e ele foi executado em primeiro plano.

Se este for o caso, você tem cinco opções, ordenadas pela complexidade para implementar:

  1. Use a resposta do @ f-tussel . Como você é novo no GNU / Linux, o símbolo & informa ao shell que ele deve executar o processo em segundo plano e retornar ao prompt imediatamente, em vez do que normalmente faz (que é esperar que o comando termine antes de retornar ao prompt). Isso é tecnicamente chamado de bifurcar o comando para o plano de fundo.

  2. Faça o que você fez antes, mas faça isso em um processo screen . Basicamente, isso implica em instalar screen ( sudo apt-get install screen em seu sistema Debian), e algum tempo antes de você digitar o comando para iniciar seu servidor, você executa screen . Isso abre um novo shell que você pode reconectar posteriormente, mesmo se sua conexão PuTTY morrer. Então vai agir como se você nunca tivesse desconectado.

    Se você não estiver familiarizado com screen , faça algumas leituras em Wikipédia e nas páginas de manual . Você também pode realizar a mesma coisa com tmux .

  3. Use o módulo para sempre node.js. Veja link para onde eu consegui isso.

  4. Coloque seu servidor em um processo screen em segundo plano. Isso significa que você criará uma nova sessão screen em segundo plano, mas nunca anexará a ela. E, em vez de executar um shell, o processo de tela estará executando seu servidor. Aqui está o que você vai digitar:

    screen -d -m exec_your_server --put-args-here
    

    Se quiser, você pode fazer isso na inicialização. Basicamente você precisa colocar o comando screen no arquivo /etc/rc.local ou /etc/rc.d/rc.local , esqueci qual. Se você tiver problemas para fazer isso, faça uma nova pergunta.

    Novamente, você pode fazer isso com tmux também.

  5. Escreva um script de serviço. Já que você está no Debian e é novo, você está provavelmente usando o padrão init que o Debian fornece, que é o System V Init. Eu nunca olhei para arquivos de serviço para System V Init, apenas systemd e um pouco Upstart, então não posso ajudá-lo aqui. Faça uma nova pergunta se você quiser fazer isso.

    Esta é a maneira menos "hacky", IMHO, e isso é o que você deve considerar se estiver executando seu servidor a longo prazo, pois você pode gerenciá-lo como outros serviços no sistema por meio de comandos como sudo service your_server stop , etc. Fazer isso desta maneira iniciará seu servidor na inicialização automaticamente e você não precisará de screen , porque ele também acontece automaticamente em segundo plano.

    Ele também é executado automaticamente como root, o que é perigoso - você deve colocar a lógica em seu servidor para eliminar os privilégios que você tem, tornando-se um usuário sem privilégios que você criou especificamente para o servidor. (Isto é, caso o servidor seja comprometido - imagine se alguém pudesse rodar as coisas como root, através do seu servidor! Eugh. Esta questão faz um bom trabalho de falar sobre isso.)

por 05.09.2013 / 08:04
44

Eu não sei sobre o raspbian, mas como ele é derivado do Debian, eu assumo o nohup também estará disponível. Em vez de executar um processo como,

$  proc &

tente usar:

$ nohup proc &
O nohup impedirá que o processo seja encerrado quando o terminal se desconectar. HTH.

    
por 05.09.2013 / 07:28
5

Se você estiver executando um shell bash, você pode alternativamente usar o comando disown , que terá o mesmo resultado que o comando nohup , exceto que ele pega o primeiro programa em execução que encontra. Por exemplo:

$ command &
$ disown

Ou talvez você possa criar um script que bifurque seu processo e mate o pai para que o filho seja herdado pelo init. Isso é o que eu faço para scripts, por exemplo. Não é mais simples, mas quando você o inicia, ele automaticamente vai para o segundo plano e não termina se você fizer logoff.

Outra solução seria criar um arquivo de serviço e ativá-lo para que você possa iniciar, parar, reiniciar ou o que for com um comando simples. (mas eu realmente não sei se o debian está usando systemd desde que eu estou no archlinux)

    
por 05.09.2013 / 09:46
5

Use supervisord se você for realmente sério.

Forma básica de fazer isso para executar seu binário como:

$ nohup node app &
$ echo $! > node-instance.pid

Então, quando você quiser matá-lo,

$ kill 'cat node-instance.pid'

Mas eu usaria o supervisord. Ele permite que você faça muitas coisas extravagantes.

    
por 05.09.2013 / 07:42