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.
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.
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.
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.
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
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
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?
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"
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.
Que diriez-vous:
Sudo -u myuser -i start-stop-daemon ...