IT/Linux

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

반응형

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
반응형