J'ai un démon personnalisé qui est géré par upstart sur mon serveur Ubuntu. Cela fonctionne parfaitement sauf que je dois capturer (consigner) la sortie du démon. La page des strophes officielles indique que je peux utiliser console logged
cette méthode, mais dans quel fichier se connecte-t-elle?
J'ai aussi lu que console logged
est plus une strophe valide . J'utilise actuellement la version 0.3.9 (Hardy), mais je passerai à la version 0.6.x (Lucid) dans quelques mois. Si, console logged
en fait, ne fonctionne pas avec les versions ultérieures, que dois-je utiliser à la place?
Réponses:
Cet extrait dirigera la sortie de votre service dans le consignateur, tout en vous permettant d'exécuter le processus de service (remplaçant ainsi le processus shell), de manière à éviter toute confusion. Il s'assure également que le processus de journalisation est reparented to init, de sorte qu'il ne s'agit pas d'un enfant de votre service et qu'il évite de rester inactif dans le système de fichiers, même s'il doit créer un fifo temporairement.
Voici comment cela fonctionne:
mkfifo /tmp/myservice-log-fifo
fait simplement le fichier spécial fifo (aka pipe). Tapezman 7 fifo
pour plus d'informations.( logger ... </tmp/myservice-log-fifo & )
commence la lecture de l'enregistreur à partir du fifo, en arrière-plan. Les parens font en sorte que le processus de journalisation soit reparented to init, plutôt que de rester un enfant du processus shell en cours.exec >/tmp/myservice-log-fifo
redirige la sortie standard du shell actuel vers le fifo. Nous avons maintenant un descripteur de fichier ouvert pour ce fifo, et nous n’avons plus besoin de l’entrée du système de fichiers ...rm /tmp/myservice-log-fifo
alors on va l'enlever.exec myservice 2>/dev/null
exécute simplement le service de la manière habituelle. Stdout va déjà au fifo et cela ne changera pas quand le nouveau programme sera exécuté.UPDATE:
set -e
n'est pas nécessaire car Upstart exécute les scripts avec cette option par défaut (voir http://upstart.ubuntu.com/cookbook/#develop-scripts-using-bin-sh )la source
set -e
?set -e
provoque la fermeture immédiate du script en cas d'échec d'une commande. Sans cette ligne, le script continuerait à exécuter les commandes suivantes inutilement (et peut-être dangereusement).exec 2>&1
au-dessus de larm
ligne et supprimez-le2>/dev/null
de la dernière ligne.Pour les versions récentes d’Ubuntu (12.04+), utilisez simplement
Et la sortie du démon (STDOUT & STDERR) sera ajoutée à
/var/log/upstart/<service>.log
http://upstart.ubuntu.com/cookbook/#console-log
la source
Si vous utilisez la
console output
strophe , puis dirigez la sortie de votre script verslogger
(l'interface de commande shell vers le module de journal système syslog (3)), cela fonctionnera.Par exemple
se connecter à
/var/log/messages
Par exemple
se connecter à
/var/log/messages
et marquer chaque message avecmy-script
logger --help
pour les options d'utilisation de l'enregistreur.(Je suis sur l'AMI Amazon Linux, basée sur Centos 5.x; YMMV)
la source
logger
, pas sur le processus que vous souhaitez réellement gérer.Je n'ai pas eu l'
mkfifo
astuce pour travailler de manière satisfaisante; il n'a pas semblé capturer stderr et les tentatives de redirection ont amené Upstart à se libérer sans erreur.Cela a également un effet secondaire malheureux: le
logger
processus est suspendu en tant qu'enfantinit
. Ainsi, les informations sur le propriétaire de l'enregistreur sont perdues, et quiconque n'est pas déjà au courantmkfifo
peut supposer qu'il peut s'agir d'un processus en suspens.Au lieu de cela, je me suis retrouvé avec la solution suivante, qui résout tous ces problèmes. Il en résulte
logger
un processus enfant tout en préservant le service en tant que processus racine. Malheureusement, il faut exécuterbash
, mais ça a l' air sale.Cela utilise une astuce qui redirige stdout et stderr vers une commande. Comme nous exécutons le service dans la
bash
commande, cela a pour effet secondaire de remplacer le shell et de faire de bash, comme par magie, un processus enfant du service, comme indiqué parps aufxw
:Pour une raison quelconque, la commande ci-dessus doit être encapsulée dans un
bash -c
. Je suppose que c'est parce qu'Uststart prétend seulement exécuter votre script via Bash, mais ce n'est pas le cas. Si quelqu'un pouvait suggérer un moyen d'éviter le shell extra bash, ce serait génial.la source
exec bash -l << EOF
perdre là-bas.C'est moche mais jusqu'à présent le meilleur que j'ai trouvé
exec / path / to / server >> /tmp/upstart.log 2> & 1
la source
Vous pouvez également rediriger la sortie vers syslog, par exemple
Cependant, le pipeline peut amener Upstart à confondre le PID du processus de journalisation avec le PID du démon.
la source
expect fork
ou laexpect daemon
strophe. Ou vous pouvezcat
insérer le fichier pid dans le message du journal sinon, je suppose.Une autre alternative est d'utiliser un tee comme:
obtenir à la fois le fichier upstart et la sortie syslog
la source