Warum startet mein aktivierter systemd-Dienst nicht beim Booten?

20

Ich habe die folgende System-Unit-Datei in /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

Ich möchte, dass dies beim Booten beginnt, also habe ich eingegeben systemctl enable emacs

Bei jedem Neustart meines Dienstes wird jedoch Folgendes angezeigt systemctl status emacs:

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

Dann geben Sie systemctl start emacsden Status ein und überprüfen ihn.

● 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

Wie kann ich erreichen, dass dieser Prozess beim Booten erfolgreich gestartet wird?

Startec
quelle

Antworten:

9

Ich habe keine Ahnung warum, aber um dies zum Laufen zu bringen:

gelöscht Environment=DISPLAY=:%i

eine User=Variable hinzugefügt

Stellen Sie sicher, dass die richtige Datei vorhanden ist /etc/systemd/system/emacs.service(früher war es ein fester Link)

und lief wieder systemctl enable emacs

Das hat funktioniert.

BEARBEITEN Das eigentliche Problem hier ist, dass ich in Zeile 3 einen Tippfehler hatte: Documentatin

Ich habe das durch Überprüfen herausgefunden journalctl. Ich empfehle jedem, der Probleme mit einem systemd-Skript hat, dasselbe zu tun, da kein Fehler an stderr gesendet wurde.

Startec
quelle
Funktioniert das auch bei einem Neustart? Ich vermute, wenn der Daemon-Modus keine X11-Verbindung erfordert, dann gibt es keine Notwendigkeit für das, was After=...ich erwähnt habe.
Alexis Wilke
1
Ja, es funktioniert nach dem Neustart. Dies ist kein grafischer Emacs, daher wird kein X11 benötigt. Das war nur eine Zeile, die ich aus einem Beispiel kopiert und nicht beachtet habe.
Startec
3

Oh, das ist interessant.

Wenn Sie eine zufällige Wartungseinheit auswählen und darauf starren, hängt dies von einem bestimmten Ziel ab default.target. Letzteres ist symbolisch ... eine konfigurierte Verknüpfung zu einem bestimmten Ziel, semantisch macht es keinen Sinn. (Siehe systemctl set-default)

Dies könnte erklären, warum Ihr Dienst so angezeigt wird, wie disablednachdem Sie ihn aktiviert haben. Ersetzen Sie default.targetin Ihrer Servicedatei multi-user.targetbeispielsweise durch.

(Einen Fehler nicht zu melden, wenn die Aktivierung fehlschlägt, scheint ein Fehler in systemd zu sein. Ich frage mich fast, ob Sie jetzt ein Verzeichnis haben. /etc/systemd/system/default.target.wants)

sourcejedi
quelle
Mit dem Befehl journalctl erfahren Sie, was defekt ist (z. B. warum die Aktivierung fehlgeschlagen ist). Für den Link ist es nicht erforderlich, wenn Sie einen eigenen persönlichen Service erstellen. Es spielt keine Rolle, ob Sie ein Paket erstellen, das andere installieren / entfernen sollen, usw.
Alexis Wilke,
@AlexisWilke Das wäre noch schlimmer! Warum sollte es geschrieben werden, um einige Fehler an stderr und andere an die Zeitschrift zu melden?
Sourcejedi
Es schreibt alles ins Tagebuch. Nach allem, was ich gesehen habe, wird nur ein sehr grundlegender, systemspezifischer Fehler angezeigt, wenn der Dämon nicht gestartet werden konnte.
Alexis Wilke
2
Der Benutzer hat nicht einmal einen grundlegenden Fehler gemeldet. Er war der Ansicht, dass der Vorgang erfolgreich war, und fuhr daher mit dem Neustart fort. Zum Nennwert liegt ein Defekt in systemd vor. Benutzer haben auch Fehlermodi, aber es klang für mich nicht so, als wäre es in dieser Frage sehr wahrscheinlich, eine Fehlermeldung komplett zu übersehen.
Sourcejedi
1
@sourcejedi Ich habe keine Ahnung, woher Sie das wissen, aber ja, ich habe jetzt eine Auflistung unter /etc/systemd/system/default.target.wants Inside, die meine Servicedateien enthält. Und ja, ich hatte keine Ahnung, dass ein Fehler vorliegt.
Startec
1

Sie haben eine DISPLAY-Umgebungsvariable, dh Sie möchten, dass X11 gestartet wird. Sie müssen also eine Möglichkeit haben, Ihren Dienst bis dahin zu blockieren.

Dies erfolgt über die After=...Option .

Ich habe es nicht selbst gemacht, daher kann ich nicht sagen, dass es funktionieren würde, aber es hat wahrscheinlich etwas damit zu tun graphical.target.

[Unit]
After=graphical.target

Eine andere Möglichkeit, wenn der X-Server nicht sofort startet (dh Sie haben einen Anmeldebildschirm mit lightdm oder so), müssen Sie möglicherweise WantedBy=...stattdessen Folgendes verwenden :

[Unit]
WantedBy=graphical.target

Wenn Sie es satt haben, systemd zum Laufen zu bringen, sollten Sie sich die gewohnte Funktionsweise von X-Windows-Managern ansehen.

Es gibt die ~/.xprofileDatei, die wie die ~/.bashrcDatei funktioniert .

Es gibt auch die ~/.config/autostart/*.desktopDateien. Es wird automatisch gestartet, welche Anwendungen dort definiert sind.

Diese Lösungen sind nicht systemweit, wenn Sie jedoch mehrere Benutzer haben, muss jeder einen eigenen Eintrag haben. Außerdem wird die Anwendung nicht als root gestartet, sondern stattdessen als Sie.


Als Randnotiz bedeutet die Meldung "Loaded + Inactive (Dead)", dass Systemd Schwierigkeiten hatte, den Prozess zu starten, und als Folge davon entschied es sich , ihn abzubrechen . Sie können manuell testen, ob das name.servicefunktioniert, sobald Sie neu gestartet haben:

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

Dadurch wird der Status aktualisiert und der Dienst ordnungsgemäß gestartet, sofern die Informationen korrekt sind. Anschließend können Sie den Status erneut überprüfen, um weitere Details anzuzeigen:

 systemctl status <service-name>
Alexis Wilke
quelle
2
Hm, ich habe die ganze Zeile gelöscht und nichts geändert. Auch (wie ich in meiner Frage sagte), startet es gut durch Ausführen von Systemctl Start Emacs).
Startec
Siehe meine aktualisierte Frage. Ich hatte einen Tippfehler Documentatin. Ihr Hinweis über journalctlhat mir hier geholfen.
Startec
0

Es ist ein Fehler in mehreren Service-Dateien von 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-to-report -bugs-watchdogservice-weigert sich-wegen-defekter-Service-Datei-zu-starten /

Das Update für die Verteilungsebene lautet

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

Es gibt viele manuelle Alternativen dazu.

Benoit-Pierre DEMAINE
quelle