systemd 개념

systemd는 리눅스 시스템에서 초기화 및 시스템 관리를 담당하는 소프트웨어 스위트입니다. 이는 SysVinit 및 Upstart 등의 초기화 시스템을 대체하기 위해 개발되었습니다. systemd는 초기화 프로세스를 시작하는 것뿐만 아니라 다양한 시스템 및 서비스 관리 작업을 담당하여 리눅스 운영 체제에서의 시스템 구성 및 관리를 향상시킵니다.

 

systemd의 주요 특징과 구성 요소

  • 시작 시 초기화 및 부팅 관리
    • systemd는 부팅 프로세스를 관리하며, 시스템의 초기화 및 부팅을 담당합니다.
      이는 리눅스 시스템의 부팅 시간을 단축하고, 병렬로 작업을 처리하여 효율성을 높이는 데 도움이 됩니다.
  • 시스템 및 서비스 관리
    • systemd는 다양한 시스템 서비스 및 프로세스를 관리합니다.
      각 서비스에 대한 설정 파일을 사용하여 서비스를 시작, 중지, 재시작하고, 의존 관계를 설정할 수 있습니다.
  • 로그 및 저널링
    • systemd는 강력한 로깅 및 저널링 시스템을 제공합니다.
      “systemd-journald”는 시스템 로그를 수집하고 쿼리할 수 있는 기능을 제공하여 문제 해결 및 모니터링을 용이하게 합니다.
  • 컨트롤 그룹 (cgroup) 관리
    • systemd는 리눅스 커널의 cgroup을 사용하여 프로세스 그룹을 제어하고 리소스 할당 및 제한을 관리합니다. 이를 통해 프로세스의 동작을 제어하고 성능을 최적화할 수 있습니다.
  • 네트워크 설정 및 호스트 이름 관리
    • systemd는 네트워크 설정 및 호스트 이름 관리를 쉽게 수행할 수 있는 도구들을 제공합니다.
  • 타이머 및 작업 스케줄링
    • systemd는 시스템 내에서 주기적으로 실행되는 타이머와 작업을 지원합니다.

 

Systemd 생성

서비스(unit) 파일 생성

일반적으로 systemd unit 파일은 /etc/systemd/system/ 디렉터리에 위치합니다.
예를 들어, my_service.service라는 이름의 서비스 파일을 만들어 보겠습니다.

vim /etc/systemd/system/my_service.service

 

Unit 파일 작성

다음은 간단한 예제 서비스 파일의 내용입니다.
여기서는 사용자가 지정한 명령을 실행하는 서비스를 생성하는 것입니다.

[Unit]
Description=My Custom Service
After=network.target # 네트워크가 활성화된 후에 서비스 시작

[Service]
Type=simple
ExecStart=/usr/bin/my_command # 여기에 실행할 명령을 지정
Restart=always # 서비스가 실패하면 항상 다시 시작

[Install]
WantedBy=default.target # 기본 타겟에 서비스 추가

 

systemd에게 새로운 서비스를 알리기

다음 명령을 사용하여 systemd에게 새로운 서비스를 등록하고 시작합니다.

sudo systemctl daemon-reload # 설정 변경을 시스템에 적용
sudo systemctl start my_service # 서비스 시작
sudo systemctl enable my_service # 부팅 시 자동으로 서비스 시작

 

Systemd service 생성 Script

아래 스크립트는 파일로 저장학고 실행권한을 부여하여 실행하면 /var/log/my_script_TEST.log에 지속적으로 로그가 남게 됩니다.

tail -f /var/log/my_script_TEST.log 를 하게되면 10초 마다 남는 로그를 실시간으로 확인 할 수 있습니다.

#!/bin/bash


# 1. "Hello World" 스크립트 및 로그 파일 작성
echo '#!/bin/bash
LOG_FILE="/var/log/my_script_TEST.log"
COUNT=0


# 만약 로그 파일이 존재하지 않으면 생성
[ -f "$LOG_FILE" ] || touch "$LOG_FILE"


while true; do
  ((COUNT++))
  echo "Count: $COUNT - Hello World from my_script.sh"
  echo "Count: $COUNT - Hello World from my_script.sh" >> "$LOG_FILE"
  sleep 10
done' | sudo tee /usr/local/bin/my_script.sh


# 2. 실행 권한 부여
sudo chmod +x /usr/local/bin/my_script.sh


# 3. systemd unit 파일 작성
echo '[Unit]
Description=My Script Service


[Service]
Type=simple
ExecStart=/usr/local/bin/my_script.sh


[Install]
WantedBy=default.target' | sudo tee /etc/systemd/system/my_script.service


# 4. 변경사항 저장 및 종료
sudo systemctl daemon-reload


# 5. systemd에게 새로운 서비스를 알리고 시작
sudo systemctl start my_script


# 6. 자동 시작 설정
sudo systemctl enable my_script


echo "스크립트 실행이 완료되었습니다."