Почему моя включенная служба systemd не запускается при загрузке?


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

Это заставило это работать.

РЕДАКТИРОВАТЬ Настоящая проблема здесь в том, что у меня была опечатка в строке 3: Documentatin

Я нашел это, проверив journalctl. Я предлагаю всем, у кого есть проблемы со сценарием systemd, сделать то же самое, поскольку в 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 сообщает вам, что сломалось (например, почему не удалось включить). Что касается ссылки, она не требуется, если вы создаете свой собственный персональный сервис. Имеет значение, создаете ли вы пакет, который вы хотите, чтобы другие устанавливали / удаляли и т. Д.
Alexis Wilke

@AlexisWilke Это было бы еще хуже! Зачем писать об ошибках в stderr, а о других - в журнал?
Sourcejedi

Все пишет в журнал. Из того, что я видел, вы видите очень простую системную ошибку, только если он не может запустить демон.
Алексис Вилке

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

1
@sourcejedi Я понятия не имею, как вы узнали об этом, но да, у меня теперь есть список в /etc/systemd/system/default.target.wants Inside, который является моими служебными файлами. И да, я понятия не имел, что произошла ошибка.
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, а как вы.


Как примечание: сообщение «загружен + неактивен (мертв)» означает, что systemd было трудно запустить процесс, и в результате он решил отказаться от него. Вы можете вручную проверить, что 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.