Executando e gerenciando dois daemons com o mesmo executável pelo rc juntos

1

Eu uso o UNIX do FreeBSD e seu rc sistema de scripts de inicialização para fazer com que meus servidores Node.js iniciem na reinicialização como um daemon e iniciem, como um daemon novamente, e pará-los com alguns comandos que o sistema me dá depois que eu entrei na minha conta de usuário do FreeBSD UNIX.

Li as seções relacionadas ao Manual e um artigo sobre ele, e escrevi o script a seguir e a configuração em /etc/rc.d/my_script e /etc.rc.conf , respectivamente. O que faz funcionar como eu descrevi. Quando eu adiciono outro script para outro serviço, apenas um deles funciona, acho que normalmente o segundo. Cada servidor codificado para escutar números de porta diferentes.

my_script_1 é executável para todos como '-rwxr-xr-x' .

/etc/rc.d/my_script_1 :

#!/bin/sh

. /etc/rc.subr

name=my_service_1
rcvar=${name}_enable

project_dir="/usr/home/ec2-user/dev/projects/my_project_1"

command="/usr/local/bin/node"
command_args="${project_dir}/index.js"

load_rc_config $name
run_rc_command "$1"

/etc.rc.conf inclui a ativação do var set:

my_service_1_enable="YES"

Quando eu adiciono outro script e rc.conf como aqueles com apenas o nome alterado para um nome diferente como my_service_2 , apenas um deles funciona. my_script_2 também é executável.

O que estou perdendo? Como posso fazê-los trabalhar os dois?

    
por Selçuk 19.10.2018 / 19:02

1 resposta

0

Quando você escreve "geralmente" , parece uma condição de corrida. É então aleatório qual das instâncias consegue sobreviver.

Não há nenhum problema básico no que você está tentando fazer com os scripts rc. Os scripts rc só iniciam os comandos. As coisas que você tenta iniciar, no entanto, precisam ser executadas em várias instâncias. O sistema rc não faz nada (como tal) magicamente para fazer isso.

Pelo que você descreve, eu acho que partes do projeto 1 & 2 estão usando os mesmos recursos, portanto, node.js só pode executar uma instância. Um exemplo seria que ambos os projetos se ligam à mesma porta. Duas instâncias não podem servir na mesma porta - então apenas a primeira a começar (a corrida) começa a viver.

Para depurar isso, comece a garantir que você manipule várias instâncias corretamente. Tente desativar seus scripts de inicialização. Então inicie ambos projetos manualmente ao mesmo tempo.

Primeiro você executa:

/usr/local/bin/node /usr/home/ec2-user/dev/projects/my_project_1/index.js

E então:

/usr/local/bin/node /usr/home/ec2-user/dev/projects/my_project_2/index.js

À medida que o nó sai para STDOUT e os erros vão para STDERR, é mais fácil ver o que está errado. Tenho certeza de que seu problema está por aqui e que a saída pode ajudá-lo a aprofundar sua investigação.

Se o acima realmente funcionar (contrariamente à minha suspeita), então você precisa obter a saída de log dos processos do nó inicial em seu script de inicialização. Não parece que os logs do node.js estão em um arquivo ou syslog. Isso significa que, se você tentar iniciar o script rc manualmente, deverá obter uma saída de erro na tela. Então tente controlar seu script rc usando:

service my_service_1 start

Para pesquisar mais sobre o registro, consulte onde está o nodejs-log-file .

NOTA: Você está jogando com seus próprios scripts em /etc/rc.d/your_script , que é destinado ao sistema básico. Você deve colocar seus scripts em /usr/local/etc/rc.d/your_script . O comando service pesquisa os dois locais para que funcione da mesma forma. Nenhuma alteração incluída em /etc/rc.conf .

    
por 20.10.2018 / 09:43