티스토리 뷰
systemd
Systemd는 리눅스 운영 체제에서 사용되는 시스템 및 서비스 관리자입니다.
기본적으로 시스템 초기화 및 서비스 관리를 담당하는 init 시스템의 대안으로 개발되었습니다.
Systemd는 다음과 같은 주요 기능을 제공합니다.
1. 부팅 및 초기화 관리
Systemd는 리눅스 시스템의 부팅 및 초기화를 관리합니다.
이를 통해 병렬 부팅(parallel booting)과 동시 부팅(concurrent booting)을 지원하여 부팅 시간을 단축할 수 있습니다.
2. 서비스 관리
Systemd는 시스템에서 실행되는 서비스, 데몬 및 프로세스를 관리합니다.
서비스를 시작, 중지, 다시 시작하고 상태를 모니터링할 수 있습니다.
3. 유닛 및 유닛 파일
Systemd는 시스템 구성 요소를 단위로 구성된 유닛(unit)으로 관리합니다.
각 유닛은 서비스, 장치, 소켓 등과 같은 특정한 시스템 구성 요소를 나타냅니다.
Systemd는 유닛 파일을 사용하여 각 유닛의 구성을 정의합니다.
4. 로그 및 로깅 관리
Systemd는 시스템 로그를 관리하고 로깅을 지원합니다.
Journalctl이라는 도구를 사용하여 로그를 검색하고 필터링할 수 있습니다.
5. cgroups(Integrated with systemd)
Systemd는 컨트롤 그룹(cgroups)을 사용하여 프로세스 그룹을 제어하고 리소스 사용량을 관리합니다.
이를 통해 서비스 및 프로세스에 대한 자원 할당 및 제한을 설정할 수 있습니다.
Systemd는 많은 리눅스 배포판에서 표준 init 시스템으로 채택되어 있으며, 많은 장점과 기능을 제공합니다.
하지만 일부 사용자들은 init 시스템의 표준화를 논쟁해왔고, 다양한 init 시스템의 대안이 존재합니다.
예제
1. 부팅 및 초기화 관리
Systemd를 사용하여 부팅 및 초기화를 관리하는 간단한 예제입니다.
이 예제는 systemd 서비스를 생성하고 이를 부팅 시 자동으로 실행되도록 구성하는 과정을 보여줍니다.
1) Systemd 서비스 파일 생성
먼저, Systemd 서비스 파일을 생성합니다.
예를 들어, 간단한 "hello.service"라는 서비스 파일을 생성합니다.
[Unit] Description=Hello World Service [Service] Type=simple ExecStart=/usr/bin/echo "Hello, world!" [Install] WantedBy=multi-user.target |
이 서비스 파일은 "Hello, world!"라는 메시지를 출력하는 간단한 서비스를 정의합니다.
2) 서비스 파일 저장 및 로드
위의 서비스 파일을 "/etc/systemd/system/" 디렉토리에 저장합니다.
그런 다음, 다음 명령을 사용하여 Systemd에 로드합니다.
sudo systemctl daemon-reload |
3) 부팅 시 자동 실행 구성
이제 서비스가 부팅 시 자동으로 실행되도록 구성합니다.
sudo systemctl enable hello.service |
4) 서비스 시작 및 확인
서비스를 시작하고 현재 상태를 확인합니다.
sudo systemctl start hello.service sudo systemctl status hello.service |
"Hello, world!" 메시지를 출력하는 간단한 서비스가 부팅 시 자동으로 실행됩니다.
2. 서비스 관리
Systemd는 시스템에서 실행되는 서비스, 데몬 및 프로세스를 관리합니다.
서비스를 시작, 중지, 다시 시작하고 상태를 모니터링할 수 있습니다.
서비스 관리를 위한 간단한 예제를 제공해 드리겠습니다.
이 예제에서는 Systemd를 사용하여 간단한 커스텀 서비스를 만들고 시작, 중지 및 상태를 확인하는 방법을 보여줍니다.
1) 먼저, 서비스를 실행할 스크립트 파일을 작성합니다.
예를 들어, `/usr/local/bin/myservice.sh`에 다음과 같은 내용의 스크립트를 만듭니다.
#!/bin/bash echo "My custom service is running!" sleep 10 echo "My custom service is done!" |
2) 이제 Systemd 서비스 파일을 생성합니다.
예를 들어, `/etc/systemd/system/myservice.service`에 다음과 같은 내용의 파일을 만듭니다.
[Unit] Description=My Custom Service After=network.target [Service] Type=simple ExecStart=/usr/local/bin/myservice.sh [Install] WantedBy=multi-user.target |
3) 이제 서비스를 시작하고 Systemd에 등록합니다.
sudo systemctl start myservice sudo systemctl enable myservice |
4) 서비스가 올바르게 실행되는지 확인합니다.
sudo systemctl status myservice |
5) 서비스를 중지합니다.
sudo systemctl stop myservice |
이렇게 커스텀 서비스를 생성하고 Systemd를 사용하여 시작, 중지 및 상태를 확인할 수 있습니다.
이 예제는 간단한 서비스를 만드는 방법을 보여주기 위한 것이며, 실제로는 더 복잡한 설정과 구성이 필요할 수 있습니다.
3. 유닛 및 유닛 파일
Systemd는 시스템 구성 요소를 단위로 구성된 유닛(unit)으로 관리합니다.
각 유닛은 서비스, 장치, 소켓 등과 같은 특정한 시스템 구성 요소를 나타냅니다.
Systemd는 유닛 파일을 사용하여 각 유닛의 구성을 정의합니다.
Systemd에서 유닛(unit)은 시스템의 서비스, 장치, 소켓 등과 같은 구성 요소를 나타냅니다.
각 유닛은 유닛 파일을 통해 정의됩니다.
파일은 해당 유닛의 동작 및 구성을 지정합니다.
아래는 간단한 서비스 유닛 파일과 타이머 유닛 파일의 예제입니다.
1) 서비스 유닛 파일 예제(service.unit)
서비스 유닛 파일은 시스템에서 실행되는 서비스나 데몬을 정의합니다. \예를 들어, 웹 서버, 데이터베이스 서버 등의 백그라운드 프로세스를 관리하는 데 사용됩니다.
[Unit] Description=My Service After=network.target [Service] Type=simple ExecStart=/usr/bin/my_service_executable Restart=always [Install] WantedBy=multi-user.target |
- Description: 유닛의 설명
- After: 다른 유닛 이후에 실행되어야 함을 지정합니다. 이 경우에는 네트워크 타겟 이후에 실행됩니다.
- Type: 서비스의 유형을 지정합니다. 이 예제에서는 간단한 단일 프로세스를 실행하는 경우 "simple"을 사용합니다.
- ExecStart: 서비스가 시작될 때 실행할 명령을 지정합니다.
- Restart: 서비스가 비정상적으로 종료되면 다시 시작될지 여부를 지정합니다.
- WantedBy: 시스템 초기화 중에 이 유닛을 어느 타겟에 추가할지를 지정합니다.
2) 타이머 유닛 파일 예제(timer.unit)
타이머 유닛 파일은 특정 시간 간격이나 일정 시간에 서비스를 실행하기 위해 사용됩니다.
[Unit] Description=Run My Service every 10 minutes [Timer] OnCalendar=*:0/10 Persistent=true [Install] WantedBy=timers.target |
- Description: 유닛의 설명
- OnCalendar: 서비스를 실행할 시간을 정의합니다. 이 경우에는 10분마다 실행됩니다.
- Persistent: 시스템이 부팅될 때 유닛의 실행 상태를 유지할지 여부를 지정합니다.
- WantedBy: 타이머를 timers.target에 추가하여 타이머를 부팅 시에 활성화합니다.
이러한 예제들은 Systemd의 유닛 파일이 어떻게 구성되는지를 보여줍니다.
이러한 유닛 파일은 일반적으로 `/etc/systemd/system/` 디렉토리에 저장되며, `.service` 또는 `.timer` 확장자를 사용하여 저장됩니다.
설정을 마친 후에는 `systemctl daemon-reload` 명령을 사용하여 시스템에 새로운 유닛 파일을 로드해야 합니다.
4. 로그 및 로깅 관리
Systemd는 시스템 로그를 관리하고 로깅을 지원합니다.
Journalctl이라는 도구를 사용하여 로그를 검색하고 필터링할 수 있습니다.
Systemd의 로깅 및 로그 관리에 대한 예제입니다.
아래 예제는 Systemd의 Journalctl 도구를 사용하여 시스템 로그를 읽고 필터링하는 방법을 보여줍니다.
1) 시스템 로그 읽기
journalctl |
이 명령은 시스템 로그를 출력합니다. 가장 최근의 로그 항목부터 표시됩니다.
2) 특정 유닛 로그 읽기
journalctl -u nginx.service |
이 명령은 'nginx.service' 유닛의 로그를 출력합니다.
nginx의 로그를 확인하는데 사용할 수 있습니다.
유닛 이름은 시스템에서 실행되는 서비스 또는 데몬의 이름입니다.
3) 시간 범위 지정하여 로그 읽기
journalctl --since "2022-01-01" --until "2022-01-02" |
이 명령은 2022년 1월 1일부터 2022년 1월 2일까지의 로그를 출력합니다.
로그 기간을 지정하여 특정 기간 동안의 로그를 확인할 수 있습니다.
4) 특정 우선 순위 이상의 로그 읽기
journalctl -p err |
이 명령은 오류 이상의 우선 순위를 가진 로그를 출력합니다.
로그 우선 순위는 "emerg", "alert", "crit", "err", "warning", "notice", "info", "debug"로 지정할 수 있습니다.
5) 특정 사용자 로그 읽기
journalctl _UID=1000 |
이 명령은 UID가 1000인 사용자의 로그를 출력합니다.
특정 사용자에 대한 로그를 확인할 수 있습니다.
위의 예제는 Systemd의 로깅 및 로그 관리에 대한 간단한 예제입니다.
Journalctl 도구를 사용하여 로그를 검색하고 필터링하는 방법을 보여주고 있습니다.
필요에 따라 다양한 옵션을 사용하여 로그를 조사할 수 있습니다.
5. cgroups(Integrated with systemd)
다음은 cgroups를 사용하여 systemd에서 서비스에 대한 자원 제한을 설정하는 예제입니다.
이 예제에서는 CPU 및 메모리 리소스에 대한 제한을 설정합니다.
먼저, systemd 서비스 유닛 파일에 리소스 제한을 지정하는 옵션을 추가해야 합니다.
예를 들어, `/etc/systemd/system/my-service.service`라는 서비스 유닛 파일이 있다고 가정해 보겠습니다.
이 서비스는 `my-service`라는 이름을 가진 서비스입니다.
아래는 해당 서비스에 CPU 및 메모리 리소스 제한을 추가하는 방법입니다.
[Unit] Description=My Service [Service] ExecStart=/path/to/my-service CPUQuota=50% MemoryLimit=512M [Install] WantedBy=multi-user.target |
위의 예제에서는 `CPUQuota` 및 `MemoryLimit` 옵션을 사용하여 각각 CPU 및 메모리 리소스에 대한 제한을 설정합니다. `CPUQuota`는 CPU 사용량을 백분율로 지정하며, `MemoryLimit`는 메모리 사용량을 바이트 단위로 지정합니다.
서비스를 수정한 후에는 다음 명령을 사용하여 systemd에 변경 사항을 반영합니다.
sudo systemctl daemon-reload |
systemd가 서비스의 새로운 설정을 인식하고 적용할 것입니다.
이제 서비스를 시작하면 systemd는 cgroups를 사용하여 지정된 CPU 및 메모리 리소스 제한을 적용할 것입니다.
물론 이것은 단순한 예제이며, 실제로는 더 복잡한 시나리오에 따라 더 많은 옵션을 사용할 수 있습니다.
자세한 내용은 'systemd.resource-control'의 매뉴얼 페이지를 참조하시기 바랍니다.
systemd 타이머 유닛의 설정 파일 스니펫
아래는 systemd 타이머 유닛의 설정 파일 스니펫입니다.
systemd 타이머는 주어진 시간 또는 일정에 따라 작업을 실행하는 데 사용됩니다.
제공된 설정은 시스템 부팅 후 60분마다 실행되고,
매일 오전 6시와 오후 6시에 실행되며,
실행 시간은 12시간마다 무작위로 지연됩니다. 설정의 내용은 다음과 같습니다.
[Timer] OnBootSec=60min ; 시스템 부팅 후 60분마다 실행 OnCalendar=*-*-* 6,18:00 ; 매일 오전 6시와 오후 6시에 실행 RandomizedDelaySec=12h ; 실행 시간을 12시간마다 무작위로 지연 Persistent=true ; 지속적인 유닛으로 설정하여, 시스템이 부팅될 때마다 실행되도록 함 |
이 설정을 사용하여 실행할 작업에 대한 서비스 유닛을 만들어야 합니다.
일반적으로 systemd 서비스와 함께 사용됩니다.
예를 들어, 타이머가 특정 스크립트를 실행하도록 하려면 해당 스크립트를 실행하는 서비스를 만들어야 합니다.
그런 다음 이 타이머 설정과 함께 사용하세요.
이러한 설정은 systemd 타이머를 사용하여 주기적으로 작업을 실행하도록 구성합니다.
예) 시스템이 부팅되거나 특정 시간에 매일 작업이 실행됩니다.
'초보 우분투(리눅스)' 카테고리의 다른 글
우분투-바로 가기 키 "Hangul" (은)는 사용할 수 없습니다. 이 키만으로는 입력할 수 없 습니다.Control 또는 Alt, Shift키와 동시에 사용해 보십시오. (1) | 2024.03.24 |
---|---|
VisualStudio Code에서 C언어 소스코드 자동 정렬(포멧) 기능 (1) | 2024.03.17 |
우분투용 소스코드 백업 쉘스크립트 (1) | 2024.03.10 |
PuTTY (1) | 2024.03.09 |
Bash 스크립트 사용법 (0) | 2024.03.03 |