서비스 및 시스템 로그 관리

LinuxBeginner
지금 연습하기

소개

프로세스는 실행 중인 프로그램입니다. 서비스는 정의와 수명 주기 정책에 따라 관리되는 장시간 실행 시스템 기능입니다. Ubuntu 에서 systemd 는 유닛 정의를 읽고, 서비스를 시작 및 중지하며, 상태를 추적하고, 출력을 시스템 저널에 기록합니다.

이 실습에서는 격리된 labex-heartbeat 실습 서비스를 사용합니다. 서비스 유닛을 확인하고, 실행 상태를 제어하며, 부팅 시 활성화 설정을 구성합니다. 또한 저널과 기존 텍스트 로그를 조회하고, 실시간 출력을 확인하며, 통제된 장애를 진단한 뒤 정상 상태로 복구합니다. 유닛 파일을 수정하거나 SSH 서비스에 접근하지 않습니다.

systemd 와 서비스 유닛 이해하기

이 단계에서는 systemd 를 사용할 수 있는지 확인하고, 실행 중인 유닛과 설치된 유닛 파일의 차이를 살펴봅니다.

실습 작업 공간으로 이동합니다.

cd /home/labex/project/service-lab

systemd 버전을 표시합니다. 식별을 위해 첫 번째 줄만 확인하면 됩니다.

systemctl --version | head -n 1

systemd 의 전체 상태를 확인합니다.

systemctl is-system-running || true

running은 필수 유닛이 모두 정상이라는 의미입니다. 교육용 가상 머신에서는 관련 없는 선택적 유닛의 장애로 인해 degraded가 표시될 수 있습니다. 이 경우에도 systemd 가 정상적으로 응답하고 있다는 사실은 확인할 수 있습니다.

현재 실행 중인 서비스의 일부 목록을 표시합니다.

systemctl list-units --type=service --state=running --no-pager | head -n 12

유닛은 systemd 가 관리하는 객체입니다. 서비스 유닛의 이름은 .service로 끝납니다. 유닛 파일은 현재 실행 중이 아니더라도 관리할 수 있는 대상을 정의합니다.

systemctl list-unit-files --type=service --no-pager | head -n 12

간단한 systemd 요약 정보를 저장합니다. 명령 치환 $(...)printf가 기록하는 텍스트에 명령의 출력을 삽입합니다.

printf 'systemd=%s\nstate=%s\n' "$(systemctl --version | head -n 1)" "$(systemctl is-system-running)" > systemd-summary.txt
cat systemd-summary.txt

서비스 정의와 상태 확인하기

이 단계에서는 준비된 실습 서비스를 시작하기 전에 해당 서비스의 정의와 상태를 확인합니다.

systemctl status는 로드된 유닛 경로, 활성화 설정, 실행 상태, 프로세스 정보, 최근 로그를 한꺼번에 보여줍니다.

cd /home/labex/project/service-lab
systemctl status labex-heartbeat.service --no-pager

서비스 상태는 inactive (dead)이고 활성화 설정은 disabled여야 합니다. inactive는 현재 실행 중이 아니라는 뜻이며, disabled는 부팅 시 설치 대상에 의해 자동으로 시작되도록 설정되지 않았다는 뜻입니다. 두 속성은 서로 독립적입니다.

유닛 정의를 표시합니다.

systemctl cat labex-heartbeat.service

[Unit] 섹션은 서비스의 식별 정보와 실행 순서를 정의하고, [Service] 섹션은 프로세스를 정의하며, [Install] 섹션은 활성화 설정을 설명합니다. 이 단계에서는 준비된 유닛을 확인하기만 하며 직접 작성할 필요는 없습니다.

기계가 읽기 쉬운 속성은 systemctl show로 확인할 수 있습니다.

systemctl show labex-heartbeat.service -p LoadState -p ActiveState -p SubState -p UnitFileState

확인을 위해 해당 속성을 저장합니다.

systemctl show labex-heartbeat.service -p LoadState -p ActiveState -p SubState -p UnitFileState > service-properties.txt
cat service-properties.txt

서비스 시작, 중지 및 재시작하기

이 단계에서는 실습 서비스의 실행 상태를 변경하고 각 결과를 확인합니다.

시스템 서비스를 시작하거나 중지하려면 관리자 권한이 필요합니다. 서비스를 시작합니다.

sudo systemctl start labex-heartbeat.service

간단한 활성 상태를 확인합니다.

systemctl is-active labex-heartbeat.service

예상 출력은 active입니다. 전체 상태를 확인합니다.

systemctl status labex-heartbeat.service --no-pager

이제 상태 정보에 주 프로세스 ID 가 표시됩니다. 서비스를 중지한 뒤 결과를 확인합니다.

sudo systemctl stop labex-heartbeat.service
systemctl is-active labex-heartbeat.service || true

예상 상태는 inactive입니다. 서비스를 다시 시작한 다음, restart를 사용해 하나의 작업으로 실행 중인 프로세스를 교체합니다.

sudo systemctl start labex-heartbeat.service
sudo systemctl restart labex-heartbeat.service
systemctl show labex-heartbeat.service -p ActiveState -p SubState -p MainPID

이 단계가 끝날 때 서비스는 ActiveState=activeSubState=running 상태여야 합니다.

부팅 시 서비스 활성화 설정하기

이 단계에서는 서비스의 현재 실행 상태와 향후 부팅 시 자동으로 시작되도록 설정되었는지를 구분합니다.

이전 단계에서 서비스는 실행 중이지만, 실습 환경에서는 유닛 파일이 비활성화된 상태로 설정되어 있습니다. 활성화 설정을 확인합니다.

systemctl is-enabled labex-heartbeat.service || true

서비스를 활성화합니다.

sudo systemctl enable labex-heartbeat.service
systemctl is-enabled labex-heartbeat.service

서비스를 활성화하면 해당 서비스를 부팅 대상에 연결하는 링크가 생성됩니다. 이미 실행 중인 서비스를 다시 시작할 필요는 없습니다.

이제 부팅 링크를 제거하는 작업도 실습해 봅니다.

sudo systemctl disable labex-heartbeat.service
systemctl is-enabled labex-heartbeat.service || true

출력이 disabled로 바뀌더라도 서비스는 계속 실행 중일 수 있습니다. 마지막 실습 상태를 위해 다시 활성화합니다.

sudo systemctl enable labex-heartbeat.service

서로 독립적인 두 속성을 모두 확인합니다.

systemctl is-active labex-heartbeat.service
systemctl is-enabled labex-heartbeat.service

journalctl 로 서비스 로그 조회하기

이 단계에서는 systemd 저널에서 최근 서비스 출력을 읽고, 필요한 내용만 별도로 저장합니다.

systemd 가 관리하는 서비스는 일반적으로 표준 출력과 표준 오류를 저널에 기록합니다. 실습 유닛만 조회합니다.

sudo journalctl -u labex-heartbeat.service -n 10 --no-pager

-u 옵션은 특정 유닛을 선택하고, -n 10은 가장 최근의 10 개 기록만 표시하며, --no-pager는 결과를 페이저 없이 바로 출력합니다. 서비스 시작 메시지와 하트비트 기록을 확인할 수 있어야 합니다.

최근 시간 범위로 결과를 제한합니다.

sudo journalctl -u labex-heartbeat.service --since "5 minutes ago" --no-pager

경고 이상 우선순위의 로그만 필터링합니다. 서비스가 경고를 기록하지 않았다면 출력이 없는 것이 정상이며 유효한 결과입니다.

sudo journalctl -u labex-heartbeat.service -p warning --since "5 minutes ago" --no-pager

최근 유닛별 로그를 작업 공간에 저장합니다.

cd /home/labex/project/service-lab
sudo journalctl -u labex-heartbeat.service -n 20 --no-pager > service-journal.txt
tail -n 5 service-journal.txt

기존 텍스트 로그 확인하기

이 단계에서는 /var/log를 살펴보고 새 기록이 추가될 때 텍스트 로그를 실시간으로 확인합니다.

/var/log 계층에는 다양한 기존 시스템 및 애플리케이션 로그가 저장됩니다. 일부 목록을 표시합니다.

ls -lh /var/log | head -n 12

실습 서비스의 최신 기록을 확인합니다.

tail -n 5 /var/log/labex-heartbeat.log

-f 옵션은 파일을 계속 추적하며, 다른 프로세스가 파일에 새 줄을 추가할 때 이를 표시합니다.

tail -f /var/log/labex-heartbeat.log

새 하트비트 줄이 두 개 이상 표시될 때까지 기다린 다음 Ctrl+C를 누릅니다. 이 동작은 tail을 중단할 뿐이며 로그를 기록하는 서비스는 중지하지 않습니다.

하트비트 줄만 필터링하고 최근 세 줄을 표시합니다.

grep '^heartbeat ' /var/log/labex-heartbeat.log | tail -n 3

작업 공간에 다섯 줄 샘플을 저장합니다.

cd /home/labex/project/service-lab
tail -n 5 /var/log/labex-heartbeat.log > traditional-log-sample.txt
cat traditional-log-sample.txt

장애가 발생한 서비스 진단 및 복구하기

이 단계에서는 통제된 구성 오류를 만들고, 서비스 상태와 로그를 사용해 원인을 확인한 다음 정상적으로 복구합니다.

실습 서비스를 중지하고 간단한 구성 파일을 백업합니다.

sudo systemctl stop labex-heartbeat.service
sudo cp /etc/labex-heartbeat.conf /etc/labex-heartbeat.conf.bak

숫자로 된 간격 값을 잘못된 값으로 바꿉니다. 이 작업은 실습 서비스에만 의도적으로 오류를 발생시킵니다.

sudo sed -i 's/^INTERVAL=2$/INTERVAL=invalid/' /etc/labex-heartbeat.conf

서비스 시작을 시도합니다. 오류 메시지가 표시되는 것이 정상입니다.

sudo systemctl start labex-heartbeat.service || true

장애 상태를 확인합니다.

systemctl status labex-heartbeat.service --no-pager || true
systemctl is-failed labex-heartbeat.service

상태 정보에서는 프로세스가 종료되었다는 사실을 알려 주지만, 애플리케이션별 원인은 저널에서 확인할 수 있습니다.

sudo journalctl -u labex-heartbeat.service -n 10 --no-pager

configuration error: INTERVAL must be a positive integer 메시지를 찾습니다. 정상 구성을 복원하고, 기록된 장애 상태를 초기화한 다음 서비스를 다시 시작합니다.

sudo mv /etc/labex-heartbeat.conf.bak /etc/labex-heartbeat.conf
sudo systemctl reset-failed labex-heartbeat.service
sudo systemctl start labex-heartbeat.service

복구 상태를 확인합니다.

systemctl is-active labex-heartbeat.service
cat /etc/labex-heartbeat.conf

서비스는 active 상태여야 하며, 구성 파일에는 다시 INTERVAL=2가 포함되어 있어야 합니다.

요약

프로세스, 서비스, 활성 상태, 부팅 시 활성화 설정의 차이를 확인했습니다. systemd 유닛을 살펴보고, systemctl로 안전한 실습 서비스를 제어했으며, journalctl로 서비스 기록을 조회했습니다.

또한 /var/log를 확인하고 tail -f로 실시간 텍스트 출력을 추적했습니다. 상태와 로그를 함께 사용해 통제된 장애의 원인을 설명하고 서비스를 복구했습니다. 상태를 먼저 확인하고 로그를 다음에 분석하는 이 작업 방식은 초보자가 서비스 문제를 해결하는 데 필요한 실용적인 기반입니다.