web-dev-qa-db-fra.com

Exécuter un processus démon depuis le début

J'exécute mon application sur un VPS sous Ubuntu 12.04 LTS.

Et j'ai un problème avec un processus de démon pour l'une de mes applications. Ce processus s'appelle "delay_job" (s'il n'est pas familier, il ne s'agit que d'un gestionnaire de tâches en arrière-plan).

Le problème avec ce processus est que parfois il est tué (je suppose que c'est parce que j'ai une quantité limitée de RAM sur mon serveur - seulement 1 Go).

Mais le principal problème avec cette chose est qu’il n’est pas capable de redémarrer après un crash ou un signal "kill", contrairement à "Unicorn" (c’est un serveur d’application Rails), qui sont toujours redémarrés, quoi qu’il advienne.

Et oui, cela IS est très important, car de nombreuses fonctionnalités de l'application utilisent des tâches en arrière-plan.

La même chose se passe lorsqu'il y a des travaux de maintenance sur le VPS (initiés par le propriétaire du VPS) et qu'après le redémarrage, le processus "delay_job" n'est plus présent dans le système.

C’est la commande que j’exécute à chaque fois pour l’amorcer: Rails_ENV=production script/delayed_job start

C’est un problème bien connu, mais la seule solution que j’ai trouvée sur Internet est cet article: http://www.alexreisner.com/code/upstart qui suggère d’utiliser la fonctionnalité "upstart" de Linux avec l'option "respawn" capable de redémarrer le processus s'il est tué ou bloqué.

Même si l'article est un peu obsolète, j'ai découvert qu'Ubuntu 12.04 devrait prendre en charge cette fonctionnalité et j'ai créé un lien symbolique dans le répertoire /etc/init (je l'ai appelé: delay_job.conf) vers le "delay_job". "fichier que je mettrais dans l’un de mes dossiers d’applications (app_name/config, pour être exact) - j’ai fait tout ce que dit cet article.

Mon problème est le suivant: lorsque j'essaie de démarrer ce nouveau processus (start delayed_job) dans la console, je reçois:

delayed_job start/running, process 6000

Mais en fait, aucun processus de "tâche retardée" n'est créé.

Et le statut (status delayed_job) du processus initctl est toujours: delayed_job stop/waiting

Après avoir exécuté kill -9 6000 je reçois -bash: kill: (6000) - No such process

Donc, cela signifie que rien n'est exécuté. J'ai essayé de l'exécuter de nombreuses fois dans différentes conditions - rien, rien n'y fait. Est tout simplement ne fonctionne pas.

Y a-t-il quelque chose que je pourrais essayer de faire fonctionner, ou c'est tout simplement inutile?

4
Dmitri

On dirait que votre strophe EXPECT est incorrecte ou absente. Upstart suit le mauvais pid. Consultez le livre de recettes pour savoir comment utiliser EXPECT . Notez l'avertissement sur l'importance de comprendre cette section.

Notez que si votre application est trop forte (c’est-à-dire plus de deux fois) pour que Upstart puisse suivre son pid, vous pourrez peut-être la suivre vous-même. L'application peut avoir un mécanisme pour écrire un fichier pid ou vous pouvez le capturer avec start-stop-daemon. Voir this answer pour un exemple, en particulier le fichier pg_agent.conf.

Modifier:

Notez que si Upstart ne peut pas suivre le pid de votre application, vous ne pourrez pas utiliser la strophe RESPAWN. Dans ce cas, Upstart peut ne pas répondre à vos besoins. Peut-être qu'un produit concurrent comme forever le sera. Je ne sais pas.

4
Brian.D.Myers