본문 바로가기
오픈소스 읽기 (OLD)/Init 시스템 - Systemd

3. Systemd 깊이보기 - systemctl

by 커널패닉 2021. 3. 22.
반응형

같은 카테고리의 글 보기

www.kernelpanic.kr/category/%EC%98%A4%ED%94%88%EC%86%8C%EC%8A%A4%20%EC%9D%BD%EA%B8%B0/Init%20%EC%8B%9C%EC%8A%A4%ED%85%9C%20-%20Systemd

 

'오픈소스 읽기/Init 시스템 - Systemd' 카테고리의 글 목록

 

www.kernelpanic.kr

 

systemctl는 systemd를 모니터링하고, 컨트롤하는 가장 중요한 유틸리티이다. 앞선 hedone21.tistory.com/18 포스트에서는 가장 많이 사용되는 systemctl 명령어에 대해 간단히 알아보았다면, 이번 포스트에서는 systemctl로 할 수 있는 다양한 작업들에 대해 살펴보려 한다.

용어정리
이번 포스트에서 주구장찰 사용될 Unit은 서비스, 마운트 포인트, 디바이스, 소켓 등을 포괄하는 개념이다.

3.1 Systemd 상태 모니터링

systemctl 유틸리티가 제공하는 첫 번째 주된 기능은 systemd의 상태를 모니터링 하는 일이다. 우선 systemd의 전체 유닛들을 모니터링 하는 방법은 크게 아래 세가지가 있다.

$ systemctl status            # 실행중인 유닛 상태 정보 출력

$ systemctl                       # == systemctl list-units, 로딩된 유닛을 출력

$ systemctl list-unit-files   # 설치된 유닛을 출력

세 가지 명령어가 굉장히 유사해 보이는데, 자세히 보면 미묘하게 차이점들이 있다. 우선 systemctl status 명령어는 유닛들을 cgroup으로 묶어서 보여준다. (cgroup(control group)은 리눅스가 프로세스 그룹이 소모하는 자원을 컨트롤 하는 기능이다.) 이 명령어를 이용하면 systemd에서 유닛들이 어떤 cgroup으로 묶여서 실행되는지를 쉽게 파악할 수 있다. 또한 위에서 state: degraded에서 볼 수 있듯이 전체적으로 몇 개의 유닛이 오동작하는지도 확인할 수 있다. systemctl --failed 명령어를 통해서 오동작 하는 유닛에 대해 자세히 볼 수 있다.

systemctl 또는 systemctl list-units 명령어는 로딩된 활성(혹은 활성화 중에 실패한) 유닛을 출력하는 기능이다. 출력되는 항목은 systemctl status와 유사하다. 다만 cgroup에 의한 관계나 systemd의 전체 유닛 실행 현황을 보여주지 않는 대신, unit 파일 이름(Unit), 유닛 활성화 상태(Active, Sub), 상세 설명(Desc) 등 더 디테일한 정보를 제공한다. systemctl list-units --all 옵션을 통해서 로딩되었지만 활성화 되지 않은 서비스도 출력 가능하다.

마지막으로 systemctl list-unit-files는 설치된 파일들을 출력한다. 즉 로딩되지 않았더라도 유닛 파일(.service, .mount, .device 등)로 있는 모든 서비스를 출력한다.

3.2 Systemd 유닛 컨트롤

systemd의 유닛을 컨트롤 하는 명령어는 직관적이다. 등록(enable)과 활성화(start) 개념이 약간 혼동될 수 있는데, 등록을 하면 재부팅 시 유닛이 실행되고, 활성화는 지금 당장 실행된다는 차이가 있다. 기본적인 유닛 컨트롤 명령어들은 다음과 같다.

# systemctl start <unit>         # 유닛 활성화
# systemctl stop <unit>          # 유닛 비활성화
# systemctl restart <unit>      # 유닛을 종료 후 재활성화
# systemctl enable <unit>      # 유닛 등록
# systemctl disable <unit>      # 유닛 등록 해제
# systemctl enable --now <unit> # 유닛 등록 및 활성화

대부분의 경우에는 위의 명령어만 알면 충분하다. 다만 간혹가다가 이런 상황을 겪을 수 있다. 특정 유닛을 비활성화 하고 싶은데, 다른 유닛들이 해당 유닛에 의존관계가 있는 경우이다. 이런 경우에는 해당 유닛을 비활성화 하면, 다른 유닛들도 의존성 관계 때문에 동작하지 않게 된다. 이런 경우에는 mask 옵션을 이용해서, 해당 유닛을 실행하되 아무 작업도 하지 않도록 하는 방법이 있다.

# systemctl mask <unit>     # unit 마스킹 (동작 안함)
# systemctl unmask <unit> # unit 마스킹 해제
반응형