Infrastructure & Systems/Linux

[Linux] systemd (System Daemon)

EndiYou 2024. 11. 19. 08:04

Linux에서 사용되는 시스템 및 서비스 관리자


1. 역할 및 기능

  • 운영체제 초기화 (운영체제 핵심 구성요소 시작, 관리하는 역할)
    • Kernel 로딩 후 루트 프로세스 실행
    • Hardware 초기화 (네트워크 카드, 그래픽 카드, 사운드 카드 등 장치 드라이버 초기화)
    • File System 마운트 (/etc/fstab 파일 정보 기반 시스템 마운트)
    • System Service 시작 (Network Service, SSH Server..)
    • 사용자 환경 준비 (Display Manager 실행)
    • System Status Monitoring (systemctl status로 보이는 서비스 상태나 시스템 자체의 이벤트 관리)
    • System 종료 관리 (시스템과 관련된 열린 파일 종료하고, 실행 중인 프로세스 안전하게 종료)
  • Unit 관리 (Service, Socket, Device, Mount Point...)
    • .service / .socket / .device / .mount 확장자를 가진 설정 파일로 정의
    • 다음 세 개의 디렉터리에 Unit 설정 파일을 분산 관리
      • /etc/systemd/system/ : runtime으로 생성된 임시 Unit 파일 저장소
      • /usr/lib/systemd/system/ : 패키지 관리자에 의해 설치된 default Unit 파일 저장소
    • 사용자 정의 Unit 설정 파일은 /etc/systemd/system/ 디렉터리에 정의
  • 의존성 관리
    • 서비스 간의 의존성을 자동으로 관리
    • 의존성 관리를 통해 부팅 시 여러 서비스 병렬 시작이 가능하게 하고, 부팅속도 향상에 기여
  • cgroup 기능을 이용해 프로세스 그룹의 리소스 사용을 제어
  • 시스템 로그를 중앙에서 관리하는 journalctl 서비스 제공
  • networkd 를 이용해 네트워크 관리

2. 사용자 정의 Unit 구성요소

  • [Unit] : 서비스에 대한 설명, 의존성 정의
  • [Service] : 서비스 실행 방법, 환경 지정
  • [Install] : 서비스 활성화 방법 정의

2.1 사용자 정의 Unit 설정 예시 (.service 확장자 기준)

  • /etc/systemd/system/ 디렉터리에 {SERVICE_NAME}.service 확장자 형식으로 파일 생성
vim /etc/systemd/system/example_application.service
  • [Unit] / [Service] / [Install] 섹션 구성
[Unit]
Description=Run main.py on server boot
After=network.target

[Service]
ExecStart=/usr/bin/python /home/ec2-user/tests/backend/src/main.py
WorkingDirectory=/home/ec2-user/tests/backend/src
Restart=always
User=root
StandardOutput=append:/var/log/example_application.log
StandardError=append:/var/log/example_application.log

[Install]
WantedBy=multi-user.target
  • [Unit]
    • Description : 서비스에 대한 설명
    • After : Network 서비스 이후 실행하도록 설정
      ※ 기타 지시자: Before, Wants, Requires, BindsTo, Conflicts, PartOf, OnFailure
  • [Service]
    • ExecStart : 서비스 실행 명령어 지정
    • WorkingDirectory : 서비스 실행할 작업 디렉토리 설정
    • Restart : 서비스가 종료되면 항상 재시작하도록 설정
    • User : 서비스 실행 사용자 지정
    • StandardOutput=append: 서비스 표준 출력(stdout)을 특정 위치에 log 파일로 추가 하도록 지정
    • StandardError=append: 서비스 표준 에러(stderr)를 특정 위치에 log 파일로 추가 하도록 지정
  • [Install]
    • WantsBy : 서비스를 어떤 TARGET에게 연결할지 지정
      • 지정된 TARGET이 활성화 될 때 해당 서비스도 활성화 되도록 지정하는 것
      • TARGET List : multiiuser-target, network.target, network-online.targer, basic.target

3. 관련 명령어

3.1 systemctl 

서비스 관리 (시작, 종료, 재시작 등)를 위한 주요 명령어
  • 서비스 시작
systemctl start example_application.service
  • 서비스 종료
systemctl stop example_application.service
  • 서비스 재시작
systemctl restart example_application.service
  • 서비스 자동 재실행
systemctl enable example_application.service
  • journalctl : 관련 로그 조회 명령