web-dev-qa-db-fra.com

Afficher stdout / stderr du service systemd

J'ai créé un simple fichier de service systemd pour une application personnalisée. L'application fonctionne bien lorsque je l'exécute manuellement, mais mon processeur est au maximum lorsque je l'exécute avec systemd.

J'essaie de localiser mon problème, mais je ne sais pas où trouver la sortie (ni comment configurer systemd pour mettre la sortie quelque part).

Voici mon dossier de service:

[Unit]
Description=Syncs files with a server when they change
Wants=network.target
After=network.target

[Service]
ExecStart=/usr/local/bin/filesync-client --port 2500
WorkingDirectory=/usr/local/lib/node_modules/filesync-client
Restart=always

[Install]
WantedBy=multi-user.target

Tout au long de l'application, je produis vers stdout et stderr.

Comment lire la sortie de mon démon?

Éditer:

J'ai trouvé man systemd.exec, qui mentionnait le StandardOutput= option, mais je ne sais pas comment l'utiliser. Depuis la page de manuel :

StandardOutput=

Contrôle où le descripteur de fichier 1 (STDOUT) des processus exécutés est connecté. Prend l'un des hérite , null , tty , syslog , kmsg , kmsg + console , syslog + console ou socket .

Si la valeur hérite , le descripteur de fichier de l'entrée standard est dupliqué pour la sortie standard. S'il est réglé sur null , la sortie standard sera connectée à /dev/null, c'est-à-dire que tout ce qui y est écrit sera perdu. S'il est réglé sur tty la sortie standard sera connectée à un tty (tel que configuré via TTYPath=, voir ci-dessous). Si le TTY est utilisé pour la sortie, seul le processus exécuté ne deviendra pas le processus de contrôle du terminal et n'échouera pas ni n'attendra que d'autres processus libèrent le terminal. syslog connecte la sortie standard à l'enregistreur système syslog (3). kmsg le connecte au tampon de journal du noyau qui est accessible via dmesg (1). syslog + console et kmsg + console fonctionnent de manière similaire mais copiez la sortie dans la console système également. socket connecte la sortie standard à un socket à partir de l'activation du socket, la sémantique est similaire à l'option respective de StandardInput=. Par défaut, ce paramètre hérite.

Est-ce à dire que ce sont mes seules options? Je voudrais, par exemple, mettre la sortie dans /dev/shm ou quelque chose. Je suppose que je pourrais utiliser un socket de domaine Unix et écrire un simple écouteur, mais cela semble un peu inutile.

J'ai juste besoin de cela pour le débogage, et je finirai probablement par supprimer la plupart des journaux et changer la sortie en syslog.

196
beatgammit

Mise à jour

Comme le note mikemaccana, le journal systemd est désormais le périphérique de journalisation standard pour la plupart des distributions. Pour afficher les stdout et stderr d'une unité systemd, utilisez la commande journalctl.

Sudo journalctl -u [unit]

Réponse originale

Par défaut, stdout et stderr d'une unité systemd sont envoyés à syslog.

Si vous utilisez le systemd complet, cela sera accessible via journalctl. Sur Fedora, ce devrait être /var/log/messages mais syslog le placera là où vos règles le disent.

En raison de la date de la publication et en supposant que la plupart des personnes exposées à systemd passent par Fedora, vous avez probablement été touché par le bogue décrit ici: https://bugzilla.redhat.com/show_bug.cgi?id = 754938 Il a également une bonne explication de la façon dont tout cela fonctionne =) (Il s'agissait d'un bogue dans selinux-policy qui provoquait la non-journalisation des messages d'erreur et qui a été corrigé dans selinux-policy-3.10.0-58.fc16)

201
Matt

Réponse plus courte, plus simple et non héritée:

Sudo journalctl -u [unitfile]

Où [fichier_unité] est le systemd .service Nom. Par exemple, pour voir les messages de myapp.service,

Sudo journalctl --unit=myapp

Pour suivre les journaux en temps réel:

Sudo journalctl -f -u myapp
90
mikemaccana