Afficher le stdout / stderr du service systemd

178

J'ai créé un fichier de service systemd simple pour une application personnalisée. L'application fonctionne bien lorsque je l'exécute manuellement, mais mon processeur est saturé 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 placer la sortie quelque part).

Voici mon fichier 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, j'ai sorti sur stdout et stderr.

Comment puis-je lire la sortie de mon démon?

Modifier:

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

StandardOutput=

Contrôles auxquels le descripteur de fichier 1 (STDOUT) des processus exécutés est connecté. Prend un des éléments suivants: inherit , null , tty , syslog , kmsg , kmsg + console , syslog + console ou socket .

Si défini pour hériter, le descripteur de fichier d'entrée standard est dupliqué pour la sortie standard. Si défini sur null , la sortie standard sera connectée /dev/null, c'est- à -dire que tout ce qui y est écrit sera perdu. Si réglé sur tty , la sortie standard sera connectée à un tty (comme 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 ou n'attendra pas que d'autres processus libèrent le terminal. Syslog connecte la sortie standard à l'enregistreur système syslog (3). kmsg le connecte à la mémoire tampon du journal du noyau accessible via dmesg (1). syslog + console et kmsg + consolefonctionnent de la même manière, mais copiez également la sortie sur la console système. socket connecte la sortie standard à un socket après l’activation du socket, la sémantique est similaire à l’option correspondante de StandardInput=. Ce paramètre hérite par défaut.

Est-ce que cela signifie que ce sont mes seules options? Je voudrais, par exemple, mettre en sortie /dev/shmou quelque chose. Je suppose que je pourrais utiliser un socket de domaine Unix et écrire un auditeur simple, mais cela semble un peu inutile.

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

beatgammit
la source
Avez-vous essayé de vérifier la /var/log/syslogsortie? La plupart des systèmes vont connecter des éléments /var/log/, je commencerais par vérifier ici. Vous pouvez utiliser greppour rechercher du texte si vous connaissez la sortie: grep "my output" /var/logdevrait faire l'affaire.
sbtkd85
@ sbtkd85 - Eh bien, je n'ai pas /var/log/syslog, mais /var/log/messagesfait le tour. Le problème est que, selon les journaux, mon démon se bloque au démarrage, mais je peux dire qu'il est toujours en cours d'exécution car il dispose d'un serveur HTTP et que je peux l'interroger. Il semble que le reste des bûches se perdent ...
beatgammit
Pourquoi ne pas essayer de régler StandardOutput=ttypour que vous puissiez voir ce qui se passe lorsque vous lancez votre démon. Il devrait sortir le terminal (vous devrez peut-être utiliser ttyS0ou similaire pour obtenir la sortie sur votre écran).
sbtkd85
3
Les opérateurs de redirection IO standard ne devraient pas fonctionner dans ce contexte. Quelque chose commeExecStart=/usr/local/bin/filesync-client --port 2500 2>/tmp/filesync.log
Deepak Mittal
Qu'est-ce qui abuse réellement de votre processeur? Est-ce systemd, votre service ou système (par exemple en créant de nouvelles copies du service parce que systemd est devenu fou)?
Peter

Réponses:

184

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 le stdoutet stderrd'une unité systemd, utilisez la journalctlcommande.

sudo journalctl -u [unit]

Réponse originale

Par défaut stdoutet stderrd'une unité systemd sont envoyés à syslog.

Si vous utilisez le système complet, cela sera accessible via journalctl. Sur Fedora, cela devrait être le cas, /var/log/messagesmais syslog le mettra à la place de vos règles.

En raison de la date de la poste, et en supposant que la plupart des gens qui sont exposés à systemd sont par fedora, vous avez probablement été frappé par le bogue décrit ici: https://bugzilla.redhat.com/show_bug.cgi?id=754938 Il a une bonne explication de la façon dont tout cela fonctionne aussi =) (C'était un bogue dans selinux-policy qui empêchait la journalisation des messages d'erreur et qui était corrigé selinux-policy-3.10.0-58.fc16)

Mat
la source
5
Notez que l'utilisation du mécanisme de journalisation standard comme celui-ci ne crée pas de journaux persistants par défaut. Pour ce faire, vous devez créer / var / log / journal, puis exécutersudo systemctl restart systemd-journald
mlissner
1
Quelle installation syslog et quelle priorité?
jrwren
2
Cela a fonctionné pour moi: StandardOutput=syslog+consoleet StandardError=syslog+consoleaprès que toutes les sorties de mon unité est apparue dans journalctl. Le réglage par défaut était faux apparemment. (Comme DefaultStandardOutput dans /etc/systemd/system.conf)
gregn3
2
-fa été utile pour moi. Suivi du journal au fur et à mesure que les modifications se produisent (cas d'utilisation suivant le serveur minecraft fonctionnant en tant que démon)
blaughw
2
Cela me rend folle ... Sur une extension standard Debian, journal ne m'indique aucune sortie standard. J'utilise même /usr/bin/stdbuf -oL <cmd>et un explicite StandardOutput=journal. Toujours rien.
jlh
83

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

sudo journalctl -u [unitfile]

Où [unitfile] est le .servicenom du système . 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
Mikemaccana
la source
4
Notez que vous pourriez avoir à sudosi vous obtenez une No journal files founderreur.
bigjosh
6
syslog n'est pas un héritage ...
Miles Rout
2
C'est dans les distributions actuelles de Linux. Vous pourriez vraiment aimer syslog mais cela ne change pas le produit livré.
Mikemaccana
1
Sûr. Et il utilise également syslog. Mon point n'était pas que systemd n'est pas utilisé, mais que syslog n'est pas hérité.
labyrinthe
6
@JECompton si toutes les journalisations sur les distributions Linux actuelles utilisent journald et que syslog n'est pas nécessaire et n'est utilisé que pour des raisons de compatibilité, il s'ensuit logiquement que syslog est hérité.
Mikemaccana