Чому моя включена системна послуга не запускається під час завантаження?


20

У мене є такий системний файл блоку /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

Я хочу, щоб це почалося під час завантаження, тому я вступив systemctl enable emacs

Однак кожен раз, коли моя служба перезавантажується, 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)

Але потім введення systemctl start emacsта перевірка статусу повертається:

● 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

Як я можу змусити цей процес успішно запуститися під час завантаження?

Відповіді:


9

Я не маю поняття, чому, але щоб змусити це працювати:

видалено Environment=DISPLAY=:%i

додано User=змінну

Переконайтесь, що в правильному файлі /etc/systemd/system/emacs.service(раніше це було міцне посилання)

і перебіг systemctl enable emacs

Це змусило його працювати.

EDIT Справжня проблема тут полягає в тому, що у мене був друк в рядку 3: Documentatin

Я виявив це, перевіривши journalctl. Я пропоную всім, у кого є проблеми із системним скриптом, зробити те саме, що жодної помилки не було надіслано до stderr.


Це також працює на перезавантаження? Я думаю, якщо режим демона не потребує підключення X11, то для After=...згаданого я не потрібно .
Алексіс Вільке

1
Так, це працює після перезавантаження. Це не графічний Emacs, тому X11 не потрібен. Це був лише рядок, який я скопіював із прикладу і не звернув уваги.
Startec

3

о, це цікаво.

Вибір випадкового сервісного блоку і дивлячись на нього, це залежить від конкретної цілі замість default.target. Останнє символічне ... налаштоване посилання на конкретну ціль, семантично це не має сенсу. (Див. systemctl set-default)

Це може пояснити, чому ваша послуга відображається як disabledпісля її включення. Спробуйте замінити default.targetу службовому файлі multi-user.targetнаприклад, наприклад.

(Якщо не повідомити про помилку при відмовленні, здається дефект у systemd. Мені майже цікаво, чи є у вас зараз каталог /etc/systemd/system/default.target.wants).


Команда journalctl повідомляє вам про те, що зламалось (наприклад, не вдалося включити, наприклад.) Що стосується посилання, воно не потрібно, якщо ви створюєте свою власну персональну службу. Це має значення , якщо ви створюєте пакет , який ви хочете , щоб інші встановити / видалити і т.д.
Алексіс Вільке

@AlexisWilke Це було б ще гірше! Чому було б писати, щоб повідомити про деякі помилки в журнал stderr, а про інші - до журналу?
sourcejedi

Це все пише в журнал. З того, що я бачив, ви бачите лише дуже основну, системну специфічну помилку, якщо вона не могла запустити демон.
Алексіс Вілке

2
Користувач не повідомив навіть про базову помилку, вважав, що операція успішна, і тому перейшла до перезавантаження. за номіналом є дефект у systemd. Користувачі також мають режими відмов, але мені це не звучало, як перегляд повідомлення про помилку повністю був дуже ймовірним у цьому питанні.
sourcejedi

1
@sourcejedi Я не маю уявлення, як ти це знав, але так, тепер у мене /etc/systemd/system/default.target.wants всередині списку є мої сервісні файли. І так, я не здогадувався про помилку.
Startec

1

У вас є змінна середовище DISPLAY, це означає, що ви хочете запустити X11. Тож вам потрібно мати спосіб заблокувати службу до тих пір.

Це робиться за допомогою After=...опції .

Я цього не робив сам, тому не можу сказати, що це спрацювало б, але це, мабуть, щось стосується graphical.target.

[Unit]
After=graphical.target

Інша можливість, якщо X-сервер не запускається негайно (тобто у вас вхідний екран із lightdm або подібним), вам, можливо, доведеться використовувати WantedBy=...замість цього:

[Unit]
WantedBy=graphical.target

Якщо вам набридло змушувати його працювати з systemd, можливо, ви захочете розглянути звичний спосіб, коли менеджери X-Windows змусять його працювати.

Є ~/.xprofileфайл, який працює як ~/.bashrcфайл.

Є також ~/.config/autostart/*.desktopфайли. Він автоматично запустить усі програми, визначені там.

Ці рішення не є загальносистемними, хоча, якщо у вас є кілька користувачів, кожен з них повинен мати свій власний запис. Крім того, він не запускає додаток як root, а ви, замість цього.


Як бічне зауваження, повідомлення "завантажений + неактивний (мертвий)" означає, що системі було важко запустити процес, і в результаті він вирішив відмовитися від нього. Ви можете вручну перевірити, що name.serviceпрацює після перезавантаження, використовуючи:

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

Це оновить статус та запустить послугу належним чином, припускаючи, що інформація правильна. Потім ви можете перевірити стан ще раз, щоб побачити додаткові деталі:

 systemctl status <service-name>

2
Гм, я видалив цілу лінію і нічого не змінилося. Крім того, (як я вже говорив у своєму запитанні) він починається добре, запустивши systemctl start emacs).
Startec

дивіться моє оновлене запитання. У мене був друкарський помилок Documentatin. Ваша підказка про journalctlдопомогу мені тут.
Startec

0

Помилка в декількох файлах служби 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-відмовляється від запуску через файл-файл-сервіс /

Виправлення рівня розподілу до

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

Є багато ручних альтернатив цьому.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.