123 votes

Comment puis-je enregistrer le stdout d'un processus lancé par start-stop-daemon ?

J'utilise un init script pour exécuter un processus simple, qui est lancé avec :

start-stop-daemon --start --quiet --chuid $DAEMONUSER    \
    --make-pidfile --pidfile $PIDFILE --background       \
    --exec $DAEMON $DAEMON_ARGS

Le processus appelé $DAEMON imprime habituellement les informations du journal sur sa sortie standard. Pour autant que je sache, ces données ne sont stockées nulle part.

Je voudrais écrire ou ajouter le stdout de $DAEMON à un fichier quelque part.

La seule solution que je connaisse est de dire à start-stop-daemon d'appeler un shellscript au lieu de $DAEMON directement ; le script appelle alors $DAEMON et écrit dans le fichier journal. Mais cela nécessite un script supplémentaire qui, comme la modification du démon lui-même, semble la mauvaise façon de résoudre une tâche aussi commune.

132voto

stormbeta Points 176

Pour développer la réponse d'ypocat, puisque le système ne me laisse pas commenter :

start-stop-daemon --start --quiet --chuid $DAEMONUSER    \
 --make-pidfile --pidfile $PIDFILE --background       \
 --startas /bin/bash -- -c "exec $DAEMON $DAEMON_ARGS > /var/log/some.log 2>&1"

Utilisation de exec pour exécuter le démon permet à stop d'arrêter correctement le processus enfant au lieu du parent bash.

Utilisation de --startas au lieu de --exec assure que le processus sera correctement détecté par son pid et ne lancera pas par erreur plusieurs instances du démon si start est appelé plusieurs fois. Sinon, start-stop-daemon cherchera un processus /bin/bash et ignorera le processus enfant réel qui exécute le démon.

2 votes

C'est une bien meilleure solution que celle de @ypocat, principalement parce que le fait d'arrêter à nouveau le démon en remplaçant --start con --stop fonctionne réellement.

0 votes

J'ai essayé d'exécuter cette commande depuis rc.local au lieu de init.d... Je ne semble pas obtenir les mêmes résultats. Cependant, lorsque je l'exécute à partir d'un shell via SSH, cela fonctionne comme un charme !

0 votes

Merci mon pote ! Maintenant le fichier pidfile se réfère au processus daemon itselt, pas au processus parent Bash !

47voto

ypocat Points 871

Vous devez le faire :

start-stop-daemon --start --quiet --chuid $DAEMONUSER    \
    --make-pidfile --pidfile $PIDFILE --background       \
    --exec /bin/bash -- -c "$DAEMON $DAEMON_ARGS > /var/log/some.log 2>&1"

Aussi, si vous utilisez --chuid o --user pour s'assurer que l'utilisateur peut écrire sur /var/log ou l'existant /var/log/some.log . La meilleure façon de procéder est de faire en sorte que cet utilisateur possède une /var/log/subdir/ cependant.

1 votes

Fantastique, merci ypocat. Aujourd'hui, en plus de sauvegarder le journal, j'avais besoin d'exécuter un script non binaire que --exec n'autorise pas mais votre astuce contourne le problème !

8 votes

Le mauvais côté ... arrêter le service tue bash, mais pas le processus enfant que bash a démarré ! (Dans mon cas, DAEMON=coffee).

1 votes

J'ai contourné ce problème en tuant tous les processus enfants du processus bash au début de do_stop. bashPID=$(cat $PIDFILE); [ -n "$bashPID" ] && pkill -P "$bashPID"

41voto

Stéphane Points 1358

Il semble que vous devriez être en mesure d'utiliser maintenant la fonction --no-close lors du démarrage start-stop-daemon pour capturer la sortie du démon. Ce site nouvelle fonction est disponible dans le dpkg depuis la version 1.16.5 sur Debian :

Ajout d'une nouvelle option --no-close pour désactiver la fermeture des fds sur --background.

Cela permettait à l'appelant de voir les messages du processus à des fins de débogage ou de rediriger les descripteurs de fichiers vers des fichiers journaux. débogage, ou de pouvoir rediriger les descripteurs de fichiers vers des fichiers journaux, syslog ou autre.

8 votes

C'est dommage qu'il ne soit pas disponible dans Ubuntu 12.04 :(

0 votes

Je n'arrive pas à faire fonctionner ce --no-close... la sortie va toujours vers le shell à partir duquel j'exécute le init.d script :(

0 votes

+1 Fonctionne parfaitement sur Debian Squeeze avec un service node.js démonisé.

4voto

joeytwiddle Points 3226

Citation d'une ancienne liste de diffusion :

https://lists.ubuntu.com/archives/ubuntu-uk/2005-June/000037.html

Un moyen facile -- et si vous voulez utiliser start-stop-daemon peut-être le seul -- de contourner est de créer un petit script contenant :

#!/bin/sh
exec /home/boinc/boinc/boinc > /home/boinc/log/boinc.log

et ensuite utiliser ce script comme argument à start-stop-daemon.

La vraie question est peut-être de savoir s'il est vraiment nécessaire d'utiliser la fonction start-stop-daemon en premier lieu ?

3voto

Brian Points 1265

Je ne suis pas sûr que "$DAEMON $DAEMON_ARGS > /var/log/some.log 2>&1" ferme le descripteur de fichier pour le fichier de log... ce qui signifie que si votre daemon tourne en permanence, je ne suis pas sûr que logrotate ou d'autres mécanismes pour nettoyer l'espace disque fonctionnent. Puisque c'est > au lieu de >>, la commande suggérée tronquerait également les journaux existants au redémarrage. Si vous voulez savoir pourquoi le démon s'est planté, et qu'il redémarre automatiquement, cela pourrait ne pas être très utile.

Une autre option pourrait être "$DAEMON | logger". logger est une commande qui va enregistrer dans syslog (/var/log/messages). Si vous avez également besoin de stderr, je pense que vous pouvez utiliser "$DAEMON 1>&2 | logger".

0 votes

Vous avez raison, en utilisant >> est généralement plus approprié pour les démons, bien que cela implique que vous devriez maintenant créer une règle logrotate !

0 votes

Comme pour l'espace disque, les méthodes qui tronqué le fichier récupérera l'espace immédiatement (au moins sous les systèmes de fichiers ext). Mais attention aux méthodes qui ne font que supprimer un fichier en cours d'écriture : l'espace ne sera pas récupéré tant que le handle ne sera pas libéré, et que vous ne pourrez plus trouver le nœud du fichier pour le tronquer manuellement !

0 votes

@joeytwiddle Une partie de mon point de vue ici est qu'il y a des situations où logrotate échouera à faire tourner les journaux si le handle du fichier n'est jamais fermé.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X