J'utilise un script init pour exécuter un processus simple, qui démarre 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. 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 directement un shellscript 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 la mauvaise façon de résoudre une tâche aussi courante.
la source
--start
par--stop
fonctionne réellement.start-stop-daemon --test (...)
ressemblerait l'accompagnement ?>>
au lieu de>
pour ajouter.Tu as besoin de faire:
De plus, si vous utilisez
--chuid
ou--user
, assurez-vous que l'utilisateur peut écrire dans/var/log
ou dans le fichier/var/log/some.log
. Le meilleur moyen est de faire en sorte que cet utilisateur soit propriétaire/var/log/subdir/
.la source
bashPID=$(cat $PIDFILE); [ -n "$bashPID" ] && pkill -P "$bashPID"
pkill
solution aussi. Vous vous demandez ce que ferait... -c "exec $DAEMON..."
(en ajoutant le "exec"). Je n'ai pas ça dans l'assiette en ce moment, je ne peux donc pas l'essayer.Il semble que vous devriez pouvoir utiliser maintenant le
--no-close
paramètre lorsque vous commencezstart-stop-daemon
à capturer la sortie du démon. Cette nouvelle fonctionnalité est disponible dans ledpkg
paquet depuis la version 1.16.5 sur Debian:la source
start-stop-daemon
. Cependant, la version openrc a les options-1
et-2
pour rediriger respectivement stdout et stderr.Avec openrc (qui est la valeur par défaut sur Gentoo ou Alpine Linux par exemple)
start-stop-daemon
a les options-1
et-2
:Vous pouvez donc simplement écrire:
la source
Il n'est pas trop difficile de capturer la sortie du démon et de l'enregistrer dans un fichier:
Cependant, cette solution peut être sous-optimale pour
logrotate
.Il peut être préférable de capturer la sortie dans syslog. Sur Debian, cela correspondrait au comportement des services systemd. La simple tentative suivante de réécriture de l'exemple ci-dessus est erronée car elle laisse derrière elle deux processus sans parent ("zombie") (enregistreur et démon) après avoir arrêté le démon car
start-stop-daemon
ne termine que son enfant mais pas tous les descendants:Pour le faire fonctionner, nous avons besoin d'un wrapper qui termine ses enfants lors de la réception
duende :SIGTERM
destart-stop-daemon
. Il y a quelques:Remarque:
uid=65534
est un utilisateurnobody
.Avantages : cela fonctionne et c'est relativement facile.
démon :Inconvénients : 4 processus (superviseur
duende
, son fork avec des privilèges supprimés (logger)su
et le démon lui-même); obligatoire--chroot
; Si le démon se termine immédiatement (par exemple, une commande invalide),status_of_proc -p $PIDFILE "$DAEMON" "$NAME"
signalez-le comme démarré avec succès.Avantages : 3 (processus superviseur
daemon
,su
et le démon lui - même).Inconvénients : Difficile à gérer en
$PIDFILE
raison de la confusion des options de ligne de commande du démon ; Si le démon se termine immédiatement (par exemple, une commande invalide),status_of_proc -p $PIDFILE "$DAEMON" "$NAME"
signalez-le comme démarré avec succès.pipexec ( le gagnant ):
Avantages : 3 (processus superviseur
pipexec
,logger
et le démon lui - même); Si le démon se termine immédiatement (par exemple, une commande invalide),status_of_proc -p $PIDFILE "$DAEMON" "$NAME"
signalez correctement l'échec.Inconvénients : aucun.
C'est le gagnant - la solution la plus simple et la plus soignée qui semble bien fonctionner.
la source
Ferme généralement
start-stop-daemon
les descripteurs de fichier standard lors de l'exécution en arrière-plan. Depuis la page de manuel destart-stop-daemon
:Celui-ci a fonctionné pour moi:
la source
Citant une ancienne liste de diffusion:
https://lists.ubuntu.com/archives/ubuntu-uk/2005-June/000037.html
la source
Je ne sais pas si "$ DAEMON $ DAEMON_ARGS> /var/log/some.log 2> & 1" fermera un jour le descripteur de fichier pour le fichier journal ... ce qui signifie que si votre démon s'exécute pour toujours, je ne suis pas sûr que logrotate ou d'autres mécanismes de nettoyage de l'espace disque fonctionneraient. Puisqu'il est> au lieu de >>, la commande suggérée tronquerait également les journaux existants au redémarrage. Si vous voulez voir pourquoi le démon a planté et qu'il redémarre automatiquement, cela peut ne pas être très utile.
Une autre option pourrait être "$ DAEMON | logger". logger est une commande qui se connectera à syslog (/ var / log / messages). Si vous avez également besoin de stderr, je pense que vous pouvez utiliser "$ DAEMON 1> & 2 | logger"
la source
>>
est généralement plus appropriée pour les démons, même si cela implique que vous devez maintenant créer une règle logrotate!--no-close ... | logger
ne fonctionne pas pour moi (Debian 7.3, start-stop-daemon 1.16.12). Le script start-stop-daemon ne revient pas, bien que / var / log / messages soit rempli :-). Je l'ai essayé avec et sans1>&2
.En supposant que c'est bash (bien que certains autres shells puissent également le permettre), la ligne:
enverra toutes les futures sorties standard à ce fichier. C'est parce que
exec
sans un nom de programme fait juste de la magie de redirection. Depuis labash
page de manuel:La gestion dudit fichier est bien entendu une autre question.
la source
start-stop-daemon
ligne mentionnée par la question initiale?Que diriez-vous:
la source