리눅스 서비스 관리의 기초
운영체제에서 서비스(Service)는 사용자 요청에 응답하거나 특정 기능을 수행하기 위해 백그라운드에서 지속적으로 실행되는 프로세스를 의미합니다. 이러한 프로세스는 일반적으로 터미널과 독립적으로 동작하며, 외부 요청을 수신하기 위해 특정 포트 번호를 통해 "서비스 창"을 개방합니다.
클라이언트-서버 모델에서, 서버는 서비스 프로세스를 시작하여 해당 포트를 열고 대기합니다. 클라이언트가 서버의 IP 주소와 포트 번호를 지정하여 요청을 보내면, 서버 호스트의 커널은 요청 패킷을 분석하여 해당 포트를 청취하는 애플리케이션에 전달합니다. 이후 애플리케이션은 클라이언트와 연결을 수립하고 데이터를 교환합니다.
모든 서비스가 항상 포트를 개방하는 것은 아닙니다. 예를 들어, xinetd와 같은 슈퍼 데몬(Super Daemon)은 필요할 때만 특정 서비스의 포트를 관리하고, 서비스 사용이 끝나면 포트 연결을 해제할 수 있습니다. 리눅스에서 서비스는 크게 독립형 데몬(Standalone Daemon)과 슈퍼 서버 데몬(`xinetd`)이 관리하는 임시 데몬(Transient Daemon)으로 나눌 수 있습니다.
- 독립형 데몬: 시스템 부팅 시 시작되어 메모리에 상주하며 자체적으로 포트를 청취하는 서비스입니다. 대부분의 서비스가 여기에 해당합니다.
- 슈퍼 서버 데몬:
xinetd는 임시 데몬을 관리하는 독립형 데몬입니다. 임시 데몬은 요청이 있을 때만xinetd에 의해 시작되고, 작업이 완료되면 종료됩니다.xinetd자체는 항상 실행되는 독립형 데몬이지만, 임시 데몬이 활성화될 때 해당 포트를 할당받아 관리합니다.
CentOS 6 (SysVinit) 서비스 관리
CentOS 6에서는 전통적인 SysVinit 시스템을 사용하여 서비스를 관리합니다. 서비스 스크립트는 주로 /etc/rc.d/init.d/ 디렉토리에 위치하며, /etc/init.d/는 이 디렉토리의 심볼릭 링크입니다. 이 스크립트들은 LSB(Linux Standard Base) 규격을 따르며, start, stop, restart, status 등의 표준 매개변수를 지원합니다.
독립형 데몬 관리
독립형 데몬을 시작, 중지, 재시작하거나 상태를 확인하는 방법은 다음과 같습니다.
# 방법 1: 직접 스크립트 실행
/etc/init.d/[서비스명] [start|stop|restart|status]
# 방법 2: 'service' 명령 사용 (권장)
service [서비스명] [start|stop|restart|status]
service 명령으로 관리하려면 해당 서비스의 스크립트가 /etc/init.d 디렉토리에 존재해야 합니다.
서비스 자동 시작 설정 (chkconfig)
chkconfig 명령은 시스템 부팅 시 서비스의 자동 시작 여부를 관리하는 도구입니다. chkconfig로 서비스를 관리하려면, /etc/init.d/ 디렉토리 내의 서비스 스크립트 상단에 특정 주석 라인이 포함되어야 합니다.
#!/bin/bash
# chkconfig: 2345 90 10
# description: 이 스크립트는 예제 웹 서버를 제어합니다.
chkconfig: 라인의 첫 번째 숫자는 서비스가 활성화될 런레벨(runlevel)을 의미합니다 (예: 2345는 런레벨 2, 3, 4, 5에서 활성화). 다음 두 숫자는 서비스 시작 순서(90)와 종료 순서(10)를 나타냅니다. description: 라인에는 서비스에 대한 간단한 설명이 포함되어야 합니다.
chkconfig를 사용한 자동 시작 관리:
# 서비스 스크립트를 chkconfig 관리 목록에 추가/삭제
chkconfig --add [서비스명]
chkconfig --del [서비스명]
# 서비스의 자동 시작 정보 확인
chkconfig --list [서비스명]
# 특정 런레벨에서 서비스 자동 시작/중지 설정
chkconfig --level [런레벨] [서비스명] [on|off]
이외에도 /etc/rc.d/rc.local 파일에 시작 명령어를 추가하여 부팅 시 실행되도록 설정할 수도 있습니다.
CentOS 6 (SysVinit) xinetd 및 임시 데몬 관리
임시 데몬 관리
xinetd에 의해 관리되는 임시 데몬은 service 명령으로 직접 시작할 수 없습니다. 대신 /etc/xinetd.d/ 디렉토리에 있는 해당 서비스의 구성 파일을 통해 설정하며, xinetd가 이를 관리합니다.
먼저 xinetd 패키지를 설치해야 합니다.
yum -y install xinetd
xinetd 서비스 자체가 실행 중인지 확인하고 시작합니다.
service xinetd start
임시 데몬의 자동 시작 상태는 해당 서비스의 실행 상태와 동기화됩니다. chkconfig를 통해 임시 데몬을 활성화하면 해당 서비스도 시작되며, xinetd가 이 서비스의 포트 요청을 처리합니다.
# rsync 임시 데몬 자동 시작 설정 (서비스 활성화)
chkconfig rsync on
임시 데몬 설정
임시 데몬은 /etc/xinetd.conf 파일의 기본 설정과 /etc/xinetd.d/[서비스명] 파일의 개별 서비스 설정에 의해 제어됩니다.
예시로, /etc/xinetd.d/rsync 파일의 기본 설정은 다음과 같습니다.
service rsync
{
disable = yes # 'yes'는 서비스 비활성화, 'no'는 활성화 (chkconfig 설정과 연동)
socket_type = stream # TCP 스트림 소켓 사용
wait = no # 동시 연결 허용 (다중 스레드)
user = nobody # 서비스 실행 사용자 (예: nobody)
server = /usr/bin/rsync # 실제 서비스 바이너리 경로
server_args = --daemon # 서비스 실행 시 전달될 인자
log_on_failure += USERID # 연결 실패 시 사용자 ID 로깅 추가
}
주요 설정 옵션:
only_from: 연결을 허용할 IP 주소 또는 네트워크 범위 (예:192.168.1.0/24)no_access: 연결을 거부할 IP 주소 또는 네트워크 범위bind/interface: 서비스가 청취할 특정 IP 주소 지정cps: 초당 최대 연결 수 및 제한 초과 시 대기 시간 설정instances: 최대 동시 서버 프로세스 수per_source: 각 클라이언트 IP 주소당 허용되는 최대 연결 수
CentOS 7 (Systemd) 서비스 관리
CentOS 7부터는 SysVinit 대신 Systemd를 사용하여 서비스를 관리합니다. Systemd는 서비스 관리의 새로운 표준이 되었으며, systemctl 명령을 통해 훨씬 더 강력하고 유연한 제어 기능을 제공합니다.
CentOS 6의 service 및 chkconfig 명령과 CentOS 7의 systemctl 명령 간의 주요 대응 관계는 다음과 같습니다.
- 서비스 시작:
- CentOS 6:
service [서비스명] start - CentOS 7:
systemctl start [서비스명].service
- CentOS 6:
- 서비스 중지:
- CentOS 6:
service [서비스명] stop - CentOS 7:
systemctl stop [서비스명].service
- CentOS 6:
- 서비스 재시작:
- CentOS 6:
service [서비스명] restart - CentOS 7:
systemctl restart [서비스명].service
- CentOS 6:
- 서비스 상태 확인:
- CentOS 6:
service [서비스명] status - CentOS 7:
systemctl status [서비스명].service - 활성화 여부만 확인:
systemctl is-active [서비스명].service
- CentOS 6:
- 부팅 시 자동 시작 설정:
- CentOS 6:
chkconfig [서비스명] on - CentOS 7:
systemctl enable [서비스명].service
- CentOS 6:
- 부팅 시 자동 시작 비활성화:
- CentOS 6:
chkconfig [서비스명] off - CentOS 7:
systemctl disable [서비스명].service
- CentOS 6:
- 서비스 자동 시작 상태 확인:
- CentOS 6:
chkconfig --list [서비스명] - CentOS 7:
systemctl is-enabled [서비스명].service
- CentOS 6:
- 모든 서비스의 자동 시작 상태 목록 확인:
- CentOS 6:
chkconfig --list - CentOS 7:
systemctl list-unit-files --type=service
- CentOS 6:
- 현재 활성화된 서비스 목록 확인:
- CentOS 7:
systemctl list-units --type=service
- CentOS 7:
Systemd는 서비스 관리의 패러다임을 변화시켰으며, .service 유닛 파일 기반의 설정과 병렬 부팅 등의 이점을 제공합니다.