web-dev-qa-db-fra.com

Enregistrement d'une sortie de démon avec UPSTART

J'ai un démon personnalisé géré par UpStart sur mon serveur Ubuntu. Cela fonctionne parfaitement, sauf que je dois capturer (log) la sortie du démon. La page officielle de Stanzas dit que je peux utiliser console logged Pour ce faire, mais quel fichier se connecte-t-il?

J'ai aussi lu que console logged est n'est plus une strophe valide . J'utilise actuellement 0.3.9 (Hardy) mais passera à 0,6.x (lucide) dans quelques mois. Si console logged En fait ne fonctionnera pas avec des versions ultérieures, qu'est-ce que j'utilise à la place?

34
Alex Reisner

Pour les versions d'Ubuntu récentes (12.04+), utilisez simplement

console log

Et la sortie du démon (stdout et stardr) sera annexée à /var/log/upstart/<service>.log

http://upstart.ubuntu.com/cookbook/#console-log

31
Willem

Si vous utilisez le console outputStanza , puis tuyez la sortie de votre script à logger (l'interface de commande shell sur le module de journal du système Syslog (3)) alors cela fonctionnera.

Par exemple

console output
exec /my/script | logger

va se connecter à /var/log/messages

Par exemple

console output
exec /my/script | logger -t my-script

va se connecter à /var/log/messages et taglez chaque message avec my-script

logger --help Pour les options d'utilisation de l'enregistreur.

(Je suis sur l'Amazon Linux Ami, qui est Centos 5.x basé; YMMV)

11
Peter Mounce

Je n'ai pas eu le mkfifo astuce pour travailler de manière satisfaisante; Il ne semblait pas capturer Sterrr et tente de rediriger causé la caution sans faute.

Il a également un effet secondaire malheureux de la fabrication du processus logger suspendre comme un enfant de init, de sorte que les informations sur qui "possèdent" l'enregistreur est perdue et que quiconque n'est pas déjà conscient de mkfifo pourrait supposer que c'est un processus pendant qui peut être tué.

Au lieu de cela, j'ai fini par la solution suivante, qui résout tous ces problèmes. Il provoque logger de devenir un processus enfant, tout en préservant le service comme processus racinaire. Malheureusement, il faut exécuter bash, mais ça -regarde sale.

script
  # ... setup commands here, e.g. environment, cd, ...
  exec bash <<EOT
    exec 1> >(logger -t myservice) 2>&1
    exec myservice
EOT
end script

Cela utilise une astuce qui redirige stdout et stardr à une commande. Étant donné que nous exécrochons le service à l'intérieur de la commande bash__, cela a l'effet secondaire du remplacement de la coque et de la fabrication magique de devenir un processus d'enfant du service, comme indiqué par ps aufxw:

myservice 
 \_ bash -c exec 1> >(logger -t myservice) 2>&1 && exec myservice
    \_ logger -t myservice

Pour une raison quelconque, la commande ci-dessus doit être enveloppée dans un bash -c. Je suppose que cela est parce que UPSTART ne prétend que diriger votre script via Bash, mais n'est pas réellement. Si quelqu'un peut suggérer un moyen d'éviter la coque de bash supplémentaire, ce serait génial.

10
Alexander Staubo

C'est moche mais jusqu'à présent, le meilleur que j'ai trouvé

eXEC/PATH/TO/SERVER >> /TMP/UPSTART.LOG 2> & 1

6
Jorge Vargas

Vous pouvez également rediriger la sortie sur Syslog, par exemple.

exec $SERVER 2>&1 | logger -t myservice -p local0.info

Cependant, le pipeline peut entraîner une confusion au PID du processus de journalisation avec le PID du démon.

3
Nikratio

Une autre alternative utilise TEE comme:

exec $SERVER 2>&1 | tee /dev/stderr | logger -t myservice

pour obtenir le fichier UPSTART et SYSLOG Sortie

1
perl