Questão Executando um processo daemon a partir do upstart


Estou executando meu aplicativo em um VPS no Ubuntu 12.04 LTS.

E eu tenho um problema com um processo de daemon para um dos meus aplicativos. Esse processo é chamado de "delayed_job" (se não for familiar - isso é apenas um manipulador de tarefa em segundo plano).

O problema com este processo é que às vezes ele é morto (suponho que seja porque eu tenho uma quantidade limitada de RAM no meu servidor - apenas 1GB).

Mas o principal problema com isso é que é não capaz de inicializar novamente após um sinal de falha ou "kill", ao contrário dos processos "unicorn" (é um servidor de aplicativos Rails), que estão sempre sendo reinicializados, não importa o que aconteça a eles.

E sim, isso é muito importante, porque muitos recursos de aplicativos estão usando tarefas em segundo plano.

A mesma história acontece quando há trabalhos de manutenção no VPS (iniciados pelo proprietário do VPS) e após a reinicialização o processo "delayed_job" não está mais presente no sistema.

Este é o comando que eu corro todas as vezes para inicializar: RAILS_ENV=production script/delayed_job start

É um problema bem conhecido, mas a única solução que encontrei na Internet é este artigo: http://www.alexreisner.com/code/upstart Isso sugere usar o recurso "upstart" do Linux com a opção "respawn", que é capaz de reinicializar o processo se ele for morto ou travado.

Mesmo que o artigo esteja um pouco desatualizado, descobri que o Ubuntu 12.04 deve suportar esse recurso e criei um link simbólico em /etc/init diretório (eu chamei isso: delayed_job.conf) para o arquivo "delayed_job" que eu coloquei em uma das minhas pastas de aplicativos (app_name / config, para ser exato) - Eu fiz tudo o que este artigo diz.

Meu problema é: quando eu tento iniciar este novo processo (start delayed_job) no console eu recebo:

delayed_job start/running, process 6000

Mas, na verdade - nenhum processo "delayed_job" está sendo criado.

E o status (status delayed_job) do processo initctl ainda é: delayed_job stop/waiting

Depois que eu executo kill -9 6000 eu recebo -bash: kill: (6000) - No such process

Então, isso significa que nada é executado. Eu tentei rodar várias vezes em diferentes condições - nada, sem sucesso. É simplesmente não funciona.

Existe alguma coisa que eu poderia tentar fazer funcionar, ou é apenas inútil?


4
2018-02-23 19:11


origem




Respostas:


Parece que sua estrofe EXPECT está incorreta ou não está lá. Upstart está rastreando o pid errado. Veja o livro de receitas para instruções sobre como usar ESPERO. Observe o aviso sobre a importância dessa seção para entender.

Observe que, se seu aplicativo for muito forjado (significando que ele é forjado mais de duas vezes) para que o Upstart rastreie seu pid, você poderá rastreá-lo por conta própria. O aplicativo pode ter um mecanismo para gravar um arquivo pid ou você pode capturá-lo com start-stop-daemon. Vejo esta responda por um exemplo, especificamente o arquivo pg_agent.conf.

Editar:

Observe que, se o Upstart não puder rastrear o pid de seu aplicativo, você não poderá usar o RESPAWN estrofe. Neste caso, o Upstart pode não atender às suas necessidades. Talvez um produto concorrente como forevervai. Não sei.


4
2018-02-25 17:45



Sim. Eu não usei "esperar" a estrofe em tudo. Obrigado! Vou dar uma olhada! - Dmitri
Bem, agora o "start" e o "stop" funcionam, mas o processo 'delayed_job' não está iniciando (de acordo com ps aux | grep "delayed_job"). Eu tentei as duas opções: fork e daemon - não funciona. - Dmitri
O que é contagem de garfos? - Brian.D.Myers
devo contar usando Strace? O que devo fazer se for maior que 2 (deamon)? - Dmitri
Sim, conte com strace. Veja a última frase da minha resposta editada para ideias se for> 2. - Brian.D.Myers