Study_note
[etc] systemd 및 service 등록 본문
systemd 란?
systemd는 부팅후에 가장 먼저 생성된 후에 다른 프로세스를 실행하는 init 역할을 대체하는 데몬이다.
예전 리눅스 같은 경우 init 프로세스 사용하여 단계적으로 run level이 올라가면서 runlevel에 포함된 rc 스크립트들을 순차적으로 실행하였다
→ 프로그램 복잡해질수록 효율 저하
systemd는 init의 단점 보완하고 리눅스의 의존성을 해치지 않도록 개발하였고 systemd는 가능한 한 병렬로 시작 프로그르매들을 실행 시켜 부팅 속도 끌어올리고, 프로그램 실행을 위한 파일로 스크립트가 아닌 service라는 systemd만의 unit을 통해 체계적이면서 가독성이 좋도록 개발했다
실행되어지는 프로세스를 검색하면 pid는 1이며 ppid는 0으로
부팅후에 가장 먼저 프로세스를 실행되어지는것(pid는 1)과 커널에서 실행켜진다는것(ppid는 0)을 알 수 있다.
아래 명령어 입력시 생성되어진 service들을 확인 가능하다.
현재 service를 list하며 disable인지 able인지 확인
systemctl list-unit-files --type service
service가 있는 경로에서 service만 리스트
ls -al /usr/lib/systemd/system | grep service
현재 디폴로 되어진 타겟을 리스트
systemctl get-default
---
여기서 타겟이란 쉽게 생각하여 run level이라 생각하면 좋다.
graphical.target -> 5단계 그래픽 실행모드
multi-user.target -> 3단계 멀티유저 실행모드
systemctl service는 섹션으로 이루어졌으면 주로 Unit,Install, Service를 사용한다.
그 외 Socket, Mount, Automount, Swap, Path, Timer, Slice 등이 있다.
제일 하단 참조 문서를 확인하면 Unit, Service에 대한 옵션들이 설명되어있다. 간단하게 설명하면 아래와 같다.
(실제로 작업들은 service 섹션에서 실행되기 때문에 중요!)
Unit 섹션 옵션
- Description : 서비스 설명
- After : 본 서비스 이전에 시작할 서비스
- Before : 본 서비스 이후에 시작할 서비스
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 : 서비스 종료시 대기하는 시간
service를 등록하고 systemd로 관리를 해보면 아래와 같다.
아래와 같이 5초마다 로그를 출력하는 파이썬 스크립트를 생성했다.
#!/usr/bin/python3
import logging
import time
logging.basicConfig(level=logging.INFO, format="'%(asctime)s - %(message)s'")
def main():
logging.info("Running test.py service")
while True:
main()
time.sleep(5)
다음으로는 systemd service 등록해본다
해당 경로에 test.service라는 systmd service 생성
vi /usr/lib/systemd/system/test.service
---
[Unit]
Description=test systemd service
[Service]
Type=simple
ExecStart=/home/ec2-user/log.py
[Install]
WantedBy=multi-user.target
systemd service에서 사용 가능한 명령어는 다음과 같다.
systemd 관리자 구성을 다시 로드
systemctl daemon-reload
서비스 시작
systemctl start test
부팅 시 자동으로 시작
systemctl enable test
서비스 중지
systemctl stop test
부팅 시 자동으로 중지
systemctl disenable test
서비스 상태 확인
systemctl status test
start, enable 후 status 명령어 하니 active 확인
stop 후 상태 확인 하면 inactive 확인
참조 문서
'Terraform' 카테고리의 다른 글
[kubernetes] Headless service (0) | 2023.03.14 |
---|---|
EKS Upgrade 1.22 -> 1.23 version (0) | 2023.03.13 |
[Terraform] 반복문, if문 (for, for_each, count, if) (0) | 2022.10.11 |
[Terraform] 모듈 (입력 변수, 지역 변수, 출력 변수, 파일 경로, 인라인 블록) (0) | 2022.10.05 |
[Terraform] 상태 파일, 원격 Backend, remote_state (2) (1) | 2022.09.29 |