다시 시작한 후 시스템 사용자 서비스가 실패하지만 수동으로 제대로 작동합니다.

다시 시작한 후 시스템 사용자 서비스가 실패하지만 수동으로 제대로 작동합니다.
  • 참고: ~/opt/bin/MemoryDiagnostics이는 bash 스크립트이며 실행 가능합니다.
$ cat MemoryDiagnostics.service

[Unit]
Description=MemoryDiagnostics Service

[Service]
ExecStart="%h/opt/bin/MemoryDiagnostics"
SyslogIdentifier=MemoryDiagnosticsService

[Install]
WantedBy=default.target
$ systemctl --user enable MemoryDiagnostics.service 
Created symlink /home/nikhil/.config/systemd/user/default.target.wants/MemoryDiagnostics.service → /home/nikhil/.config/systemd/user/MemoryDiagnostics.service. 

그런 다음 다시 시작하십시오. 관찰: 다시 시작한 후 서비스가 실패합니다.

$ systemctl --user status MemoryDiagnostics.service 
● MemoryDiagnostics.service - MemoryDiagnostics Service
     Loaded: loaded (/home/nikhil/.config/systemd/user/MemoryDiagnostics.service; enabled; vendor preset: enabled)
     Active: failed (Result: exit-code) since Thu 2021-09-02 02:34:32 CEST; 11min ago
    Process: 1549 ExecStart=/home/nikhil/opt/bin/MemoryDiagnostics (code=exited, status=1/FAILURE)
   Main PID: 1549 (code=exited, status=1/FAILURE)

Sep 02 02:34:29 X550JX systemd[1147]: Started MemoryDiagnostics Service.
Sep 02 02:34:32 X550JX systemd[1147]: MemoryDiagnostics.service: Main process exited, code=exited, status=1/FAILURE
Sep 02 02:34:32 X550JX systemd[1147]: MemoryDiagnostics.service: Failed with result 'exit-code'.
  • 수동으로 완료하면 서비스가 시작됩니다.
$ systemctl --user start MemoryDiagnostics.service 
$ systemctl --user status MemoryDiagnostics.service 
● MemoryDiagnostics.service - MemoryDiagnostics Service
     Loaded: loaded (/home/nikhil/.config/systemd/user/MemoryDiagnostics.service; enabled; vendor preset: enabled)
     Active: active (running) since Thu 2021-09-02 02:48:13 CEST; 4s ago
   Main PID: 9941 (bash)
     CGroup: /user.slice/user-1000.slice/[email protected]/MemoryDiagnostics.service
             ├─9941 bash /home/nikhil/opt/bin/MemoryDiagnostics
             └─9970 sleep 121

Sep 02 02:48:13 X550JX systemd[1147]: Started MemoryDiagnostics Service.

재부팅 후 쉘 스크립트가 실패하지만 수동으로 시작하면 제대로 작동하는 이유는 무엇입니까?

답변1

~/opt/bin/MemoryDiagnostics종료 코드 1로 종료합니다. 이는 오류가 애플리케이션 내부에 있음을 의미합니다. MemoryDiagnostics필요한 정보를 제공하는 데 도움을 줄 수 있도록 더 많은 정보가 stderr에 기록되지 않는다는 점은 실망스럽습니다 . 하지만 우리는 다음과 같이 몇 가지 추측을 할 수 있습니다.

  • MemoryDiagnosticsGUI를 시작 하면 WantedBy=default.target로 변경합니다 WantedBy=graphical-session.target.
  • MemoryDiagnistics다른 리소스에 대한 종속성이 있는 경우 섹션 After=에 추가하여 [Unit]종속성이 준비되었는지 확인할 수 있습니다. 잠재적으로 관련된 일부 종속성은 다음과 같습니다.
    • After=bluetooth.target블루투스도 확인 중(또는 확인 실패)인 경우.
    • After=default.target귀하가 추가로 제공하는 서비스가 필요한 경우default.target
    • 이 명령을 실행하기 전에 다른 사용자 정의 단위(예: 설치 또는 서비스)를 준비해야 합니다.

어떤 종속성을 준비해야 하는지 알 수 없는 경우(또는 inotify를 사용하지 않고 종속성을 시작하는 데 시간이 걸릴 수 있는 경우) 언제든지 ExecStartPre=/bin/sleep 5인위적으로 5초 시작 지연을 추가할 수 있습니다.

이 방법은 구성하기가 더 쉽지만 불필요한 지연 시간이 추가되거나 조기에 시작될 위험이 있습니다.


이 방법이 정말 마음에 든다면 ExecStartPre=sleep즉시 실행할 필요는 없으며 자주 실행할 필요도 없습니다. 그런 다음 a를 사용하여 *.timer장치를 시작하는 것도 고려할 수 있습니다 . 이 경우 [Install]서비스에서 해당 부분을 제거하고 다음 타이머를 생성합니다.

# ~/.config/systemd/user/MemoryDiagnostics.timer
[Unit]
Description=MemoryDiagnostics Timer

[Timer]
OnActiveSec=5s

[Install]
WantedBy=default.target

그런 다음 systemctl --user enable MemoryDiagnostics.timer서비스 실행을 처리하도록 합니다.

이는 ExecStart=sleep위의 솔루션과 사실상 동일하지만 다음을 추가/변경할 수 있는 추가 기능도 제공합니다.

  • OnCalendar=그러면 일정에 따라 진단이 실행됩니다.
  • RandomizedDelaySec=이는 동시에 많은 수의 서비스가 트리거되는 것을 방지하기 위해 서비스 실행에 무작위 오프셋을 적용합니다.

관련 정보