Linux systemd

이재연·2021년 9월 15일
0

리눅스에서는(RHEL, CentOS, Ubuntu등 일부 배포버전) 시스템을 부팅하면 systemd가 가장 먼저 실행된다.

systemd는 기존 init 의 역할인 다른 프로세스의 관리 및 제어를 담당한다. 시스템과 함께 가장 먼저 실행되며 시스템 종료 직전 가장 마지막으로 종료되는 데몬 프로세스이다.

다른 프로세스를 관리하는 역할 이외에도 이벤트 로깅, 사용자 세션 관리, 시스템 부팅 등 다양한 기능을 제공한다.

Deamon/Service란?
일반적으로 Background에서 동작하며, 시스템과 함께 계속 동작하는 프로세스를 의미한다.
리눅스에서는 프로세스명 뒤에 d를 붙여서 이를 구분하기도 한다. (systemd,sshd 등)

ps -ef

systemd는 PID 1을 가지고 있다.

systemd

systemd는 프로세스들을 ‘unit’(유닛) 으로 관리한다.
systemd에서 관리하는 Unit은 유형에 따라 ".service", ".socket", ".device", ".mount", ".automount", ".swap", ".target", ".path", ".timer", ".slice", ".scope" 등의 확장자를 가진다.

systemd는 사용자가 사용할 수 있는 다양한 유틸리티를 제공한다.
systemd

출처 : https://commons.wikimedia.org/w/index.php?curid=28698339

아래부터는 서비스 유닛(.service)을 기준으로 설명합니다.

systemctl

서비스 관리에 필요한 기능을 제공한다.
모든 명령어는 -h 또는 --help 옵션을 통해 확인 할 수 있다.

systemctl -h

Unit Command

Unit Command

Unit File Command

Unit File Command

systemctl 중 자주 사용하는 명령어인 Unit Command와 Unit File Command.

Unit 주요 명령어

서비스 동작에 관한 기능

  • 서비스 목록 확인
systemctl list-units

실행중인 서비스 목록을 표출한다.

  • 서비스 시작
systemctl start [Unit]

[Unit]에 해당하는 서비스를 시작한다.

  • 서비스 정지
systemctl stop [Unit]

[Unit]에 해당하는 서비스를 정지한다.

  • 서비스 갱신
systemctl reload [Unit]

[Unit]에 해당하는 설정을 변경한다.

  • 서비스 재시작
systemctl restart [Unit]

[Unit]에 해당하는 서비스를 정지하고 시작한다.

  • 서비스 상태 확인
systemctl state [Unit]

[Unit]에 해당하는 서비스 상태를 확인한다.

Unit File 주요 명령어

서비스 파일에 관한 기능

  • 서비스 확인
systemctl list-unit-files

모든 서비스 목록을 확인 할 수 있다.

  • 서비스 등록
systemctl enable [Unit]

[Unit]에 해당하는 서비스를 등록한다.

  • 서비스 제거
systemctl disable [Unit]

[Unit]에 해당하는 서비스를 제거한다.

journalctl

실행중인 서비스 로그에 관한 기능을 제공한다.

-h 또는 --help 옵션으로 명령어를 확인 할 수 있다.

journalctl -h

journalctl

journalctl 주요 명령어

자주 사용하는 옵션
-u : 특정 서비스 로그를 출력한다.

-f : 가장 최근 로그를 따라 출력한다.

-r : 최근 내용을 먼저 출력한다.

-S : 특정 날짜 이후 로그만 출력한다.

-U : 특정 날짜 이전 로그만 출력한다.

서비스 이름은 systemctl의 list-units 명령어나 list-unit-files 명령어를 통해 확인 할 수 있다.

  • 특정 서비스 로그 보기
journalctl -u [Unit]

[Unit]의 로그를 볼 수 있다.

  • 특정 서비스 로그 역순으로 보기
journalctl -u [Unit] -r

[Unit]의 로그를 역순으로 볼 수 있다.

  • 특정 서비스 로그 팔로우
journalctl -u [Unit] -f

[Unit]의 로그를 따라서 출력한다.

  • 특정 서비스의 특정 기간 로그 보기
journalctl -u [Unit] -S "2021-09-13 00:00:00" -U "2021-09-13 12:00:00"

[Unit]의 2021년 9월 13일 00시 부터 2021년 9월 13일 12시 까지 로그를 출력한다.

서비스 등록

서비스 유닛은 .service 파일을 작성하여 systemd에 등록 할 수 있으며, 등록된 서비스는 systemctl을 통해서 관리 할 수 있다.

.service 파일은 [Unit], [Service], [Install] 3개의 섹션으로 구성되어있다.
파일은 대소문자를 구분하며 key-value(key=value) 형식을 사용한다.

각 섹션별로 옵션을 설정하여 유닛에 대한 정보를 파일에 기술한다.

[Unit]

유닛에 대한 메타데이터 정보나 다른 유닛과의 관계에 대한 내용을 설정한다.

Description : 유닛에 대한 설명 systemctl list-units의 DESCRIPTION 영역에서 볼 수 있다.
Documentation : 유닛에 대한 문서 URI 형식으로 작성
Before : 현재 유닛이 시작하고 나면 시작할 유닛을 기술한다.
After : 현재 유닛을 시작하기 전에 시작되는 유닛을 기술한다.
Requires : 현재 유닛이 의존하는 유닛을 기술한다. 여기에 기술된 유닛들이 정상적으로 시작되어야 현재 유닛을 시작한다.
Wants : Requires 보다 약한 의존성을 가진다. 여기에 기술된 유닛들을 먼저 실행하지만 실패해도 현재 유닛을 시작한다.

[Service]

서비스 유닛에 대한 내용을 설정한다.

Type : 서비스 유닛의 타입을 지정한다.
simple - 서비스를 시작한다. ExecStart에 정의된 프로세스를 실행한다.
forking - 부모 프로세스를 종료하고 자식 프로세스를 실행한다.
oneshot - 주로 단일 작업을 사용할 때 지정한다. 다음 유닛을 실행하기 전에 현재 유닛을 종료한다.
dbus - D-Bus를 사용하는 경우에 지정한다.
notify - 서비스 시작이 완료되면 알림을 보낸다. systemd는 이 알림을 받을 때 까지 기다린다.
idle - 모든 작업이 실행 될 때 까지 서비스가 실행되지 않는다.
ExecStart : 프로세스를 시작하는 명령어를 작성한다.
ExecStop : 프로세스를 중지하기 위한 명령어를 작성한다.
ExecReload : 프로세스를 재구성 하기 위해 필요한 명령어를 작성한다.
Restart : 프로세스를 재시작 하기 위해 필요한 명령어를 작성한다.

[Install]

유닛의 등록에 관한 내용을 설정한다.

Alias : 유닛의 별명을 지정한다. systemctl 에서 별명을 사용해서 관리 할 수 있다.
WantedBy : [Unit]의 Wants랑 같은 기능을 제공한다. 차이점은 /etc/systemd/system 디렉토리에 .wants 파일을 생성하고 유닛을 관리한다.
RequiredBy : [Unit]의 Requires와 같은 기능을 제공한다. .requires 파일로 관리한다.
Also : 유닛 그룹을 지정한다. 현재 유닛이 활성 상태일 때 사용 가능한 유닛들을 지정할 수 있다.

그 외 옵션
Unit, Install 옵션 : systemd.unit
Service 옵션 : systemd.service
그 외 유닛 파일 및 옵션 : systemd.syntax

출처

https://www.freedesktop.org/software/systemd/man/index.html
https://en.wikipedia.org/wiki/Systemd
https://www.lesstif.com/system-admin/systemd-system-daemon-systemctl-24445064.html
https://www.shellhacks.com/systemd-service-file-example/
https://www.digitalocean.com/community/tutorials/understanding-systemd-units-and-unit-files

0개의 댓글