소개
프로세스는 실행 중인 프로그램입니다. 서비스는 정의와 수명 주기 정책에 따라 관리되는 장시간 실행 시스템 기능입니다. Ubuntu 에서는 systemd 가 unit 정의를 읽고, 서비스를 시작하고 중지하며, 상태를 추적하고, 서비스 출력을 시스템 journal 에 기록합니다.
이 실습에서는 격리된 labex-heartbeat 실습 서비스를 사용합니다. 서비스의 unit 을 확인하고, 실행 상태를 제어하며, 부팅 시 활성화하도록 설정합니다. 또한 journal 및 기존 텍스트 로그를 조회하고, 실시간 출력을 확인하며, 의도적으로 발생시킨 장애를 진단한 후 정상 상태로 복구합니다. unit 파일을 수정하거나 SSH 서비스에 접근하지 않습니다.
systemd 와 서비스 Unit 확인
이 단계에서는 systemd 를 사용할 수 있는지 확인하고, 실행 중인 unit 과 설치된 unit 파일을 구분합니다.
실습 작업 디렉터리로 이동합니다.
cd /home/labex/project/service-lab
systemd 버전을 표시합니다. 식별에는 첫 번째 줄만 확인하면 됩니다.
systemctl --version | head -n 1
systemd 에 전체 상태를 확인하도록 요청합니다.
systemctl is-system-running || true
running은 필요한 모든 unit 이 정상 상태라는 뜻입니다. 교육용 VM 에서는 관련 없는 선택적 unit 의 장애 때문에 degraded가 표시될 수 있습니다. 이 경우에도 systemd 가 응답하고 있다는 사실은 확인할 수 있습니다.
현재 실행 중인 서비스의 일부 목록을 표시합니다.
systemctl list-units --type=service --state=running --no-pager | head -n 12
unit 은 systemd 가 관리하는 객체입니다. 서비스 unit 은 .service로 끝납니다. unit 파일은 해당 대상이 현재 실행 중이 아니더라도 관리할 수 있는 항목을 정의합니다.
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는 로드된 unit 경로, 활성화 여부, 실행 상태, 프로세스 정보 및 최근 로그 줄을 함께 표시합니다.
cd /home/labex/project/service-lab
systemctl status labex-heartbeat.service --no-pager
서비스는 inactive (dead) 및 disabled 상태여야 합니다. inactive는 현재 실행 중이 아니라는 뜻이고, disabled는 부팅 시 설치 대상 (install target) 을 통해 시작하도록 설정되지 않았다는 뜻입니다. 이 둘은 서로 별개의 속성입니다.
unit 정의를 표시합니다.
systemctl cat labex-heartbeat.service
[Unit] 섹션은 식별 정보와 실행 순서를 설명하고, [Service] 섹션은 프로세스를 정의하며, [Install] 섹션은 활성화 설정을 설명합니다. 여기서는 준비된 unit 을 확인만 하며, 직접 작성할 필요는 없습니다.
컴퓨터가 읽기 쉬운 속성 형식으로 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
이제 상태에 주 PID 가 포함됩니다. 서비스를 중지한 다음 결과를 확인합니다.
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=active 및 SubState=running 상태여야 합니다.
부팅 시 활성화 설정
이 단계에서는 서비스의 현재 실행 상태와 향후 부팅 시 활성화 여부를 구분합니다.
이전 단계에서 서비스는 활성 상태가 되었지만, 설정 과정에서 unit 파일은 비활성화된 상태로 남아 있습니다. 활성화 여부를 확인합니다.
systemctl is-enabled labex-heartbeat.service || true
서비스를 활성화합니다.
sudo systemctl enable labex-heartbeat.service
systemctl is-enabled labex-heartbeat.service
활성화하면 서비스와 부팅 대상 (boot target) 을 연결하는 링크가 생성됩니다. 이미 실행 중인 서비스는 다시 시작하지 않아도 됩니다.
부팅 링크를 제거하는 작업도 실습합니다.
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 journal 에서 최근 서비스 출력을 확인하고, 필요한 내용만 저장합니다.
systemd 가 관리하는 서비스는 일반적으로 표준 출력과 표준 오류를 journal 로 보냅니다. 실습 unit 만 조회합니다.
sudo journalctl -u labex-heartbeat.service -n 10 --no-pager
-u 옵션은 unit 을 선택하고, -n 10은 가장 최근의 10 개 기록만 유지하며, --no-pager는 결과를 페이지 단위로 나누지 않고 바로 출력합니다. 최근 heartbeat 기록이 표시되어야 합니다. 서비스가 계속 실행되는 동안 제한된 출력 범위를 벗어나 시작 메시지가 보이지 않을 수도 있습니다.
최근 시간 범위로 결과를 제한합니다.
sudo journalctl -u labex-heartbeat.service --since "5 minutes ago" --no-pager
warning 이상 우선순위의 기록만 필터링합니다. 서비스가 warning 을 기록하지 않았다면 출력이 없는 것이 정상이며 유효한 결과입니다.
sudo journalctl -u labex-heartbeat.service -p warning --since "5 minutes ago" --no-pager
최근 unit 전용 로그를 프로젝트 작업 공간에 저장합니다.
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
새 heartbeat 줄이 두 개 이상 표시될 때까지 기다린 다음 Ctrl+C를 누릅니다. 이 키 입력은 tail을 중단할 뿐, 로그를 기록하는 서비스는 중지하지 않습니다.
heartbeat 줄만 필터링하고 최신 세 줄을 확인합니다.
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
숫자로 된 interval 값을 잘못된 값으로 바꿉니다. 이 작업은 실습 서비스에만 의도적으로 오류를 발생시킵니다.
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
상태 정보에서는 프로세스가 종료되었다는 사실을 확인할 수 있고, journal 에서는 애플리케이션별 원인을 확인할 수 있습니다.
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 unit 을 확인하고, systemctl로 안전한 실습 서비스를 제어했으며, journalctl로 서비스 기록을 조회했습니다.
또한 /var/log를 확인하고, tail -f로 실시간 텍스트 출력을 추적했습니다. 상태와 로그를 함께 사용해 의도적으로 발생시킨 장애의 원인을 설명하고 서비스를 복구했습니다. 먼저 상태를 확인하고 다음에 로그를 확인하는 이 작업 흐름은 초보자가 서비스 문제를 해결할 때 활용할 수 있는 실용적인 기초입니다.



