Dlaczego moja włączona usługa systemowa nie uruchamia się podczas uruchamiania?

20

Mam następujący plik jednostki systemowej w /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

Chcę, żeby to się zaczęło przy starcie, więc weszłam systemctl enable emacs

Jednak za każdym razem, gdy moja usługa uruchamia się ponownie, systemctl status emacspokazuje:

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

Ale następnie wprowadzenie systemctl start emacsi sprawdzenie statusu zwraca:

● 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

Jak mogę uzyskać ten proces, aby pomyślnie uruchomić przy rozruchu?

Startec
źródło

Odpowiedzi:

9

Nie mam pojęcia dlaczego, ale żeby to zadziałało:

usunięte Environment=DISPLAY=:%i

dodano User=zmienną

Upewnij się, że znajduje się właściwy plik /etc/systemd/system/emacs.service(wcześniej był to twardy link)

i ponownie pobiegł systemctl enable emacs

Dzięki temu działało.

EDYCJA Prawdziwy problem polega na tym, że miałem literówkę w linii 3: Documentatin

Znalazłem to, sprawdzając journalctl. Sugeruję, aby każdy, kto ma problemy ze skryptem systemowym, zrobił to samo, ponieważ nie wysłano błędu do stderr.

Startec
źródło
Czy to działa również przy ponownym uruchomieniu? Myślę, że jeśli tryb demona nie wymaga połączenia X11, to nie ma potrzeby, o której After=...wspomniałem.
Alexis Wilke,
1
Tak, działa po ponownym uruchomieniu. To nie jest graficzny Emacs, więc nie jest potrzebny X11. To był tylko wiersz, który skopiowałem z przykładu i nie zwróciłem uwagi.
Startec
3

och to jest interesujące.

Wybór losowej jednostki usługowej i wpatrzenie się w nią zależy od konkretnego celu zamiast default.target. To drugie jest symboliczne ... skonfigurowane łącze do określonego celu, semantycznie nie ma sensu. (Patrz systemctl set-default)

To może wyjaśniać, dlaczego usługa wyświetla się disabledpo włączeniu. Spróbuj zastąpić default.targetw pliku usługi multi-user.targetna przykład.

(Niezgłaszanie błędu przy niepowodzeniu włączenia wydaje się być defektem w systemie. Prawie zastanawiam się, czy masz teraz katalog /etc/systemd/system/default.target.wants).

sourcejedi
źródło
Komenda journalctl informuje, co się zepsuło (np. Dlaczego włączenie nie powiodło się.) Jeśli chodzi o link, nie jest wymagane, jeśli tworzysz własną usługę osobistą. Nie ma znaczenia, jeśli utworzysz pakiet, który chcesz, aby inni instalowali / usuwali itp.
Alexis Wilke,
@AlexisWilke To byłoby jeszcze gorsze! Dlaczego napisano by o zgłaszaniu niektórych błędów do stderr, a innych do dziennika?
sourcejedi
Zapisuje wszystko do dziennika. Z tego, co widziałem, widzisz tylko bardzo podstawowy, specyficzny dla systemu błąd, tylko jeśli nie mógł uruchomić demona.
Alexis Wilke,
2
użytkownik nie zgłosił nawet podstawowego błędu, wierzyli, że operacja się powiodła, i dlatego uruchomił się ponownie. według wartości nominalnej istnieje defekt w systemd. Użytkownicy mają również tryby awarii, ale nie brzmiało to dla mnie tak, jakby całkowicie przeoczenie komunikatu o błędzie było bardzo prawdopodobne w tym pytaniu.
sourcejedi
1
@sourcejedi Nie mam pojęcia, skąd to wiedziałeś, ale tak, teraz mam listę w /etc/systemd/system/default.target.wants Inside, czyli moje pliki usług. I tak, nie miałem pojęcia, że ​​wystąpił błąd.
Startec
1

Masz zmienną środowiskową DISPLAY, co oznacza, że ​​chcesz uruchomić X11. Do tego czasu musisz mieć sposób na zablokowanie usługi.

Odbywa się to za pomocą na After=...opcję .

Nie zrobiłem tego sam, więc nie mogę powiedzieć, że to zadziała, ale prawdopodobnie ma to coś wspólnego graphical.target.

[Unit]
After=graphical.target

Inna możliwość, jeśli serwer X nie uruchomi się natychmiast (tzn. Masz ekran logowania z lightdm lub podobny), możesz WantedBy=...zamiast tego użyć :

[Unit]
WantedBy=graphical.target

Jeśli masz już dość pracy z systememd, możesz przyjrzeć się zwykłemu sposobowi działania menedżerów X-Windows.

Jest ~/.xprofileplik, który działa jak ~/.bashrcplik.

Są też ~/.config/autostart/*.desktoppliki. Automatycznie uruchomi się wszystkie zdefiniowane tam aplikacje.

Rozwiązania te nie obejmują całego systemu, jednak w przypadku wielu użytkowników każdy z nich musiałby mieć własny wpis. Ponadto nie uruchamia aplikacji jako root, ale Ty.


Na marginesie, komunikat „załadowany + nieaktywny (martwy)” oznacza, że ​​systemd miał trudności z uruchomieniem procesu i w rezultacie postanowił go porzucić . Możesz ręcznie przetestować, czy name.servicedziała po ponownym uruchomieniu, używając:

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

Spowoduje to odświeżenie statusu i prawidłowe uruchomienie usługi, przy założeniu, że informacje są prawidłowe. Następnie możesz ponownie sprawdzić status, aby zobaczyć dodatkowe szczegóły:

 systemctl status <service-name>
Alexis Wilke
źródło
2
Hm, usunąłem całą linię i nic się nie zmieniło. Ponadto (jak powiedziałem w moim pytaniu) zaczyna się dobrze od uruchomienia systemctl start emacs).
Startec
zobacz moje zaktualizowane pytanie. Miałem literówkę Documentatin. Twoja wskazówka na temat journalctlpomogła mi tutaj.
Startec
0

Jest to błąd w kilku plikach serwisowych Debiana:

# 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-odmawia uruchomienia ze względu na uszkodzony plik usługi /

Poprawka poziomu dystrybucji to

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

Istnieje wiele ręcznych alternatyw tego rozwiązania.

Benoit-Pierre DEMAINE
źródło