web-dev-qa-db-fra.com

Comment enregistrer la sortie standard d'un processus lancé par start-stop-daemon?

J'utilise un script init 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 généralement les informations du journal sur sa sortie standard. Autant que je sache, ces données ne sont stockées nulle part.

J'aimerais écrire ou ajouter la sortie standard de $ DAEMON à un fichier quelque part.

La seule solution que je connaisse consiste à dire à start-stop-daemon d'appeler directement un script de shell au lieu de $ DAEMON; le script appelle ensuite $ 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 être une mauvaise façon de résoudre une tâche aussi commune.

114
joeytwiddle

Pour développer la réponse de ypocat, car elle ne me permet pas de 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"

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

En utilisant --startas au lieu de --exec s'assure que le processus sera correctement détecté par son pid et ne démarrera pas par erreur plusieurs instances du démon si start est appelé plusieurs fois. Sinon, start-stop-daemon recherchera un processus/bin/bash et ignorera le processus enfant réel exécutant le démon.

122
stormbeta

Tu as besoin de 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 ou --user, assurez-vous que l'utilisateur peut écrire sur /var/log ou l'existant /var/log/some.log. Le meilleur moyen est de faire en sorte que cet utilisateur possède un /var/log/subdir/ bien que.

46
youurayy

Il semble que vous devriez pouvoir maintenant utiliser le paramètre --no-close Lorsque vous démarrez start-stop-daemon Pour capturer la sortie du démon. Cette nouvelle fonctionnalité est disponible dans le paquet dpkg depuis la version 1.16.5 sur Debian:

Ajoutez une nouvelle option --no-close pour désactiver la fermeture de fds sur --background.

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

40
Stéphane

Avec openrc (qui est la valeur par défaut sous gentoo ou Alpine Linux, par exemple) start-stop-daemon a la -1 et -2 Les options:

-1, --stdout Rediriger stdout vers un fichier

-2, --stderr Rediriger stderr vers un fichier

Donc, vous pouvez simplement écrire:

start-stop-daemon --start --quiet --chuid $DAEMONUSER    \
    --make-pidfile --pidfile $PIDFILE --background       \
    --exec $DAEMON $DAEMON_ARGS -1 $LOGFILE -2 $LOGFILE
11
little-dude

Habituellement start-stop-daemon ferme les descripteurs de fichier standard lors de l'exécution en arrière-plan. De la page de manuel de start-stop-daemon:

-C, --no-close
Ne fermez aucun descripteur de fichier lorsque vous forcez le démon en arrière-plan. Utilisé à des fins de débogage pour afficher la sortie du processus ou pour rediriger les descripteurs de fichier afin de consigner la sortie du processus. Ne concerne que l'utilisation de --background.

Celui-ci a fonctionné pour moi:

    start-stop-daemon -b -C -o -c \ 
         $DAEMON_USER -S -x $DAEMON > $DAEMON_LOG 2>&1
5
Raashid Muhammed

Citer 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 est peut-être le seul moyen de le contourner, est de créer un petit script contenant:

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

puis utilisez ce script comme argument de start-stop-daemon.

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

4
joeytwiddle

Je ne sais pas si "$ DAEMON $ DAEMON_ARGS> /var/log/some.log 2> & 1" fermera jamais le descripteur de fichier du fichier journal ... ce qui signifie que si votre démon est exécuté à tout jamais, je ne suis pas sûr Logrotate ou d’autres mécanismes de nettoyage de l’espace disque fonctionneraient. Comme il s'agit de> au lieu de >>, la commande suggérée tronquerait également les journaux existants au redémarrage. Si vous voulez voir pourquoi le démon est tombé en panne et qu'il redémarre automatiquement, cela risque de ne pas être très utile.

Une autre option pourrait être "$ DAEMON | logger". logger est une commande qui se connecte à syslog (/ var/log/messages). Si vous avez besoin de stderr aussi, je pense que vous pourriez utiliser "$ DAEMON 1> & 2 | logger"

3
nairbv

En supposant que ce soit bash (bien que d'autres obus puissent permettre cela aussi), la ligne:

exec >>/tmp/myDaemon.log

enverra toutes les futures sorties standard dans ce fichier. C'est parce que exec sans nom de programme ne fait que de la magie de la redirection. De la page de manuel bash:

Si la commande n'est pas spécifiée, les redirections prennent effet dans le shell actuel.

La gestion de ce fichier est un autre problème bien sûr.

2
paxdiablo

Que diriez-vous:

Sudo -u myuser -i start-stop-daemon ...
1
jakub.piasecki