오늘은 systemd 기반의 리눅스 시스템에서 부팅시에 특정 서비스를 제어하는 방법에 대해 알아보겠습니다.
이는 시스템의 안정성과 성능에 중요한 영향을 미치므로, 전문적인 방법으로 접근해야 합니다.
참고로 systemd는 현대적인 리눅스 시스템에서 초기화 및 서비스 관리를 위한 시스템과 서비스 관리자입니다.
서비스 유닛을 생성하고 관리하여 부팅 시에 특정 서비스가 실행되지 않도록 막을 수 있습니다.
systemctl을 이용한 서비스 관리
# 서비스 상태 확인
sudo systemctl status service_name
# 서비스 활성화 상태 확인
sudo systemctl is-enabled service_name
# 부팅시, 서비스 비활성화
sudo systemctl disable service_name
# 부팅시, 서비스 다시 활성화
sudo systemctl enable service_name
다만 이 방식은 임베디드 시스템처럼 rootfs가 readonly 곳에서는 사용할 수 없습니다.
위 명령가 실제로는 서비스 파일 혹은 관련된 target 파일에 직접 수정을 하기 때문입니다.
service 유닛 파일 편집을 통한 제어
목표 서비스 파일을 직접 수정하는 것으로 대응할 수 있습니다.
목표 서비스 파일을 수정해봅시다. (ex : sudo nano /etc/systemd/system/[서비스명].service
[Service]
...
ConditionPathExists=!/[원하는 조건 경로]
...
**예제:**
[Service]
...
ConditionPathExists=!/var/lock/do_not_start
...
마찬가지로 rootfs가 readonly 일 경우에 사용못하는 것은 동일합니다.
다만 해당 서비스 파일을 readonly 이미지에 같이 포함시키는 형태로 대응이 가능합니다.
스크립트 파일을 통한 유닛 제어
서비스의 시작 조건이 단순하지 않을 경우는 아래의 방식을 사용할 수 있습니다.
[Service]
...
ExecStartPre=[원하는 스크립트]
...
**예제:**
[Service]
...
ExecStartPre=/usr/bin/do_not_start.sh
...
ExecStartPre가 실패할 경우, 그 아래의 다른 명령어들은 수행되지 않습니다. (링크)
libsystemd를 통해서 서비스 유닛의 상태를 확인하기
libsystemd는 systemd 서비스 관리에 대한 인터페이스를 제공하며, 이를 활용하여 특정 서비스 유닛의 상태를 간편하게 확인할 수 있습니다. 특정 서비스 유닛의 상태를 확인하려면 `sd_service_get_state()` 함수를 사용할 수 있습니다.
// Libsystemd 헤더 파일 포함:
#include <systemd/sd-daemon.h>
int main() {
const char *unit_name = "my-service.service"; // 확인하려는 서비스 유닛의 이름
int state = sd_service_get_state(unit_name);
if (state < 0) {
printf("서비스 유닛 상태를 가져올 수 없거나 오류가 발생했습니다.\n");
} else if (state == SERVICE_RUNNING) {
printf("서비스 유닛 '%s'가 실행 중입니다.\n", unit_name);
} else if (state == SERVICE_DEAD) {
printf("서비스 유닛 '%s'가 종료되었습니다.\n", unit_name);
} else {
printf("서비스 유닛 '%s'의 상태는 알 수 없습니다.\n", unit_name);
}
return 0;
}
'소프트웨어 > 리눅스' 카테고리의 다른 글
Boost.Program_options을 통한 명령줄 파싱방법 (0) | 2023.08.27 |
---|---|
리눅스 '정적/동적 라이브러리'의 대해서 (.so, .a, dlopen) (0) | 2023.08.08 |
DAC (Discretionary Access Control)와 관련된 명령어들 (0) | 2023.07.26 |
오늘은 systemd 기반의 리눅스 시스템에서 부팅시에 특정 서비스를 제어하는 방법에 대해 알아보겠습니다.
이는 시스템의 안정성과 성능에 중요한 영향을 미치므로, 전문적인 방법으로 접근해야 합니다.
참고로 systemd는 현대적인 리눅스 시스템에서 초기화 및 서비스 관리를 위한 시스템과 서비스 관리자입니다.
서비스 유닛을 생성하고 관리하여 부팅 시에 특정 서비스가 실행되지 않도록 막을 수 있습니다.
systemctl을 이용한 서비스 관리
# 서비스 상태 확인
sudo systemctl status service_name
# 서비스 활성화 상태 확인
sudo systemctl is-enabled service_name
# 부팅시, 서비스 비활성화
sudo systemctl disable service_name
# 부팅시, 서비스 다시 활성화
sudo systemctl enable service_name
다만 이 방식은 임베디드 시스템처럼 rootfs가 readonly 곳에서는 사용할 수 없습니다.
위 명령가 실제로는 서비스 파일 혹은 관련된 target 파일에 직접 수정을 하기 때문입니다.
service 유닛 파일 편집을 통한 제어
목표 서비스 파일을 직접 수정하는 것으로 대응할 수 있습니다.
목표 서비스 파일을 수정해봅시다. (ex : sudo nano /etc/systemd/system/[서비스명].service
[Service]
...
ConditionPathExists=!/[원하는 조건 경로]
...
**예제:**
[Service]
...
ConditionPathExists=!/var/lock/do_not_start
...
마찬가지로 rootfs가 readonly 일 경우에 사용못하는 것은 동일합니다.
다만 해당 서비스 파일을 readonly 이미지에 같이 포함시키는 형태로 대응이 가능합니다.
스크립트 파일을 통한 유닛 제어
서비스의 시작 조건이 단순하지 않을 경우는 아래의 방식을 사용할 수 있습니다.
[Service]
...
ExecStartPre=[원하는 스크립트]
...
**예제:**
[Service]
...
ExecStartPre=/usr/bin/do_not_start.sh
...
ExecStartPre가 실패할 경우, 그 아래의 다른 명령어들은 수행되지 않습니다. (링크)
libsystemd를 통해서 서비스 유닛의 상태를 확인하기
libsystemd는 systemd 서비스 관리에 대한 인터페이스를 제공하며, 이를 활용하여 특정 서비스 유닛의 상태를 간편하게 확인할 수 있습니다. 특정 서비스 유닛의 상태를 확인하려면 `sd_service_get_state()` 함수를 사용할 수 있습니다.
// Libsystemd 헤더 파일 포함:
#include <systemd/sd-daemon.h>
int main() {
const char *unit_name = "my-service.service"; // 확인하려는 서비스 유닛의 이름
int state = sd_service_get_state(unit_name);
if (state < 0) {
printf("서비스 유닛 상태를 가져올 수 없거나 오류가 발생했습니다.\n");
} else if (state == SERVICE_RUNNING) {
printf("서비스 유닛 '%s'가 실행 중입니다.\n", unit_name);
} else if (state == SERVICE_DEAD) {
printf("서비스 유닛 '%s'가 종료되었습니다.\n", unit_name);
} else {
printf("서비스 유닛 '%s'의 상태는 알 수 없습니다.\n", unit_name);
}
return 0;
}
'소프트웨어 > 리눅스' 카테고리의 다른 글
Boost.Program_options을 통한 명령줄 파싱방법 (0) | 2023.08.27 |
---|---|
리눅스 '정적/동적 라이브러리'의 대해서 (.so, .a, dlopen) (0) | 2023.08.08 |
DAC (Discretionary Access Control)와 관련된 명령어들 (0) | 2023.07.26 |