systemctl 명령어 사용법

systemd의 서비스와 유닛을 제어하고 상태를 확인하는 명령어입니다.

시스템 설정·셸연결 실습 문제 3개Rocky Linux 8 기준 · 실행 결과는 실습 컨테이너에서 확인

기본 문법

systemctl [옵션] 명령 [유닛...]

systemctl은 systemd 시스템 및 서비스 관리자를 제어하는 기본 명령어입니다. 서비스 시작·중지·재시작, 부팅 시 자동 실행 설정, 현재 상태 조회 등 유닛(unit) 단위 작업을 이 명령으로 처리합니다. Rocky Linux 8을 비롯한 RHEL 7 이상 배포판에서는 기존의 service, chkconfig 명령을 대체합니다(두 명령은 호환 목적으로 남아 있으며 내부적으로 systemctl로 전달됩니다).

다루는 대상은 .service만이 아닙니다. .socket, .target, .timer, .mount 등 systemd가 관리하는 모든 유닛 유형이 대상이며, 유닛 파일은 배포판 제공분이 /usr/lib/systemd/system 에, 관리자가 직접 작성하거나 재정의한 것은 /etc/systemd/system 에 놓입니다. 배포판이 제공한 유닛 파일은 직접 수정하지 말고 systemctl edit 로 드롭인(.d/override.conf)을 만들거나 /etc/systemd/system 에 같은 이름의 파일을 두어 재정의하는 것이 안전합니다. 유닛 파일을 새로 만들거나 수정한 뒤에는 daemon-reload 로 설정을 다시 읽어야 반영됩니다.

실무에서는 장애 초동 대응의 출발점으로 쓰입니다. systemctl --failed 로 실패한 유닛을 추리고, systemctl status 로 종료 코드와 최근 로그 몇 줄을 확인한 뒤 journalctl -u 로 상세 로그를 확인하는 순서가 일반적입니다. 리눅스마스터·RHCSA·LPIC 시험에서도 활성화(enable)와 시작(start)의 차이, is-enabled/is-active 판별이 자주 출제됩니다.

자주 쓰는 옵션

옵션의미
status유닛의 현재 상태와 최근 로그 요약 출력systemctl status httpd.service
start / stop / restart유닛을 시작·중지·재시작systemctl restart sshd.service
reload유닛이 지원하는 경우 프로세스 재시작 없이 설정만 다시 읽음systemctl reload sshd.service
enable / disable부팅 시 자동 시작 설정·해제systemctl enable httpd.service
--nowenable/disable과 함께 써서 시작·중지까지 동시에 수행systemctl enable --now httpd.service
daemon-reload유닛 파일 변경 내용을 systemd에 다시 읽힘systemctl daemon-reload
--failed실패(failed) 상태인 유닛만 나열systemctl --failed
list-units --type=service로드된 서비스 유닛 목록 출력(--all을 붙이면 비활성 유닛도 포함)systemctl list-units --type=service
list-unit-files --type=service설치된 유닛 파일과 각각의 자동시작 설정 상태 나열systemctl list-unit-files --type=service
is-active / is-enabled실행 여부·자동시작 여부를 한 단어로 반환(스크립트용, 상태에 따라 종료 코드도 달라짐)systemctl is-enabled sshd.service
cat유닛 파일과 드롭인 내용을 그대로 출력systemctl cat sshd.service
edit드롭인 파일을 만들어 유닛 설정을 재정의(--full은 유닛 파일 전체 사본 편집)systemctl edit sshd.service
--no-pager페이저 없이 표준출력으로 바로 출력systemctl status sshd --no-pager

실무 예시

서비스 실행 여부 한 단어로 확인

$ systemctl is-active sshd.service
active

서비스가 현재 동작 중인지 active/inactive/failed 중 하나로 확인합니다. 동작 중이면 종료 코드 0, 그 외에는 0이 아닌 값을 반환하므로 스크립트 조건문에 쓰기 좋습니다. 실습 컨테이너에서는 실행되지 않는 명령이라 대표 출력을 표시했습니다.

실패한 유닛만 골라 보기

$ systemctl --failed --no-pager
UNIT          LOAD   ACTIVE SUB    DESCRIPTION
● httpd.service loaded failed failed The Apache HTTP Server

LOAD   = Reflects whether the unit definition was properly loaded.
ACTIVE = The high-level unit activation state, i.e. generalization of SUB.
SUB    = The low-level unit activation state, values depend on unit type.

1 loaded units listed. Pass --all to see loaded but inactive units, too.
To show all installed unit files use 'systemctl list-unit-files'.

장애 초동 대응의 첫 단계로, 부팅 이후 실패 상태인 유닛만 추려 봅니다. 실패한 유닛이 없으면 '0 loaded units listed.' 로 표시됩니다. 실습 컨테이너에서는 실행되지 않는 명령이라 대표 출력을 표시했습니다.

서비스 상태와 최근 로그 확인

$ systemctl status httpd.service --no-pager
● httpd.service - The Apache HTTP Server
   Loaded: loaded (/usr/lib/systemd/system/httpd.service; enabled; vendor preset: disabled)
   Active: failed (Result: exit-code) since Tue 2026-09-15 10:21:03 KST; 2min ago
     Docs: man:httpd.service(8)
  Process: 1842 ExecStart=/usr/sbin/httpd $OPTIONS -DFOREGROUND (code=exited, status=1/FAILURE)
 Main PID: 1842 (code=exited, status=1/FAILURE)

Sep 15 10:21:03 web01 httpd[1842]: AH00526: Syntax error on line 12 of /etc/httpd/conf/httpd.conf
Sep 15 10:21:03 web01 systemd[1]: httpd.service: Main process exited, code=exited, status=1/FAILURE
Sep 15 10:21:03 web01 systemd[1]: httpd.service: Failed with result 'exit-code'.

활성 상태, 자동시작 설정, 메인 PID, 종료 코드와 최근 로그 몇 줄을 한 번에 봅니다. 유닛이 실패 상태이면 status 자체의 종료 코드는 3이 되며, 이는 정상적인 동작입니다. 실습 컨테이너에서는 실행되지 않는 명령이라 대표 출력을 표시했습니다.

서비스 유닛 목록에서 특정 서비스 찾기

$ systemctl list-units --type=service --all --no-pager | grep -E 'sshd|httpd'
● httpd.service   loaded    failed failed   The Apache HTTP Server
  sshd.service    loaded    active running OpenSSH server daemon

로드된 서비스 유닛 전체에서 원하는 서비스만 걸러 상태를 비교합니다. 일치하는 줄이 없으면 grep이 종료 코드 1을 반환합니다. 실습 컨테이너에서는 실행되지 않는 명령이라 대표 출력을 표시했습니다.

새 유닛 파일 등록 후 반영과 자동시작 설정

준비: printf '[Unit]\nDescription=Health Check\nAfter=network.target\n\n[Service]\nExecStart=/opt/healthcheck/run.sh\nUser=svc\nRestart=on-failure\n\n[Install]\nWantedBy=multi-user.target\n' > /etc/systemd/system/healthcheck.service

$ systemctl daemon-reload && systemctl enable healthcheck.service
Created symlink /etc/systemd/system/multi-user.target.wants/healthcheck.service → /etc/systemd/system/healthcheck.service.

유닛 파일을 /etc/systemd/system 에 둔 뒤 daemon-reload 로 반영하고 enable 로 부팅 자동시작을 등록합니다. [Install] 섹션이 없으면 enable이 실패합니다. 기존 유닛과 이름이 겹치지 않는지 먼저 확인하세요(systemctl cat 유닛명). 실습 컨테이너에서는 실행되지 않는 명령이라 대표 출력을 표시했습니다.

주의할 점

  • start는 지금 실행, enable은 부팅 시 자동 실행입니다. 둘은 별개이므로 재부팅 후에도 동작해야 한다면 enable을 따로 실행해야 합니다.
  • 유닛 파일을 수정하고 daemon-reload를 빠뜨리면 이전 설정이 그대로 적용됩니다. 수정 후에는 daemon-reload를 실행하세요.
  • [Install] 섹션(WantedBy)이 없는 유닛은 enable 시 대상이 없다는 오류가 납니다.
  • /usr/lib/systemd/system 의 배포판 제공 유닛 파일을 직접 편집하면 패키지 업데이트 시 변경 내용이 덮어써집니다. systemctl edit 로 드롭인을 만들거나 /etc/systemd/system 에 재정의 파일을 두세요.
  • status 출력의 로그는 마지막 몇 줄뿐입니다. 원인 분석은 journalctl -u 유닛명 으로 전체 로그를 확인해야 합니다.
  • is-active, is-enabled, status는 상태에 따라 0이 아닌 종료 코드를 반환합니다. set -e 를 쓰는 스크립트에서는 조건문으로 감싸야 중간에 종료되지 않습니다.

이 명령어로 풀 수 있는 실습 문제

브라우저 웹 터미널에서 바로 풀고 요구사항별로 자동 채점됩니다. 로그인 없이 5분 체험도 가능합니다.

관련 명령어

마지막 검수 2026-09-16 · 내용에 오류가 있으면 문제 페이지의 질문 기능으로 알려 주세요.