부팅 시 활성화된 시스템 서비스가 시작되지 않는 이유는 무엇입니까?

부팅 시 활성화된 시스템 서비스가 시작되지 않는 이유는 무엇입니까?

다음과 같은 시스템 단위 파일이 있습니다 /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

부팅 시 이 프로세스를 성공적으로 시작하려면 어떻게 해야 합니까?

답변1

이유는 모르겠지만 제대로 작동하도록 하려면 다음을 수행합니다.

삭제됨Environment=DISPLAY=:%i

User=변수 를 추가했습니다

올바른 파일이 있는지 확인하십시오 /etc/systemd/system/emacs.service(하드 링크 이전).

그리고 재실행systemctl enable emacs

이렇게 하면 작동합니다.

편집하다 여기서 진짜 문제는 3행에 오타가 있다는 것입니다. Documentatin

를 확인하면서 알게 되었습니다 journalctl. stderr에 오류가 전송되지 않으므로 systemd 스크립트에 문제가 있는 사람이라면 누구나 동일한 작업을 수행하는 것이 좋습니다.

답변2

DISPLAY 환경 변수가 있습니다. 이는 X11을 시작한다는 의미입니다. 따라서 그때까지는 서비스를 차단할 수 있는 방법이 필요합니다.

이는 다음을 사용하여 수행됩니다.After=...옵션.

제가 직접 해본 적이 없어서 효과가 있을 것이라고는 말씀드릴 수 없지만 graphical.target.

[Unit]
After=graphical.target

또 다른 가능성은 X 서버가 즉시 시작되지 않으면(예: lightdm 등의 로그인 화면이 있는 경우) 다음을 사용해야 할 수도 있다는 것입니다.WantedBy=...대신에:

[Unit]
WantedBy=graphical.target

systemd로 작업하는 데 지쳤다면 X-Windows 관리자가 작업을 수행하는 일반적인 방법을 살펴보고 싶을 수도 있습니다.

~/.xprofile파일 처럼 작동하는 파일이 있습니다 ~/.bashrc.

문서 도 있습니다 ~/.config/autostart/*.desktop. 정의된 모든 응용 프로그램이 자동으로 시작됩니다.

그러나 이러한 솔루션은 시스템 전체에 적용되지 않으며, 사용자가 여러 명인 경우 각 사용자는 자신만의 항목을 가지고 있어야 합니다. 또한 응용 프로그램을 루트로 시작하지 않고 사용자로 응용 프로그램을 시작합니다.


참고로 "loaded + inactive (dead)" 메시지는 systemd가 프로세스를 시작하는 데 어려움을 겪었음을 의미하므로 결정되었습니다.포기하다그것. name.service다음 명령을 사용하여 재부팅 후 작동하는지 수동으로 테스트할 수 있습니다 .

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

이것은 것이다새로 고치다정보가 정확하다고 가정하면 상태와 서비스가 올바르게 시작됩니다. 그런 다음 상태를 다시 확인하여 추가 세부정보를 확인할 수 있습니다.

systemctl status <service-name>

답변3

서비스를 활성화한 후 링크가 어디에 있는지 확인하세요. 이에 대한 내 생각을 추가하면 됩니다. 실행하면 sudo systemctl enable myserevice.service폴더에 링크가 생성되지만 multi-user.target.wants실제 링크에는 생성되지 않습니다 multi-user.target.wants. 동일한 이름의 새 폴더에 생성됩니다. WantedBy=multi-user.target내 텍스트 편집기에 일부 추가 문자가 표시되지 않습니다. 그래서 나는 그것이 무엇인지 모릅니다. 다른 .service 파일에서 c/p를 사용하고 다시 활성화했는데 이제 링크가 올바른 폴더에 있습니다.

답변4

이것은 여러 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-refuses-to-start-due-to-broken-service-file/

배포 수준 수정은 다음과 같습니다.

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

수동으로 대체할 수 있는 방법이 많이 있습니다.

관련 정보