desenv-web-rp.com

Manter um processo em execução após o encerramento do PuTTY ou do terminal

Estou executando um servidor Node.js fora de uma máquina Raspbian (Debian) e gostaria de iniciar e parar o servidor remotamente. Para mim, isso significa usar PuTTY para acessar o Shell, exceto quando eu fecho o terminal PuTTY ou o tempo limite excede o tempo limite, meu servidor fica inoperante, porque eu apenas executo meu servidor em primeiro plano.

Existe uma maneira de continuar, mas ainda há uma maneira de matar o processo depois?

65
Spencer

Sua pergunta foi um pouco carente de detalhes, portanto, suponho que você queira dizer que digitou o comando para iniciar o servidor no console do seu Pi e ele foi executado em primeiro plano.

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

  1. Use resposta de @ f-tussel . Como você é novo no GNU/Linux, o & O símbolo informa ao Shell que ele deve executar o processo em segundo plano e retorná-lo ao Prompt imediatamente, em vez do que normalmente faz (que é aguardar a conclusão do comando antes de retorná-lo ao Prompt). Isso é tecnicamente chamado de bifurcar o comando em segundo plano.

  2. Faça o que você fez antes, mas faça-o em um processo screen. Basicamente, isso implica na instalação de screen (Sudo apt-get install screen no seu sistema Debian) e, em algum momento antes de digitar o comando para iniciar o servidor, você executa screen. Isso abre um novo Shell ao qual você pode se reconectar mais tarde, mesmo que sua conexão PuTTY morra. Portanto, ele funcionará como se você nunca tivesse se desconectado.

    Se você não estiver familiarizado com screen, talvez queira ler em Wikipedia e nas páginas de manual . Você também pode fazer o mesmo com tmux.

  3. Use o módulo para sempre node.js. Consulte https://stackoverflow.com/questions/4797050/how-to-run-process-as-background-and-never-die para saber onde obtive 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 será anexada a ela. E, em vez de executar um Shell, o processo de tela estará executando seu servidor. Aqui está o que você digitará:

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

    Se quiser, você pode fazer isso rodar na inicialização. Basicamente, você precisa colocar o comando screen no arquivo /etc/rc.local ou /etc/rc.d/rc.local, Eu esqueço 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. Como você está no Debian e é novo, você provavelmente está usando o padrão init fornecido pelo Debian, que é o System V Init. Nunca examinei os arquivos de serviço do System V Init, apenas systemd e um pouco do Upstart, por isso não posso ajudá-lo aqui. Faça uma nova pergunta se você quiser prosseguir com isso.

    Esta é a maneira menos "hacky", IMHO, e é isso que você deve considerar fazer se estiver executando seu servidor a longo prazo, pois você pode gerenciá-lo como outros serviços no sistema através de comandos como Sudo service your_server stop, etc. Ao fazer isso dessa maneira, o servidor será inicializado automaticamente e você não precisará de screen, porque isso 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 possui, tornando-se um usuário sem privilégios, criado especificamente para o servidor. (Isso ocorre caso o servidor fique comprometido - imagine se alguém pudesse executar as coisas como root, através do servidor! Eugh. Esta pergunta faz um bom trabalho ao falar sobre isso.)

48
strugee

Eu não sei sobre raspbian, mas como é derivado do Debian, presumo que o Nohup também esteja 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 for desconectado. HTH.

49
F. Tusell

Use supervisord se você estiver realmente falando sério.

Maneira 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 supervisord. Ele permite que você faça muitas coisas bonitas.

6
onur güngör

Se você estiver executando o bash em um Shell, poderá usar o comando disown como alternativa, que terá o mesmo resultado que o comando Nohup, exceto pelo primeiro programa em execução encontrado. 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. É o que faço para scripts, por exemplo. Não é mais simples, mas quando você o inicia, ele automaticamente entra em segundo plano e não termina se você fizer logoff.

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

5
Depado