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?
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
Si vous utilisez le console output
Stanza , 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)
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.
C'est moche mais jusqu'à présent, le meilleur que j'ai trouvé
eXEC/PATH/TO/SERVER >> /TMP/UPSTART.LOG 2> & 1
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.
Une autre alternative utilise TEE comme:
exec $SERVER 2>&1 | tee /dev/stderr | logger -t myservice
pour obtenir le fichier UPSTART et SYSLOG Sortie