Computer >> 컴퓨터 >  >> 시스템 >> Linux

CentOS/RHEL 서비스 및 스크립트 자동 시작 관리 방법 총정리

이 글에서는 Linux CentOS/RHEL 7/8 환경에서 서비스와 스크립트를 부팅 시 자동으로 시작하도록 설정하는 기본적인 방법을 알아봅니다. 특히 systemd 데몬의 개념을 익히고, 서비스를 시작 프로그램에 추가하거나 제거하는 방법을 살펴보며, 부팅 시 스크립트나 데몬을 실행할 수 있는 다양한 대안적인 방법까지 함께 다룹니다.

이 글을 통해 Linux에서 자동으로 시작되는 서비스나 스크립트 목록을 빠르게 확인하고, 자신만의 서비스나 스크립트를 시작 항목에 추가하거나, 특정 애플리케이션의 자동 시작을 비활성화하는 방법을 배울 수 있습니다.

systemctl 명령어로 systemd 서비스 관리하기

현재 가장 널리 사용되는 Linux 배포판(CentOS, RHEL, Debian, Fedora, Ubuntu)은 기존의 init.d 대신 systemd 시작 데몬을 사용합니다. Systemd는 다른 데몬들을 시작하고 관리하는 Linux 서비스 관리자로, /etc/systemd/system 디렉터리의 유닛(unit) 파일을 사용합니다(기존 init.d는 /etc/init.d/의 스크립트를 사용했습니다). systemd를 사용하면 OS 부팅 시 서비스 시작 작업을 병렬로 처리할 수 있어 부팅 속도가 크게 향상됩니다.

systemd를 관리하려면 systemctl 명령어를 사용합니다.

먼저 시스템 부팅 후 systemd에서 사용 가능한 유닛 목록을 확인해 보겠습니다.

systemctl list-units

다음 명령어로 전체 유닛 파일 목록을 조회할 수 있습니다.

systemctl list-unit-files

이 명령은 시스템에 존재하는 모든 유닛 파일을 표시합니다.

활성화된 서비스와 그 상태 목록을 보려면 아래 명령어를 실행합니다.

# systemctl list-units -t service

일부 유닛은 부팅 과정 이후 비활성 상태가 될 수 있으므로, 전체 목록을 확인하려면 --all 옵션을 사용합니다.

# systemctl list-units --all

UNIT LOAD ACTIVE SUB DESCRIPTION
proc-sys-fs-binfmt_misc.automount loaded active waiting ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
● exim.service not-found inactive dead exim.service
firewalld.service loaded active running firewalld - dynamic firewall daemon
getty@tty1.service loaded active running Getty on tty1
● iptables.service not-found inactive dead iptables.service
Bring up/down networking
● NetworkManager-wait-online.service not-found inactive dead

목록을 보면 디스크에서 찾을 수 없는 서비스까지도 함께 표시되는 것을 알 수 있습니다.

그 외에도 다음과 같은 유용한 옵션들이 있습니다.

  • --state — 데몬의 상태(Load, Active, Sub)를 기준으로 조회합니다.
  • --type — 유닛 타입별로 필터링하여 조회합니다.

사용 예시:

systemctl list-units --all --state=active — 활성 상태인 systemd 유닛만 표시

systemctl list-units --type=service — 서비스 유형의 유닛만 표시

systemd에서 서비스 등록하기

systemd는 서비스를 관리할 때 특별한 문법을 사용합니다. 서비스 이름 뒤에 반드시 .service를 붙여야 합니다. 예를 들면 다음과 같습니다.

# systemctl enable nginx.service — nginx 웹 서버를 시작 프로그램에 등록하는 명령입니다.

이 명령을 실행하면 systemd 시작 디렉터리에 해당 서비스 파일에 대한 심볼릭 링크(symbolic link)가 생성됩니다.

Created symlink from /etc/systemd/system/multi-user.target.wants/nginx.service to /usr/lib/systemd/system/nginx.service

명령 출력 결과를 통해 심볼릭 링크가 어느 디렉터리에 생성되었는지 확인할 수 있습니다.

서비스가 시작 프로그램에 정상적으로 등록되었는지 확인하려면 상태를 조회합니다.

systemctl status nginx.service

출력 결과에서 다음 줄에 주목하세요.

Loaded: loaded (/usr/lib/systemd/system/nginx.service; enabled; vendor preset: disabled)

enabled 값은 해당 서비스가 Linux 시작 항목에 등록되어 있다는 의미입니다. 자동 시작이 설정되지 않았다면 disabled로 표시됩니다.

systemd에서 서비스 등록 해제하기

서비스를 시작 항목에서 제거하면 Linux 부팅 시 더 이상 자동으로 시작되지 않습니다(서비스 자체가 삭제되는 것은 아닙니다). 서비스 자동 시작을 비활성화하려면 다음 명령어를 실행합니다.

# systemctl disable your_service

예를 들어 nginx의 자동 시작을 해제하려면:

# systemctl disable nginx.service

Removed symlink /etc/systemd/system/multi-user.target.wants/nginx.service

명령 실행 후 systemd 디렉터리에서 해당 서비스 파일의 심볼릭 링크가 제거됩니다. 자동 시작 여부는 다음 명령으로 확인할 수 있습니다.

# systemctl is-enabled nginx

systemd로 유닛 마스크(mask) 처리하기

실제 운영 환경에서는 disable로 비활성화했는데도 불구하고 재부팅 후 여전히 시작되는 까다로운 서비스를 만난 적이 있습니다. 이런 문제를 해결하려면 해당 서비스를 마스크(mask) 처리하면 됩니다.

# systemctl mask nginx.service

마스크 처리된 서비스는 수동으로도, OS 재시작 후에도 시작되지 않습니다.

Created symlink from /etc/systemd/system/nginx.service to /dev/null.

# service nginx restart

Redirecting to /bin/systemctl restart nginx.service
Failed to restart nginx.service: Unit is masked.

마스크를 해제하려면 다음 명령어를 사용합니다.

# systemctl unmask nginx.service

Removed symlink /etc/systemd/system/nginx.service.

서비스를 마스크 처리한 후 유닛 파일 목록을 확인하면 해당 서비스가 masked 상태로 표시되는 것을 볼 수 있습니다.

rc.local로 스크립트 또는 서비스 실행하기

Linux 부팅 시 다양한 스크립트를 실행하기 위해 rc.local이 자주 사용됩니다.

rc.local은 스크립트뿐 아니라 서비스 실행에도 활용할 수 있으며, 심지어 systemd로 시작되는 서비스도 실행 가능합니다. systemd가 있는데 굳이 rc.local을 쓸 필요가 있을까 하는 의문이 들 수 있지만, 몇 가지 예시를 통해 살펴보겠습니다.

먼저 /etc/rc.local 파일에 실행 권한이 있어야 합니다.

chmod +x /etc/rc.local

rc.local을 systemd 자동 시작에 등록합니다.

systemctl enable rc-local

이제 rc.local에 nginx 웹 서버 시작 명령을 추가할 수 있습니다.

service nginx start

하지만 저는 서비스 시작 용도로 rc.local을 자주 사용하지는 않습니다. rc.local은 주로 스크립트를 실행하거나 특정 명령을 한 번만 실행할 때 더 유용하게 쓰입니다.

예를 들어, 어떤 작업을 수행하는 /root/test.sh 스크립트를 만들고 부팅 직후 바로 실행하고 싶다고 가정해 보겠습니다. rc.local 파일에 다음 줄을 추가하면 됩니다.

sh /root/test.sh

CentOS 7부터 개발진은 rc.local이 구식(obsolete) 데몬이며 스크립트나 서비스 시작 용도로 사용하지 말 것을 권장하고 있습니다. 하지만 사용법이 매우 간단하기 때문에 여전히 동작하는 한 유용하게 활용할 수 있습니다.

systemd로 나만의 Linux 서비스 만들기

직접 만든 데몬을 systemd를 통해 관리할 수도 있습니다.

예를 들어, 시스템이 재부팅될 때마다 동일한 스크립트(/root/test.sh)를 실행하고 싶다고 가정해 보겠습니다. 먼저 새 서비스 파일을 생성합니다.

touch /etc/systemd/system/test-script.service
chmod 664 /etc/systemd/system/test-script.service
nano /etc/systemd/system/test-script.service

파일 내용은 다음과 같습니다.

[Unit]
Description=Template Settings Service
After=network.target
[Service]
Type=oneshot
User=root
ExecStart=/root/test.sh
[Install]
WantedBy=multi-user.target

주요 파라미터는 다음과 같습니다.

User — 데몬을 실행할 사용자 계정입니다.

Type=oneshot — systemd가 다른 유닛을 계속 처리하기 전에 해당 프로세스가 종료될 때까지 기다리도록 지정합니다.

설정을 적용하고 서비스를 시작해 봅니다.
# systemctl daemon-reload
# systemctl start test-script.service
# systemctl status test-script.service

● test-script.service - Test
Loaded: loaded (/etc/systemd/system/test-script.service; disabled; vendor preset: disabled)
Active: active (running)

서비스가 정상적으로 동작한다면 systemd 시작 항목에 등록합니다.

# systemctl enable test-script.service

Created symlink from /etc/systemd/system/multi-user.target.wants/test-script.service to /etc/systemd/system/test-script.service.

이런 방식으로 어떤 스크립트든 자동 시작에 추가하고 systemd를 통해 체계적으로 관리할 수 있습니다.

cron으로 스크립트 실행하기

특정 주기로 스크립트나 명령을 실행하고 싶다면 cron을 활용할 수 있습니다.

crontab -e — cron 작업 테이블을 편집할 수 있는 에디터를 엽니다.

여기에 원하는 작업을 추가합니다. 예를 들면 다음과 같습니다.

* * * * * /root/test.sh — 매 분마다 스크립트를 실행합니다.

서비스 상태를 점검하고, 서비스가 중단되어 있으면 자동으로 다시 시작해 주는 워치독(watch-dog) 스크립트를 작성할 수도 있습니다. 실제로 일부 프로젝트에서 이와 유사한 방식을 활용하고 있습니다.

cron에 등록된 모든 작업 목록을 확인하려면 다음 명령어를 실행합니다.

# crontab -l

* * * * * /root/test.sh

cron 작업 시간 필드에 입력 가능한 값은 순서대로 다음과 같습니다.

  • 분(Minutes): 0-59
  • 시(Hours): 0-23
  • 일(Day of month): 1-31
  • 월(Month): 1-12
  • 요일(Day of week): 0-7 (0 또는 7은 일요일)

위 예제의 작업은 매 분마다 실행되므로 모든 필드에 별표(*)가 들어갑니다.

또한 스크립트를 cron 전용 디렉터리 중 하나에 배치할 수도 있습니다.

  • /cron.daily — 하루에 한 번 실행되는 스크립트
  • /cron.hourly — 한 시간에 한 번 실행되는 스크립트
  • /cron.monthly — 한 달에 한 번 실행되는 스크립트
  • /cron.weekly — 일주일에 한 번 실행되는 스크립트

해당 디렉터리에 넣어둔 스크립트들은 지정된 주기에 따라 자동으로 실행됩니다.

Bash 시작 스크립트: .bashrc 활용하기

SSH 콘솔에 접속할 때 특정 작업을 수행하고 싶다면, 원하는 명령이나 스크립트를 .bash_profile 또는 .bashrc 파일에 추가하면 됩니다. 이론적으로는 어느 파일에 추가해도 실행되지만, 일반적으로 필요한 내용은 .bashrc에 작성하고 .bash_profile에서 .bashrc를 호출하는 구조로 사용합니다.

예를 들어 .bashrc 파일에 nginx 웹 서비스 재시작 명령을 추가해 보겠습니다.

service nginx restart

파일을 저장한 후 SSH 세션을 다시 시작하면, 터미널이 열리는 시점에 웹 서버도 함께 재시작된 것을 확인할 수 있습니다.

터미널 시작 시 어떤 작업을 수행할 수 있을까요? 서버 가동 시간을 확인하는 uptime 같은 추가 도구 실행이 대표적입니다.

또는 SSH 콘솔에 접속하자마자 특정 디렉터리로 이동한 뒤 mc(Midnight Commander)를 실행하고 싶다면 .bashrc에 다음과 같이 추가합니다.

cd /var/
mc

이 글에서 다룬 Linux 서비스 및 스크립트 자동 시작 관리 방법이 여러분에게 도움이 되기를 바랍니다(이 글은 CentOS와 RHEL 기준으로 작성되었지만 다른 배포판에도 적용 가능합니다). Linux 시스템 관리의 기초를 학습하는 분들에게 이 정보가 실무에 큰 도움이 될 것이라 확신합니다.