Tutoriel Linux

서비스 systemd가 실패하는 이유 찾기

Débutant2 min de lecture

상태가 실패인 서비스는 즉각적인 재시작이 필요하지 않습니다. 서버에서 이러한 습관은 가끔 고장을 설명하는 메시지를 지우거나 여전히 잘못된 구성으로 프로그램을 다시 시작하는 경우가 있습니다.

먼저 영향을 받는 유닛을 식별하고, 그 상태와 로그를 읽은 후 원인을 수정하십시오. 재시작은 그 후에 이루어집니다.

Tux가 Linux 서버에서 오류 표시등을 점검하고 있는 모습
실패한 서비스는 재시작 이전에 상태와 로그를 통해 진단해야 합니다.

실제 실패한 유닛 나열하기

이 명령어는 systemd가 실패한 것으로 간주하는 서비스와 유닛을 표시합니다 :

systemctl --failed

전체 이름을 기록하십시오, 예를 들어 nginx.service 또는 mon-application.service. exited 된 유닛이 반드시 고장난 것은 아닙니다: 일부 서비스는 짧은 작업을 수행한 후 정상적으로 종료됩니다. failed 상태는 시작, 제어 명령 또는 모니터링된 프로세스가 오류로 종료되었음을 나타냅니다.

활성, 정지된 서비스 및 그 상태를 다시 보려면 systemctl로 서비스 목록 확인하기를 참고하십시오.

재시작 전에 서비스 상태 확인하기

유닛에 nginx를 대신하십시오. --no-pager 옵션은 결과를 터미널에 직접 출력하여 SSH 세션에서 less에 머무르지 않도록 합니다.

sudo systemctl status nginx --no-pager

특히 Active:, 종료 코드 및 표시된 마지막 줄을 주의 깊게 보십시오. 이미 점유된 포트, 누락된 경로, 읽을 수 없는 인증서 또는 잘못 입력된 지시어가 여기에 종종 나타납니다. 서비스가 자체 검증기를 가진 이진 파일을 시작하는 경우, 먼저 그 검증기를 실행하십시오. 예를 들어 Nginx의 경우 :

sudo nginx -t

Nginx를 사용하지 않는 머신에서 이 명령어를 실행하지 마십시오. 각 서비스는 검증 구문이 다릅니다.

journalctl로 오류 메시지 확인하기

systemctl status는 오직 일부분만 보여줍니다. 유닛의 로그는 전체 맥락을 제공합니다 :

sudo journalctl -u nginx -b --no-pager
sudo journalctl -u nginx -n 50 --no-pager

-b는 현재 부팅에 대한 검색을 제한합니다. -n 50은 고장이 더 오래된 경우 마지막 50줄을 유지합니다. 실시간으로 재시작을 따라가려면 두 번째 SSH 세션에서 sudo journalctl -fu nginx를 사용하십시오. journalctl과 마지막 부팅 메시지 가이드는 오류가 여러 서비스에 영향을 줄 때 진단을 확대하는 데 도움이 됩니다.

수정, 재시작, 그리고 체크하기

유닛 파일이나 systemd의 drop-in을 수정한 후에는 설정을 다시 로드하십시오. 이 단계는 서비스를 재시작하지 않습니다.

sudo systemctl daemon-reload
sudo systemctl restart nginx
systemctl is-active nginx
systemctl --failed

is-activeactive로 응답해야 합니다. 서비스가 포트에서 수신 대기하고 있다면 포트도 확인하고 올바른 클라이언트에서 테스트하십시오. active 응답은 웹 애플리케이션, 프록시 또는 데이터베이스가 이미 요청을 수락하고 있음을 보장하지 않습니다.

중요한 서비스의 경우 재시작 전에 두 번째 SSH 세션을 열어 두고 오류를 정확하게 복사하여 티켓이나 메모에 기록해 두십시오. 다음 사건에서 동일한 진단을 반복하지 않을 수 있습니다.

sudo apt update && sudo apt upgrade