web-dev-qa-db-fra.com

Le travail en amont ne meurt pas correctement

Je fais un simple démon upstart.

Suite à la documentation Upstart [1], je crée le script conf:

description "Super Daemon" 
author "Bastian Baltasar Bux"

start on started dbus
stop on runlevel [06]

expect fork
exec /usr/bin/my-daemon

Le script /usr/bin/my-daemon est une bash qui appelle un python. Les informations du journal de script python dans un fichier/var/log. Sur ce script python, je ne crée qu'un fork. Mais quand je vérifie les fourchettes, comme dit dans le document Upstart [2], la méthode dit que je fais deux fois.

Avec tout cela, le travail de démarrage est exécuté correctement, mais le pid affiché avec le upstart my-daemon status n'est pas le même que celui du fichier journal. L'erreur apparaît lorsque j'essaie d'arrêter de faire status my-daemon stop. Cette commande ne se termine pas, je dois finir avec Crtl-C.

J'ai essayé de changer le expect fork en expect daemon mais l'arrêt du service ne se termine pas non plus.

Quand pourrait être le problème?

[1] http://upstart.ubuntu.com/cookbook

[2] http://upstart.ubuntu.com/cookbook/#id158

2
ssoto

J'ai remarqué que vous avez déjà résolu le problème en corrigeant la ligne exec. Pour les futurs lecteurs, résumons le problème et le correctif.

Problème: L'exécution d'une conversion python à partir d'un script bash à partir d'un travail Upstart ne fait pas l'objet d'un suivi correct.

Problème: expect fork ou expect daemon ne résout pas le problème.

Solution: Corrige le script. Les options:

  • Basculez de exec /usr/bin/my-bash-wrapper vers un appel direct python exec python /path/to/script (comme indiqué dans les commentaires ci-dessus)

  • Corrigez le script bash. Avoir un script bash avec un exemple de contenu de

#!/bin/bash

python /path/to/script

a pour problème python d'être exécuté séparément de bash avec un nouvel identifiant de processus. Ainsi, Upstart l'ignore car il s'agit simplement d'une commande parentée par le script Bash. L'ajout de expect daemon n'aide pas, car il est ignoré en premier lieu.

L'utilisation du script bash est possible de la même manière que vous l'avez corrigée dans le script Upstart. Si vous préfixez python avec exec, le python est exécuté avec le même PID que bash, suivi par Upstart. Ensuite, expect fork intercepte le fork () dans le script Python, et Upstart suit avec plaisir le bon processus.

Donc, en utilisant un wrapper bash de:

#!/bin/bash

exec python /path/to/script

fait la même chose.

6
Tuminoid