Ubuntu - systemd 시스템 및 서비스 관리자 설정 방법

4 분 소요

Ubuntu - systemd 시스템 및 서비스 관리자 설정 방법

systemd란?

Ubuntu에서 systemd는 시스템 및 서비스 관리자입니다. Linux 시스템에서 초기화 프로세스(시스템이 부팅할 때 가장 먼저 실행되는 프로세스)로 작동하며, 시스템이 시작할 때와 실행 중에 서비스를 관리하는 주요 도구입니다. systemd는 기존의 SysVinit 시스템을 대체하기 위해 개발되었으며, 여러 가지 측면에서 더 효율적인 관리와 빠른 부팅 시간을 제공합니다.

주요 특징:

  • 서비스 관리: systemd는 시스템의 서비스를 시작, 중지, 재시작 및 상태 확인 등을 관리합니다. 서비스는 .service 파일로 정의되며, 이 파일들은 서비스의 구성 및 동작 방식을 설명합니다.

  • 병렬 처리: systemd는 서비스의 종속성을 해결하면서 병렬로 서비스를 시작합니다. 이는 시스템의 부팅 시간을 단축시킵니다.

  • 유닛(unit) 관리: systemd는 서비스 외에도 타이머, 소켓, 디바이스, 마운트 포인트 등을 유닛으로 관리합니다. 각 유닛은 설정 파일로 관리되며, 이를 통해 시스템의 다양한 자원을 효율적으로 관리할 수 있습니다.

  • 로그 관리: systemd는 journald라는 서브시스템을 통해 시스템 로그를 관리합니다. 이는 전통적인 syslog 대신 사용되며, 로그 데이터를 효율적으로 수집, 관리할 수 있습니다.

  • cgroup 통합: systemd는 Linux의 cgroup 기능과 통합되어 있어, 프로세스 및 서비스의 리소스 사용을 제어할 수 있습니다.

systemd 기본 명령어:

서비스 상태 확인: systemctl status [서비스명]
서비스 시작: systemctl start [서비스명]
서비스 중지: systemctl stop [서비스명]
서비스 재시작: systemctl restart [서비스명]
서비스 활성화(부팅 시 자동 시작): systemctl enable [서비스명]
서비스 비활성화(부팅 시 자동 시작하지 않음): systemctl disable [서비스명]

systemd 서비스 파일 만들기

서비스 파일은 systemd가 서비스를 관리하기 위해 사용하는 유닛 파일 중 하나입니다. 특정 서비스의 시작, 중지, 관리 방법을 정의합니다. 이 파일은 보통 다음 경로에 위치합니다..service 확장자를 가집니다.

/etc/systemd/system/

기본적인 서비스 파일은 다음과 같은 섹션으로 구성됩니다:

[Unit]: 서비스에 대한 설명, 의존성 등의 메타데이터를 정의합니다.

[Service]: 서비스의 동작 방식(예: 어떻게 시작할지)을 정의합니다.

[Install]: systemctl enable 명령을 사용했을 때 어떻게 서비스가 활성화될지를 정의합니다.

아래는 간단한 웹 서버를 실행하기 위한 서비스 파일의 예제입니다:

[Unit]
Description=Simple Web Server
After=network.target

[Service]
ExecStart=/usr/bin/python3 -m http.server 8000
WorkingDirectory=/home/username/public_html
Restart=always
User=username
Group=username

[Install]
WantedBy=multi-user.target
  • Unit 섹션

Description: 서비스에 대한 간단한 설명입니다. After: 이 서비스가 시작되기 전에 먼저 시작해야 하는 유닛(여기서는 네트워크 서비스가 준비된 후)을 지정합니다.

  • Service 섹션

ExecStart: 서비스를 시작할 때 실행할 명령어입니다. 여기서는 Python3의 간단한 HTTP 서버 모듈을 사용하여 8000 포트에서 웹 서버를 시작합니다. WorkingDirectory: 서비스가 실행될 때 사용할 작업 디렉토리입니다. Restart: 서비스가 실패할 경우 재시작 여부를 정의합니다. always는 항상 재시작한다는 의미입니다. User와 Group: 서비스가 실행될 때 사용할 사용자 및 그룹입니다.

  • Install 섹션

WantedBy: 이 서비스가 어떤 타겟에 의해 시작되기를 원하는지 정의합니다. multi-user.target은 기본적인 멀티유저 시스템 상태를 의미합니다. 이 파일을 /etc/systemd/system/에 .service 확장자로 저장한 후, 다음 명령어를 사용하여 서비스를 활성화하고 시작할 수 있습니다:

sudo systemctl daemon-reload  # systemd에게 유닛 파일이 변경됐음을 알림
sudo systemctl enable my-web-server.service  # 서비스 활성화
sudo systemctl start my-web-server.service   # 서비스 시작

추가

이 코드는 일반적으로 서비스의 실행에 실패했을 때, 해당 실패 상태를 로깅하고 추가적인 오류 처리를 할 수 있는 구조를 제공합니다. 시스템의 서비스 관리자인 systemd의 단위 파일(unit file) 내의 ExecStart 지시문에 사용될 수 있는 명령어입니다.

서비스 코드 예제

ExecStart=/bin/bash -c '/home/../SomethingScript.sh -c --start || /tmp/exit_handler $?'

설명

  • 코드(1)
/bin/bash -c

: 새 bash 세션을 시작하고, -c 옵션 다음에 오는 명령어를 실행합니다.

  • 코드(2)
/home/../SomethingScript.sh --start

: /home/../ 디렉토리에 위치한 SomethingScript.sh 스크립트를 -c와 –start 옵션과 함께 실행합니다. 이 스크립트는 아마도 특정 노드 애플리케이션을 시작하는 역할을 할 것입니다.

  • 코드(3)
 ||

: 이전 명령어가 실패했을 경우 (즉, 0이 아닌 종료 코드를 반환했을 경우) 뒤따르는 명령어를 실행합니다.

  • 코드(4)
/tmp/exit_handler $?

: exit_handler 스크립트를 /tmp 디렉토리에서 실행합니다. $?는 바로 이전에 실행된 명령어의 종료 코드를 나타냅니다. 이 스크립트는 명령어 실행 실패 시 어떤 조치를 취할지 정의합니다.

bash 스크립트 예제

#!/bin/bash

CODE="${1:-N/A}"

echo CODE: $CODE

bash 스크립트 설명

  • 코드(1)
#!/bin/bash

: 이 스크립트가 bash 쉘을 사용하여 실행될 것임을 정의합니다.

  • 코드(2)
CODE="${1:-N/A}"

: 스크립트에 전달된 첫 번째 인자를 CODE 변수에 할당합니다. 인자가 없을 경우 N/A (Not Available)로 기본값을 설정합니다.

  • $ 기호

$ 기호는 변수의 값을 참조할 때 사용됩니다. 예를 들어, CODE라는 변수가 있고, 이 변수의 값을 출력하고 싶다면 $CODE라고 작성합니다. 또한, $1, $2 등은 스크립트로 전달된 인자들을 참조할 때 사용되는 위치 매개변수입니다. $1은 첫 번째 인자, $2는 두 번째 인자를 의미하며, 이런 식으로 계속됩니다.

  • {} (중괄호)

{}는 매개변수 확장, 명령어 대체, 혹은 산술 연산을 위한 구문에 사용됩니다. 변수 이름을 중괄호로 감싸는 것은 그 변수를 명확히 정의하는 데 도움이 되며, 특히 변수 이름과 그 뒤에 오는 텍스트가 구분이 필요한 경우 유용합니다.

  • ”${1:-N/A}”

이 구문은 매개변수 확장의 한 예로, 첫 번째 인자 $1의 값을 사용하되, 만약 $1이 설정되지 않았거나 null일 경우 기본값 N/A로 대체한다는 의미입니다. 즉, 스크립트에 첫 번째 인자가 전달되지 않으면 CODE 변수에는 N/A가 할당됩니다.

기본값 설정, ${variable:-default} 형식은 variable이 설정되어 있고 비어있지 않으면 그 값을 사용하고, 그렇지 않을 경우 default 값을 사용하라는 의미입니다.

${1:-N/A} 구문의 의미는 “첫 번째 위치 매개변수($1)가 설정되어 있고 null이 아니면 그 값을 사용하고, 그렇지 않으면 ‘N/A’를 사용하라”는 것입니다.

  • echo CODE: $CODE

: 할당된 CODE 변수의 값을 CODE: 라는 텍스트와 함께 출력합니다. 이는 스크립트가 실행됐을 때 어떤 종료 코드가 반환되었는지 확인하는 데 도움이 됩니다.

## Ubuntu 에서 tmp 폴더

Ubuntu를 비롯한 대부분의 Linux 배포판에서 /tmp 폴더는 임시 파일을 저장하기 위한 공간으로 사용됩니다. 이 디렉토리는 시스템 사용 중 생성되는 일시적인 파일들, 예를 들어 프로그램 실행 중 임시로 필요한 데이터 파일이나 프로세스 간 통신을 위한 소켓 파일 등이 저장되는 곳입니다.

/tmp 디렉토리의 주요 특징은 그 안에 저장된 파일들이 재부팅을 거치면 대부분 사라진다는 점입니다. 이러한 특성 때문에 /tmp는 임시 작업 파일을 저장할 장소로 적합하지만, 중요한 데이터를 장기간 보관할 목적으로는 적합하지 않습니다.

Ubuntu에서 /tmp 폴더의 정리 방식은 시스템 설정에 따라 다를 수 있습니다. 기본적으로는 시스템 재시작 시 /tmp 내의 파일들이 삭제되도록 설정되어 있지만, 이는 시스템의 tmpfiles.d 설정이나 systemd 서비스의 구성에 따라 달라질 수 있습니다. 일부 시스템에서는 tmpwatch나 tmpreaper 같은 유틸리티를 이용하여 정기적으로 /tmp 디렉토리를 정리하도록 설정되어 있을 수도 있습니다.

또한, 최신 시스템에서는 /tmp가 tmpfs 파일 시스템을 사용하여 메모리에 마운트되기도 합니다. 이 경우, /tmp 내의 데이터는 실제 디스크에 저장되지 않고 RAM에서 관리되므로, 시스템이 재시작되면 자동으로 내용이 지워지게 됩니다.

결론적으로, /tmp 폴더는 재부팅 시 내용이 삭제될 수 있으므로 임시 파일 저장용도로 사용되며, 장기간 보관이 필요한 중요한 파일을 저장하기에는 적합하지 않습니다.

댓글남기기