Linux 강좌 / systemd 서비스와 부팅 로그 확인하기

systemd를 사용하는 리눅스에서 부팅은 펌웨어와 부트로더를 거쳐 커널이 시작된 뒤, 시스템 관리자인 systemd가 서비스와 다른 유닛을 활성화하는 흐름입니다. 서비스 문제를 확인할 때는 systemctl로 현재 상태와 부팅 시 활성화 설정을 각각 보고, journalctl로 같은 부팅의 로그를 읽으세요. 이 두 상태는 서로 다릅니다.

부팅 흐름을 큰 단계로 이해하기

일반적인 PC·서버 부팅은 펌웨어가 하드웨어를 초기화하고 부트로더를 찾는 것으로 시작합니다. 부트로더는 커널과 필요한 초기 환경을 로드하고, 커널은 장치·메모리·프로세스 실행 기반을 준비합니다. 그다음 첫 사용자 공간 프로세스인 초기화 시스템이 서비스 등을 관리합니다. 여기서는 systemd가 PID 1인 배포판을 대상으로 합니다. 다른 초기화 시스템을 쓰는 환경에는 명령과 절차가 다를 수 있습니다.

ps -p 1 -o pid,comm,args
systemctl get-default

첫 명령의 COMMAND 또는 ARGS에서 PID 1이 systemd인지 확인하세요. 컨테이너나 특수 환경에서는 다를 수 있습니다. 두 번째 명령은 기본 target을 보여 줍니다. 예를 들어 multi-user.target은 일반적인 다중 사용자 텍스트 환경의 목표이고, graphical.target은 그래픽 환경의 목표일 수 있습니다. target은 여러 유닛을 묶는 목표이며, 모든 서비스가 한 줄로 순차 시작된다는 뜻은 아닙니다.

systemd 유닛과 의존 관계

systemd는 관리 대상을 유닛(unit)으로 표현합니다. .service는 서비스, .target은 여러 유닛을 묶는 목표, .socket은 소켓 기반 활성화, .timer는 시간 기반 실행과 관련됩니다. 서비스를 사용하려면 해당 프로그램 패키지와 유닛이 실제로 설치돼 있어야 합니다. 이름을 추측해서 운영 서버의 서비스를 시작하거나 중지하지 마세요.

서비스 시작 순서는 단순한 숫자 순서가 아니라 유닛 간 의존성과 순서 규칙에 따라 결정됩니다. 어떤 유닛이 다른 유닛 뒤에 시작되도록 설정돼 있어도, 그것만으로 필요 관계까지 생기는 것은 아닙니다. 부팅 중 일부 유닛은 병렬로 실행되므로 느린 부팅을 조사할 때 목록의 위아래만으로 원인을 확정할 수 없습니다.

systemctl list-units --type=service --state=running
systemctl --failed

첫 명령은 현재 로드된 실행 중 서비스 유닛을, 두 번째는 실패 상태의 유닛을 보여 줍니다. 실패 목록이 비어 있어도 애플리케이션이 올바르게 응답하는지까지 보장하지는 않습니다. 포트·응답·애플리케이션 로그를 별도로 확인해야 할 수 있습니다.

실행 상태와 자동 시작 설정의 차이

active는 지금 실행 또는 활성 상태인지와 관련되고, enabled는 보통 관련 target에 연결돼 부팅 시 시작하도록 설정됐는지를 뜻합니다. 지금 active인 서비스가 disabled일 수 있고, enabled여도 현재 시작에 실패했을 수 있습니다. static 유닛은 별도의 설치 규칙이 없어 직접 enable하지 못해도 다른 유닛의 의존성 등으로 동작할 수 있습니다.

명령 주로 확인하거나 바꾸는 것 주의점
systemctl status NAME.service 상태·최근 로그 요약 조회 요약만으로 전체 로그를 대체하지 못함
systemctl is-active NAME.service 현재 활성 상태 조회 자동 시작 설정은 알 수 없음
systemctl is-enabled NAME.service 자동 시작 설정 조회 현재 실행 여부는 알 수 없음
systemctl start / stop NAME.service 지금 시작 / 중지 자동 시작 설정 자체는 바꾸지 않음
systemctl enable / disable NAME.service 자동 시작 연결 설정 / 해제 현재 실행 상태를 바로 바꾸는 명령은 아님

표의 NAME.service는 자리표시자이며 실제 설치된 유닛 이름으로 바꿔야 합니다. 서버에 접속하는 데 쓰는 SSH 서비스 같은 필수 유닛을 멈추면 원격 접속이 끊어질 수 있습니다. 변경 명령은 서비스 영향·복구 경로를 확인한 후에만 실행하세요.

읽기 전용 명령으로 서비스 살펴보기

다음의 systemd-journald.service는 systemd 환경에서 자주 볼 수 있는 유닛이지만 최소 이미지나 특수 환경에서는 결과가 다를 수 있습니다. 모두 조회 명령입니다.

systemctl status systemd-journald.service
systemctl is-active systemd-journald.service
systemctl is-enabled systemd-journald.service

status는 로드 정보, 현재 상태, 실행 프로세스와 최근 로그 일부를 보여 줄 수 있습니다. is-active는 active, inactive, failed 등의 결과를 출력하고 비활성 상태에서 0이 아닌 종료 상태를 반환할 수 있습니다. is-enabled는 enabled뿐 아니라 disabled, static 등도 표시할 수 있습니다. static을 곧바로 오류라고 판단하지 마세요.

서비스를 바꿀 때 알아둘 명령

실제로 변경할 때 start와 stop은 지금의 상태에, enable과 disable은 자동 시작 설정에 각각 초점을 둡니다. restart는 일단 서비스를 다시 시작하므로 연결이 끊어지거나 작업이 중단될 수 있습니다. reload는 서비스가 지원할 때만 설정을 다시 읽도록 요청하며, 동작 여부와 범위는 서비스별로 다릅니다. enable --now는 자동 시작 설정과 즉시 시작을 함께 요청합니다.

유닛 파일 자체를 만들거나 수정한 뒤에는 systemd 관리자가 정의를 다시 읽도록 daemon-reload가 필요할 수 있습니다. 이는 애플리케이션 프로세스를 다시 시작하는 restart나 애플리케이션 설정을 다시 읽는 reload와 다릅니다. 운영 중인 서비스의 유닛·설정 변경에는 먼저 백업과 유지보수 창을 마련하세요.

journalctl로 현재 부팅의 로그 읽기

systemd 저널에는 서비스와 커널 등 여러 출처의 로그가 모일 수 있습니다. -b는 현재 부팅으로 범위를 좁히고, -u는 지정한 유닛의 메시지만 선택합니다. -n 30은 최근 30개 항목을 요청합니다. 조회 권한이 부족하면 일부 로그가 보이지 않을 수 있으며, 그때는 허용된 관리자 계정이나 적절한 권한으로 다시 확인해야 합니다.

journalctl -b -u systemd-journald.service -n 30 --no-pager
journalctl -b -p warning -n 30 --no-pager
journalctl --list-boots

첫 명령은 현재 부팅에서 해당 유닛의 최근 기록, 둘째는 경고 이상 우선순위의 최근 기록을 보여 줍니다. 경고 한 줄이 곧 장애 원인이라는 뜻은 아니며 발생 시각과 앞뒤 문맥을 함께 읽어야 합니다. --list-boots에 이전 부팅이 없다면 저널 보존 설정이나 저장 공간 정책 때문에 과거 로그를 사용할 수 없는 것일 수 있습니다. 이전 부팅을 조사할 때는 기록이 실제로 있는지 먼저 확인하세요.

서비스가 시작되지 않을 때 진단 순서

  1. 문제가 난 유닛의 정확한 이름과 패키지 설치 여부를 확인합니다. 비슷한 이름의 다른 서비스를 추측해 조작하지 않습니다.
  2. systemctl status로 loaded, active, 실패 이유의 요약과 최근 기록을 확인합니다.
  3. journalctl -b -u로 같은 부팅의 해당 유닛 로그를 더 넓게 읽습니다. 설정 오류, 권한 문제, 포트 충돌, 의존 서비스 실패처럼 실제 메시지가 가리키는 원인을 찾습니다.
  4. 설정 파일과 필요한 자원·의존 관계를 확인하고, 변경 전 백업을 남깁니다. 로그의 한 줄만 보고 권한을 과도하게 풀지 않습니다.
  5. 원인을 고친 뒤 서비스 영향이 허용되는 시점에 필요한 동작만 수행하고 is-active 및 실제 애플리케이션 응답을 확인합니다.

부팅 시간이 문제라면 systemd-analyze critical-chain은 중요한 시작 경로를 살펴보는 데 도움이 됩니다. 반면 systemd-analyze blame의 개별 시간이 길다는 이유만으로 그 서비스가 전체 부팅 지연의 원인이라고 단정해서는 안 됩니다. 병렬 실행과 의존 관계를 함께 해석해야 합니다.

공식 문서

systemctl(1) 매뉴얼은 유닛 상태와 변경 명령을, journalctl(1) 매뉴얼은 부팅·유닛·우선순위별 로그 조회를 설명합니다. systemd.unit(5) 매뉴얼에서 유닛과 의존 관계의 자세한 의미를 확인할 수 있습니다.

같은 카테고리의 다른 글
Linux / 명령어 / rpm - RPM 패키지와 설치 데이터베이스 조회

Linux / 명령어 / rpm - RPM 패키지와 설치 데이터베이스 조회

Linux rpm 명령어의 적용 배포판과 기본 작업을 설명합니다. 패키지 조회·설치 예제, 주요 옵션과 시스템 변경 시 주의점을 알아봅니다.

Linux / 명령어 / file - 파일 종류와 형식 확인

Linux / 명령어 / file - 파일 종류와 형식 확인

Linux file 명령어로 확장자와 관계없이 실제 파일 형식, MIME 유형과 문자 인코딩을 확인하는 방법을 설명합니다. 심볼릭 링크, 압축 파일, 여러 파일 검사와 스크립트 활용법도 정리합니다.

Linux / 명령어 / sort - 텍스트 행 정렬

Linux / 명령어 / sort - 텍스트 행 정렬

Linux sort 명령어의 기본 문법과 실제 사용 예제를 설명합니다. 주요 옵션과 결과를 해석할 때 주의할 점을 확인할 수 있습니다.

Linux / 명령어 / ping - 호스트 응답과 왕복 시간 확인

Linux / 명령어 / ping - 호스트 응답과 왕복 시간 확인

Linux ping 명령어의 기능과 기본 문법을 설명합니다. 실제 사용 예제, 주요 옵션과 작업 전 확인할 점을 알아봅니다.

Linux / 명령어 / grep - 텍스트에서 원하는 문자열 검색

Linux / 명령어 / grep - 텍스트에서 원하는 문자열 검색

Linux grep 명령어로 파일과 명령 출력에서 문자열·정규 표현식을 검색하는 방법을 설명합니다. -F, -E, -r, 문맥 출력, 종료 상태와 로그 검색 예제를 정리합니다.

Linux / 명령어 / systemctl - systemd 서비스 상태 확인과 관리

Linux / 명령어 / systemctl - systemd 서비스 상태 확인과 관리

Linux systemctl 명령어의 기능과 기본 문법을 설명합니다. 실제 사용 예제, 주요 옵션과 작업 전 확인할 점을 알아봅니다.

웹 서버용 리눅스 추천: Ubuntu, Debian, Rocky Linux 선택 기준

웹 서버용 리눅스 추천: Ubuntu, Debian, Rocky Linux 선택 기준

웹 서버용 Linux 배포판을 지원 기간, 패키지 생태계, 보안 정책과 운영 환경 기준으로 비교합니다. Ubuntu Server, Debian, Rocky Linux·AlmaLinux와 Amazon Linux 중 상황에 맞는 선택법을 정리합니다.

Linux / 명령어 / mkdir - 디렉터리 생성

Linux / 명령어 / mkdir - 디렉터리 생성

Linux mkdir 명령어로 디렉터리와 여러 단계의 상위 디렉터리를 만드는 방법을 설명합니다. 권한, umask, SELinux 환경과 자동화에서 안전하게 사용하는 방법도 정리합니다.

Linux / 명령어 / clear - 터미널 화면 정리

Linux / 명령어 / clear - 터미널 화면 정리

Linux clear 명령어로 터미널 화면을 정리하는 방법을 설명합니다. 스크롤백을 보존하는 -x 옵션과 Ctrl+L·reset·tput의 차이, TERM 오류 해결법을 다룹니다.

Linux / 리눅스 역사 - 1991년 취미 프로젝트가 세계 인프라가 되기까지

Linux / 리눅스 역사 - 1991년 취미 프로젝트가 세계 인프라가 되기까지

리눅스는 1991년 시작된 커널 프로젝트에서 서버·클라우드·모바일을 떠받치는 기반 기술로 성장했습니다. UNIX와 GNU의 배경부터 배포판과 공동 개발 생태계의 확장까지 핵심 연표로 정리합니다.