본문으로 바로가기

[리눅스] systemd란? systemd unit파일 작성 방법

category IT/Linux 2022. 1. 5. 23:14
반응형

systemd 란?

systemd(system daemon)은 Unix 시스템이 부팅후에 가장 먼저 생성된 후에 다른 프로세스를 실행하는 init 역할을 대체하는 데몬입니다. Red Hat 에서 주도적으로 개발을 시작했고 지금은 RHEL/CentOS 와 Ubuntu 나 Arch 등 대부분의 리눅스 시스템에 공식적으로 채택되었습니다.

systemd(system daemon)는 1번 프로세스 ID를 갖고 있으며 부팅부터 서비스관리 로그관리 등을 담당합니다. 또한 부팅시에 병렬로 실행되어서 부팅속도가 빠릅니다. 오래전에 사용하던 init방식은 부팅 과정에서 단계적으로 run-level을 올려가며 해당 run-level에 포함된 스크립트들을 순차적으로 실행시키니 설정이 복잡했으며 속도마저 느렸었습니다.

부팅시 필요한 작업을 systemd unit으로 등록하여 사용할 수 있으며 unit 파일 생성 방법은 아래와 같습니다.

systemd unit 위치와 파일명

### systemd unit 파일 경로
ls -al /etc/systemd/system

### systemd unit 파일 예시
cat /etc/systemd/system/example.service

systemd 파일의 섹션

  • Unit
  • Service
  • Install
  • Socket
  • Mount
  • Automount
  • Swap
  • Path
  • Timer
  • Slice

주요 섹션 설명

Unit 섹션

  • Description : 서비스 설명
  • After : 본 서비스 이전에 시작할 서비스
  • Before : 본 서비스 이후에 시작할 서비스
  • Requires : 본 서비스와 의존관계의 서비스로 반드시 실행되어야 본서비스가 실행
  • Wants : Requires보다 약한 의존관계로 설령 서비스가 실행되지 않더라도 본서비스가 실행됨

Service 섹션

  • Type : Type 에는 simple, forking, oneshot, dbus, notify, idle 중에 1개를 입력
    • simple : deafult값. 유닛이 시작된 경우 즉시 systemd는 유닛의 시작이 완료 되었다고 판단함. 다른 유닛과 통신하기 위해 소켓을 사용하는 경우 이 설정을 하면안됌
    • forking : 자식 프로세스가 생성완료 되는 단계까지를 systemd가 시작완료 되었다고 판단하며 부모 프로세스를 추적할 수 있도록 PIDFile 필드에 PID파일을 선언해주어야함
    • oneshot : 메인 프로세스가 시작되면 상태를 activating 으로 바꾸고 끝날때까지 기다리며 해당 메인 프로세스가 끝나야지만 다음 systemd unit으로 넘어간다. 또한 해당 실행이 종료되더라도 RemainAfterExit=yes 옵션을 통해 유닛이 활성화 상태로 간주할 수 있다.
    • dbus : simple과 유사, DBUS에 지정된 BusName이 준비될 때까지 대기하며 DBUS 준비가 완료된 이후에 프로세스 시작
    • notify : simple과 유사, systemd에 시그널을 보내고 시그널에 대한 내용은  libsystemd-daemon.so 에 선언 되어있음
    • idle : simple과 유사, 모든 서비스가 실행된 후에 실행됨
  • EnvironmentFile : 서비스의 환경설정을 파일을 지정
  • ExecStartPre : 서비스 시작하기 전에 실행할 명령을 설정
  • ExecStart : 서비스를 시작하기 위한 full path 및 실행 인자를 설정
  • ExecStartPost : 서비스를 시작한 이후에 실행할 명령을 설정
  • ExecStop : 서비스를 종료할 때 실행할 명령을 설정
  • ExecStopPost : 서비스 종료 명령 이후에 실행할 명령을 설정
  • ExecReload : 서비스가 reload 될때 필요한 명령어나 스크립트를 지정
  • KillMode : 프로세스가 어떻게 중지 되는지 결정함
  • Restart : on-failure는 어떤 문제로 인해 0이아닌 Exit코드를 보여주고 중지될 경우 서비스를 다시시작, 반대로 on-success는 프로세스가 아무런 문제없이 Exit코드가 0인 경우 다시 그 서비스를 시작하라는 의미
  • RestartSec : 서비스를 다시 시작하기전에 이 시간동안 서비스를 Sleep상태로 두라는 의미
  • RemainAfterExit : (yes|no) 유닛이 종료 이후에도 유닛이 활성화 상태로 판단함
  • TimeoutSec : 서비스 종료시 대기하는 시간

Install 섹션

  • 부팅 시에 Unit이 활성화나 비활성화를 위해 사용하는 명령어. 값이 default.target이면 링크 파일을 생성하지 않고 multi-user.target 이면 링크 파일을 생성함

systemd Unit 예시

[Unit]
Description=Systemd Test Daemon
After=after-example.service
Requires=after-example.service

[Service]
Type=simple
ExecStart=/usr/local/bin/example-daemon.sh
Restart=on-failure

[Install]
WantedBy=multi-user.target
반응형