Pourquoi mon service systemd activé ne démarre-t-il pas au démarrage?

20

J'ai le fichier d'unité systemd suivant dans /etc/systemd/system/emacs.service:

[Unit]
Description=Emacs: the extensible, self-documenting text editor
Documentatin=man:emacs(1) info:Emacs


[Service]
Type=forking
ExecStart=/usr/bin/emacs --daemon
ExecStop=/usr/bin/emacsclient --eval "(progn (setq kill-emacs-hook nil) (kill-emacs))"
Restart=always
Environment=DISPLAY=:%i
TimeoutStartSec=0

[Install]
WantedBy=default.target

Je veux que cela démarre au démarrage, donc je suis entré systemctl enable emacs

Cependant, chaque fois que mon service redémarre, systemctl status emacsaffiche:

● emacs.service - Emacs: the extensible, self-documenting text editor
   Loaded: loaded (/etc/systemd/system/emacs.service; disabled; vendor preset: enabled)
   Active: inactive (dead)

Mais la saisie systemctl start emacset la vérification du statut renvoient:

● emacs.service - Emacs: the extensible, self-documenting text editor
   Loaded: loaded (/etc/systemd/system/emacs.service; disabled; vendor preset: enabled)
   Active: active (running) since Fri 2016-11-11 23:03:59 UTC; 4s ago
  Process: 3151 ExecStart=/usr/bin/emacs --daemon (code=exited, status=0/SUCCESS)
 Main PID: 3154 (emacs)
    Tasks: 2
   Memory: 7.6M
      CPU: 53ms
   CGroup: /system.slice/emacs.service
           └─3154 /usr/bin/emacs --daemon

Comment puis-je obtenir ce processus pour démarrer avec succès au démarrage?

Startec
la source

Réponses:

9

Je n'ai aucune idée pourquoi, mais pour que cela fonctionne, je:

supprimé Environment=DISPLAY=:%i

ajouté une User=variable

Assurez-vous que le fichier correct était dans /etc/systemd/system/emacs.service(auparavant, il s'agissait d'un lien dur)

et relance systemctl enable emacs

Cela l'a fait fonctionner.

EDIT Le vrai problème ici est que j'avais une faute de frappe à la ligne 3: Documentatin

J'ai trouvé cela en vérifiant journalctl. Je suggère à quiconque a des problèmes avec un script systemd de faire de même car aucune erreur n'a été envoyée à stderr.

Startec
la source
Cela fonctionne-t-il également lors d'un redémarrage? Je suppose que si le mode démon ne nécessite pas de connexion X11, il n'y a pas besoin de ce que After=...j'ai mentionné.
Alexis Wilke
1
Oui, cela fonctionne après le redémarrage. Ce n'est pas un Emacs graphique donc aucun X11 n'est nécessaire. C'était juste une ligne que j'ai copiée d'un exemple et je n'y ai pas prêté attention.
Startec
3

ooh c'est intéressant.

Choisir une unité de service aléatoire et la regarder, cela dépend d'une cible spécifique au lieu de default.target. Ce dernier est symbolique ... un lien configuré vers une cible spécifique, sémantiquement cela n'a pas de sens. (Voir systemctl set-default)

Cela pourrait expliquer pourquoi votre service s'affiche comme disabledaprès l'avoir activé. Essayez de remplacer default.targetvotre fichier de service par multi-user.target, par exemple.

(Ne pas signaler une erreur lors de l'échec de l'activation semble être un défaut dans systemd. Je me demande presque si vous avez maintenant un répertoire /etc/systemd/system/default.target.wants).

sourcejedi
la source
La commande journalctl vous indique ce qui s'est cassé (pourquoi l'activation a échoué, par exemple.) Quant au lien, il n'est pas requis si vous créez votre propre service personnel. Peu importe si vous créez un package que vous souhaitez que d'autres installent / suppriment, etc.
Alexis Wilke
@AlexisWilke Ce serait encore pire! Pourquoi serait-il écrit pour signaler certaines erreurs à stderr et à d'autres au journal?
sourcejedi
Il écrit tout dans le journal. D'après ce que j'ai vu, vous ne voyez qu'une erreur très basique, spécifique à systemd, si elle ne peut pas démarrer le démon.
Alexis Wilke
2
L'utilisateur n'a pas signalé même une erreur de base, il pensait que l'opération avait réussi et a donc redémarré. à première vue, il y a un défaut dans systemd. Les utilisateurs ont également des modes d'échec, mais cela ne me semblait pas comme si ignorer complètement un message d'erreur était très probable dans cette question.
sourcejedi
1
@sourcejedi Je n'ai aucune idée de comment vous le saviez, mais oui, j'ai maintenant une liste à l' /etc/systemd/system/default.target.wants intérieur qui est mes fichiers de service. Et oui, je ne savais pas qu'il y avait une erreur.
Startec
1

Vous avez une variable d'environnement DISPLAY, cela signifie que vous voulez que X11 soit démarré. Vous devez donc avoir un moyen de bloquer votre service jusque-là.

Cela se fait en utilisant l' After=...option .

Je ne l'ai pas fait moi-même, donc je ne peux pas dire que cela fonctionnerait, mais c'est probablement quelque chose à voir avec graphical.target.

[Unit]
After=graphical.target

Une autre possibilité, si le serveur X ne démarre pas immédiatement (c'est-à-dire que vous avez un écran de connexion avec lightdm ou autre), alors vous devrez peut-être utiliser à la WantedBy=...place:

[Unit]
WantedBy=graphical.target

Si vous en avez assez de le faire fonctionner avec systemd, vous voudrez peut-être examiner la façon habituelle dont les gestionnaires X-Windows le font fonctionner.

Il y a le ~/.xprofilefichier, qui fonctionne comme le ~/.bashrcfichier.

Il y a aussi les ~/.config/autostart/*.desktopfichiers. Il démarrera automatiquement toutes les applications qui y sont définies.

Ces solutions ne sont pas à l'échelle du système, cependant, si vous avez plusieurs utilisateurs, chacun devrait avoir sa propre entrée. En outre, il ne démarre pas l'application en tant que root, mais vous à la place.


En remarque, le message "chargé + inactif (mort)" signifie que systemd a eu du mal à démarrer le processus et a donc décidé de l' abandonner . Vous pouvez tester manuellement le name.servicefonctionnement une fois que vous avez redémarré en utilisant:

systemctl stop <service-name>
systemctl start <service-name>

Cela actualisera l'état et démarrera le service correctement, en supposant que les informations sont correctes. Vous pouvez ensuite vérifier à nouveau l'état pour voir des détails supplémentaires:

 systemctl status <service-name>
Alexis Wilke
la source
2
Hm, j'ai supprimé toute cette ligne et rien n'a changé. En outre, (comme je l'ai dit dans ma question), cela démarre bien en exécutant systemctl start emacs).
Startec
voir ma question mise à jour. J'avais une faute de frappe Documentatin. Votre allusion journalctlm'a aidé ici.
Startec
0

C'est un bogue dans plusieurs fichiers de service de Debian:

# systemctl enable watchdog
Synchronizing state of watchdog.service with SysV init with /lib/systemd/systemd-sysv-install...
Executing /lib/systemd/systemd-sysv-install enable watchdog
# find /etc/systemd/ | grep watch
# tail -n2 /lib/systemd/system/watchdog.service

[Install]

https://www.raspberrypi.org/forums/viewtopic.php?f=82&t=218609&p=1406567#p1406567 https://forum.armbian.com/topic/9115-still-dont-know-where-where-to-report -bugs-watchdogservice-refuse-to-start-due-to-broken-service-file /

Le correctif de niveau de distribution consiste à

echo "WantedBy=default.target" >> /lib/systemd/system/watchdog.service
systemctl daemon-reexec
systemctl enable watchdog
systemctl stop watchdog.service
systemctl start watchdog.service

Il existe de nombreuses alternatives manuelles à cela.

Benoit-Pierre DEMAINE
la source