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


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. 시스템 스크립트에 문제가있는 사람은 stderr에 오류가 전송되지 않은 것과 동일한 작업을 수행하는 것이 좋습니다.


재부팅해도 작동합니까? 데몬 모드에 X11 연결이 필요하지 않으면 After=...언급 할 필요가 없습니다 .
Alexis Wilke 1

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

그것은 일기에 모든 것을 씁니다. 내가 본 것에서, 당신은 데몬을 시작할 수 없다면 매우 기본적이고 체계적인 오류를 볼 수 있습니다.
Alexis Wilke

2
사용자는 기본 오류조차보고하지 않았으며 작업이 성공했다고 생각하여 재부팅을 계속했습니다. 액면가에서 시스템 결함이 있습니다. 사용자에게는 실패 모드가 있지만 오류 메시지를 완전히 간과하는 것처럼 들리지는 않습니다.
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파일 도 있습니다. 거기에 정의 된 응용 프로그램이 자동으로 시작됩니다.

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


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

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

정보가 정확하다고 가정하면 상태 가 새로 고쳐 지고 서비스가 올바르게 시작됩니다. 그런 다음 상태를 다시 확인하여 추가 세부 사항을 볼 수 있습니다.

 systemctl status <service-name>

2
흠, 나는 그 전체 줄을 삭제했지만 아무것도 바뀌지 않았습니다. 또한 (내 질문에서 말했듯이) systemctl start emacs를 실행하면 정상적으로 시작됩니다).
Startec

내 업데이트 된 질문을 참조하십시오. 에 오타가있었습니다 Documentatin. 당신의 힌트가 journalctl여기 에 도움이되었습니다.
Startec

0

데비안의 여러 서비스 파일에있는 버그입니다.

# 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

이에 대한 많은 수동 대안이 있습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.