Upstart não pode parar os serviços do foreverjs no desligamento?

1

Cenário

Usamos uma máquina virtual baseada no Vagrant que executa o Ubuntu 12.04 LTS para o desenvolvimento de três servidores Node.JS que são iniciados usando foreverjs . Executamos os serviços sob o usuário vagrant e montamos os projetos do host na máquina virtual como pastas compartilhadas.

Ao iniciar um script com forever , ele será bifurcado para o segundo plano após o início, mantendo uma lista central de todos os scripts em execução (por usuário). Para scripts que usam nomes diferentes, você pode referenciá-los por nome, bem como por um índice numérico.

Scripts são então gerenciados (iniciados, reiniciados, parados, etc) usando o comando forever .

Configuração Upstart

Eu criei arquivos conf de inicialização semelhantes para cada serviço dessa forma:

description "Control server.js"

chdir /vagrant/server

start on vagrant-mounted

stop on runlevel [016]

expect fork

pre-start script
  test -d /vagrant/server
end script

exec sudo su vagrant -c "/usr/local/bin/forever start server.js"

Problema - trava no desligamento

O upstart inicia o serviço com êxito assim que a pasta compartilhada do vagrant é montada. No entanto, desligar a máquina virtual (ou seja, vagrant halt ) é interrompido até que ela atinja o tempo limite e force a desativação da VM.

Suponho que isso acontece porque ele não sabe como parar o serviço para sempre, pois forever é meramente uma interface com os serviços que realmente quero parar.

Minha única tentativa não funcionou (ele parou o serviço, mas o Vagrant parou no tempo limite):

pre-stop script
  forever stop server.js
end script

Os serviços do nó não precisam terminar normalmente: eu ficaria feliz com qualquer cenário que mate os scripts, mas não faça com que o Vagrant seja interrompido.

Além disso, remover a linha stop on runlevel parece não ter efeito.

    
por msanford 18.07.2014 / 03:56

1 resposta

1

Primeiro, seu problema parece ser o rastreamento inadequado de garfo. Para resolver esse problema, vou fazer alguns ajustes na configuração do seu upstart:

  • Primeiro, risque o uso de su para alterar o usuário. su não deve ser usado para daemons, apenas usuários regulares (pode causar problemas com pam sendo acionado), e (mais relevante) ele bifurca o processo em segundo plano (mais difícil para Upstart rastrear e matar seu daemon). Usaremos setuid vagrant na configuração do upstart.
  • O próximo problema é que sempre forks o processo para o plano de fundo e se bifurca em segundo plano. Isso deixa o Upstart rastreando algum pid aleatório que provavelmente não está mais vivo. A solução é usar o recurso de reabertura automática do Upstart. Vou demonstrar pelo exemplo abaixo.

    description "server.js"
    
    start on vagrant-mounted
    stop on runlevel [016]
    
    chdir /vagrant/server
    setuid vagrant
    
    respawn
    respawn limit unlimited
    
    exec server.js
    

Note que você não precisa verificar se / vagrant / server é um diretório porque o upstart o cria automaticamente por causa da sub-rotina chdir.

    
por 18.07.2014 / 18:23