본문 바로가기

STUDY

Linux systemd 간단 정리

systemd

Linux 시스템 관리자, 서비스 관리자

초기화 시스템 (init), 시스템 서비스 관리자, 세션 관리자의 역할

대부분의 최신 리눅스 배포판에서 기본 초기화 시스템으로서 사용

init의 대체제

 

유닛 단위로 리소스 관리

 

유닛의 유형

  • service: 서비스나 애플리케이션 관리
  • target: 여러 유닛을 그룹화하여 관리. 유닛들을 조합하여 사용 가능
  • mount: 파일 시스템의 마운트 지점 관리. /etc/fstab의 마운트 지점을 유닛으로 변환 가능
  • timer: 시간 기반의 작업 스케줄링. cron 대체 가능
  • socket: IPC 소켓, 네트워크 소켓 관리
  • device: 시스템 디바이스 관리
  • path: 파일 시스템의 경로 감시

 

유닛 인식

  • /lib/systemd/system: 패키지 관리자에 의해 설치된 유닛 파일 저장
  • /etc/systemd/system: 시스템 관리자가 직접 생성하거나 수정한 유닛 파일들을 위한 디렉토리. /lib/systemd/system보다 우선권 가짐
  • /run/systemd/system: 실행 중일 때 생성되는 유닛 파일들을 저장. 재부팅 시 삭제

 

유닛의 구조

[Unit]
Description=Service Description
After=syslog.target network.target

[Service]
WorkingDirectory=/opt/onos/tools/build
ExecStart=/bin/bash -c "./onos-buck run onos-local -- clean-debug"
Restart=always
RestartSec=60

[Install]
WantedBy=multi-user.target

 

사용하는 옵션만 정리 (https://www.freedesktop.org/software/systemd/man/latest/systemd.service.html 에서 확인 가능)

  • WorkingDirectory: 프로세스의 작업 디렉토리를 지정한다. 별도의 지정이 없으면 유닛은 "/" 디렉토리를 작업 디렉토리로 사용한다. 특정 디렉토리에서 실행해야하는 프로세스에서 필요하다.
  • ExecStart: 구동 명령어(스크립트)를 선언한다. 실행 명령어는 반드시 절대 경로 또는 변수(${STRINGS} 등) 로 시작해야 한다. 다중 명령어를 지원한다. ex) ExecStart=”command 1; command 2; command 3” 또는 ExecStart=”command 1” ExecStart=”command 2”
  • Environment: 해당 유닛에서 사용할 환경 변수를 선언한다. 반드시 “Exec*=” 옵션보다 상단에 위치해야 한다. ex) Environment="ONE=one" 'TWO=two two'
  • Restart: 재시작 옵션. systemd {stop|restart}에는 적용 안됨. no: 재시작 X on-success: 유닛이 정상적으로 종료되었을 때. 0으로 코드 종료, oneshot이 아닌 type에 대해 {SIGHUP|SIGINT|SIGTERM|SIGPIPE}으로 종료, SuccessExitStatus= 정의된 상태로 종료 on-failure: 유닛이 비정상적으로 종료되었을 때. 0이 아닌 코드로 종료, {SIGHUP|SIGINT|SIGTERM|SIGPIPE}이 아닌 다른 시그널로 종료, Timeout 초과 on-abnormal: 유닛이 비정상적으로 종료되었을 때. on-failrue에서 0이 아닌 코드로 종료 조건 제외 on-watchdog: watchdog Timeout 초과 on-abort: 포착되지않은 시그널에 의해 종료 always: 모든 조건 포함

  • RestartSec: 재시작 대기 시간 옵션. 기본값 100ms. ex) RestartSec=60. 단위 없으면 초 단위로 적용. RestartSec=5min 20s. 단위 명시 가능.
  • StartLimitIntervalSec=interval, StartLimitBurst=burst 제한된 시간에 너무 많은 재시작을 방지하는 옵션 ex) StartLimitIntervalSec=10s StartLimitBurst=5 일 경우, 10초 내로 5번 이상 재시작을 시도하면 Fail이 발생해서 관리자가 수동으로 복구해야한다.
  • WantedBy: Wants와 관계있는 옵션으로, 하위 종속성을 의미하나 Require보다 약한 관계로 필요조건에 해당하지는 않는다.

 

systemctl 명령어

  • systemctl daemon-reload: systemctl 설정 로드. 변경사항 적용
  • systemctl enable <service>: 서비스 enable (부팅 시 자동 시작)
  • systemctl disable <service>: 서비스 disable (부팅 시 자동 시작 해제)
  • systemctl start <service>: 서비스 시작
  • systemctl stop <service>: 서비스 종료
  • systemctl restart <service>: 서비스 재시작
  • systemctl kill <service>: 서비스 강제 종료
  • systemctl status <service>: 서비스 상태 확인
  • systemctl is-enabled <service>: 서비스 enable 여부 확인
  • systemctl is-active <service>: 서비스 활성 상태 여부 확인
  • systemctl list-units --type=service: 현재 활성화 서비스 조회
  • systemctl list-unit-files --type=service: 모든 서비스 파일 목록과 상태 조회

 

추가 도구

  • bootctl: EFI 펌웨어 부팅 설정과 부트 로더 관리 도구.
  • timedatectl: 날짜, 시간 관리 도구. 시간 설정, 시간대 설정, NTP 등 관리
  • coredumpctl: 코어 덤프를 관리하고 검사하는 도구.
  • journalctl: 시스템 로그 확인 도구. 서비스의 로그도 확인할 수 있다. ex) sudo journalctl -u onos.service

참고자료

https://cumulus.tistory.com/158

https://fmd1225.tistory.com/93

https://www.freedesktop.org/software/systemd/man/latest/systemd.html

https://www.freedesktop.org/software/systemd/man/latest/systemd.service.html