- 참고:
~/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에 기록되지 않는다는 점은 실망스럽습니다 . 하지만 우리는 다음과 같이 몇 가지 추측을 할 수 있습니다.
MemoryDiagnostics
GUI를 시작 하면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=
이는 동시에 많은 수의 서비스가 트리거되는 것을 방지하기 위해 서비스 실행에 무작위 오프셋을 적용합니다.