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é viaTTYPath=
, 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 deStandardInput=
. 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/shm
ou 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.
la source
/var/log/syslog
sortie? La plupart des systèmes vont connecter des éléments/var/log/
, je commencerais par vérifier ici. Vous pouvez utilisergrep
pour rechercher du texte si vous connaissez la sortie:grep "my output" /var/log
devrait faire l'affaire./var/log/syslog
, mais/var/log/messages
fait 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 ...StandardOutput=tty
pour que vous puissiez voir ce qui se passe lorsque vous lancez votre démon. Il devrait sortir le terminal (vous devrez peut-être utiliserttyS0
ou similaire pour obtenir la sortie sur votre écran).ExecStart=/usr/local/bin/filesync-client --port 2500 2>/tmp/filesync.log
Réponses:
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
stdout
etstderr
d'une unité systemd, utilisez lajournalctl
commande.Réponse originale
Par défaut
stdout
etstderr
d'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/messages
mais 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
)la source
sudo systemctl restart systemd-journald
StandardOutput=syslog+console
etStandardError=syslog+console
aprè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)-f
a é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)/usr/bin/stdbuf -oL <cmd>
et un expliciteStandardOutput=journal
. Toujours rien.Réponse plus courte, plus simple et non héritée:
Où [unitfile] est le
.service
nom du système . Par exemple, pour voir les messages demyapp.service
,Pour suivre les journaux en temps réel:
la source
sudo
si vous obtenez uneNo journal files found
erreur.