Red Hat Enterprise Linux 서비스 제어

Red Hat Enterprise LinuxBeginner
지금 연습하기

소개

이 랩에서는 systemctl 명령을 사용하여 RHEL 에서 시스템 서비스를 관리하는 실습 경험을 쌓게 됩니다. 로드되고 활성 상태인 모든 서비스를 보고, 특정 서비스의 상태를 확인하고, 시작, 중지 및 다시 시작하여 런타임 동작을 제어하는 방법을 배우게 됩니다. 또한 서비스 구성을 다시 로드하고, 부팅 시 자동 시작을 위해 서비스를 활성화하거나 비활성화하는 방법을 탐색하고, 서비스 활성화를 방지하기 위한 마스킹 (masking) 및 언마스킹 (unmasking) 의 고급 개념을 이해하게 됩니다.

이 실용적인 가이드는 시스템 관리의 필수 기술을 갖추게 하여 RHEL 시스템 운영에 중요한 서비스의 수명 주기를 효과적으로 모니터링하고 관리할 수 있도록 합니다.

이것은 가이드 실험입니다. 학습과 실습을 돕기 위한 단계별 지침을 제공합니다.각 단계를 완료하고 실무 경험을 쌓기 위해 지침을 주의 깊게 따르세요. 과거 데이터에 따르면, 이것은 초급 레벨의 실험이며 완료율은 90%입니다.학습자들로부터 99%의 긍정적인 리뷰율을 받았습니다.

systemctl 로 모든 로드 및 활성 서비스 보기

이 단계에서는 systemctl 명령을 사용하여 자동으로 시작되는 시스템 프로세스를 식별하는 방법을 배웁니다. systemctl은 Red Hat Enterprise Linux 에서 systemd 서비스를 관리하는 주요 도구입니다.

먼저, 현재 로드되고 활성 상태인 모든 서비스 유닛을 나열하는 방법을 살펴보겠습니다. 이 목적을 위해 systemctl list-units --type=service 명령을 사용합니다. 이 명령은 systemd 데몬이 유닛 구성을 성공적으로 파싱하고 메모리에 로드했으며 현재 활성 상태인 서비스 유닛을 표시합니다.

RHEL 환경에서 터미널을 엽니다. 이미 labex 사용자로 로그인되어 있으며 현재 디렉토리는 ~/project입니다.

다음 명령을 실행하여 로드되고 활성 상태인 모든 서비스 유닛을 나열합니다.

systemctl list-units --type=service

다양한 서비스와 해당 상태를 보여주는 다음과 유사한 출력을 볼 수 있습니다.

UNIT                  LOAD    ACTIVE  SUB      DESCRIPTION
atd.service           loaded  active  running  Job spooling tools
auditd.service        loaded  active  running  Security Auditing Service
chronyd.service       loaded  active  running  NTP client/server
crond.service         loaded  active  running  Command Scheduler
dbus-broker.service   loaded  active  running  D-Bus System Message Bus
...output omitted...

출력의 열을 살펴보겠습니다.

  • UNIT: 일반적으로 .service로 끝나는 서비스 유닛의 이름입니다.
  • LOAD: systemd 데몬이 유닛 구성을 성공적으로 파싱하여 메모리에 로드했는지 여부를 나타냅니다. loaded는 성공했음을 의미합니다.
  • ACTIVE: 유닛의 상위 수준 활성화 상태입니다. active는 일반적으로 유닛이 성공적으로 시작되었음을 의미합니다.
  • SUB: 더 자세한 정보를 제공하는 하위 수준 활성화 상태입니다. 실행 중인 서비스의 경우 running이 일반적입니다.
  • DESCRIPTION: 서비스가 수행하는 작업에 대한 간략한 설명입니다.

q를 눌러 명령을 종료합니다.

다음으로, systemctl list-units --type=service--all 옵션을 사용하여 활성화 상태 (active, inactive, failed 등) 에 관계없이 모든 서비스 유닛을 나열할 수 있습니다. 이는 설치되었지만 현재 실행 중이 아닌 서비스를 보는 데 유용할 수 있습니다.

다음 명령을 실행합니다.

systemctl list-units --type=service --all

출력에는 inactive 또는 다른 상태의 서비스가 포함되어 더 포괄적인 보기를 제공합니다.

UNIT                          LOAD      ACTIVE   SUB     DESCRIPTION
  atd.service                 loaded    active   running Job spooling tools
  auditd.service              loaded    active   running Security Auditing ...
  auth-rpcgss-module.service  loaded    inactive dead    Kernel Module ...
  chronyd.service             loaded    active   running NTP client/server
  cpupower.service            loaded    inactive dead    Configure CPU power ...
  crond.service               loaded    active   running Command Scheduler
  dbus-broker.service         loaded    active   running  D-Bus System Message Bus
● display-manager.service     not-found inactive dead    display-manager.service
...output omitted...

마지막으로, 로드되거나 활성 상태가 아닌 유닛을 포함하여 설치된 모든 유닛 파일의 상태를 보려면 systemctl list-unit-files --type=service를 사용할 수 있습니다. 이 명령은 서비스가 enabled(부팅 시 시작), disabled(부팅 시 시작되지 않음), static(직접 활성화할 수 없지만 다른 유닛에 의해 시작될 수 있음) 또는 masked(시작 방지됨) 인지 여부를 보여줍니다.

다음 명령을 실행합니다.

systemctl list-unit-files --type=service

각 서비스 유닛 파일에 대한 STATEVENDOR PRESET을 나타내는 다음과 유사한 출력을 볼 수 있습니다.

UNIT FILE                         STATE       VENDOR PRESET
arp-ethers.service                disabled    disabled
atd.service                       enabled     enabled
auditd.service                    enabled     enabled
auth-rpcgss-module.service        static      -
autovt@.service                   alias       -
blk-availability.service          disabled    disabled
...output omitted...

이 명령은 특히 시스템이 부팅될 때 자동으로 시작되도록 구성된 서비스를 이해하는 데 유용합니다.

systemctl status 로 특정 서비스 상태 확인

이 단계에서는 systemctl status 명령을 사용하여 특정 서비스의 상세 상태를 확인하는 방법을 배웁니다. 이 명령은 서비스가 실행 중인지 여부, 프로세스 ID, 메모리 사용량 및 최근 로그 항목을 포함한 포괄적인 정보를 제공합니다.

예시로 crond.service (cron 데몬) 를 사용하겠습니다. cron 데몬은 예약된 작업을 처리하는 일반적인 서비스입니다.

RHEL 환경에서 터미널을 엽니다. ~/project 디렉토리에 있는지 확인합니다.

다음 명령을 실행하여 crond.service의 상태를 확인합니다.

systemctl status crond.service

다음과 유사한 상세 출력을 볼 수 있습니다.

● crond.service - Command Scheduler
     Loaded: loaded (/usr/lib/systemd/system/crond.service; enabled; preset: enabled)
     Active: active (running) since Mon 2022-03-14 05:38:10 EDT; 25min ago
   Main PID: 1089 (crond)
      Tasks: 1 (limit: 35578)
     Memory: 1.2M
        CPU: 12ms
     CGroup: /system.slice/crond.service
             └─1089 /usr/sbin/crond -n

Mar 14 05:38:10 workstation systemd[1]: Started Command Scheduler.
Warning: some journal files were not opened due to insufficient permissions.

출력의 주요 필드를 살펴보겠습니다.

  • Loaded: 이 줄은 서비스 유닛의 구성 파일이 처리되었는지 여부를 알려줍니다. 또한 유닛 파일의 경로 (/usr/lib/systemd/system/crond.service) 와 활성화 상태 (enabled는 부팅 시 시작되도록 구성되었음을 의미) 를 보여줍니다.
  • Active: 이것이 중요합니다. 서비스의 현재 상태를 나타냅니다. active (running)은 서비스가 현재 활성 상태이고 해당 프로세스가 실행 중임을 의미합니다. 또한 활성 상태인 시간도 표시합니다. 다른 상태로는 inactive(실행 중 아님), active (exited)(일회성 작업 완료), 또는 failed(오류 발생) 등이 있을 수 있습니다.
  • Main PID: 서비스와 관련된 메인 프로세스의 프로세스 ID(PID) 와 명령 이름입니다.
  • Tasks: 서비스가 현재 사용 중인 작업 (스레드) 수입니다.
  • Memory: 서비스가 소비하는 메모리 양입니다.
  • CPU: 서비스가 소비한 CPU 시간입니다.
  • CGroup: 리소스 관리에 사용되는 서비스가 속한 제어 그룹에 대한 정보입니다.
  • CGroup 아래의 줄은 서비스 시작 및 진행 중인 활동에 대한 통찰력을 제공하는 서비스와 관련된 최근 로그 항목을 보여줍니다.

systemctl status 외에도 서비스 상태의 특정 측면을 빠르게 확인하는 더 간단한 명령이 있습니다.

  • 서비스가 활성 상태인지 확인하려면:

    systemctl is-active crond.service

    예상 출력:

    active
  • 서비스가 활성화되었는지 (부팅 시 시작되도록 구성되었는지) 확인하려면:

    systemctl is-enabled crond.service

    예상 출력:

    enabled
  • 서비스가 실패했는지 확인하려면:

    systemctl is-failed crond.service

    예상 출력 (정상적으로 실행 중인 경우):

    active

    서비스가 시작하거나 실행하는 데 문제가 있었다면 이 명령은 failed를 반환합니다.

이러한 명령은 스크립팅이나 systemctl status의 전체 상세 출력이 필요하지 않은 빠른 확인에 유용합니다.

systemctl 로 서비스 시작, 중지 및 재시작

이 단계에서는 systemctl 명령을 사용하여 시스템 서비스의 수명 주기를 관리하는 방법을 배웁니다. 서비스를 시작, 중지 및 다시 시작하는 연습을 할 것입니다. 이 연습을 위해 생성할 더미 서비스를 사용합니다. 이 접근 방식은 중요한 시스템 기능에 영향을 주지 않고 안전하게 서비스를 조작할 수 있도록 합니다.

먼저 간단한 서비스 유닛 파일을 생성합니다. 이 파일은 몇 초마다 타임스탬프를 로그 파일에 쓰는 서비스를 정의합니다.

nano를 사용하여 systemd 시스템 디렉토리에 직접 mytest.service라는 새 서비스 유닛 파일을 생성합니다.

sudo nano /etc/systemd/system/mytest.service

nano 편집기에 다음 내용을 붙여넣습니다.

[Unit]
Description=My Test Service
After=network.target

[Service]
Type=simple
ExecStart=/bin/bash -c 'while true; do echo "$(date): My Test Service is running." >> /tmp/mytest.log; sleep 5; done'
ExecStop=/bin/bash -c 'echo "$(date): My Test Service stopped." >> /tmp/mytest.log'
Restart=on-failure

[Install]
WantedBy=multi-user.target
  • [Unit]: 유닛에 대한 일반 정보를 포함합니다. Description은 사람이 읽을 수 있는 이름을 제공하고, After=network.target은 이 서비스가 네트워크가 활성화된 후에 시작되어야 함을 지정합니다.
  • [Service]: 서비스의 동작을 정의합니다.
    • Type=simple: ExecStart 명령이 메인 프로세스인 간단한 서비스 유형을 나타냅니다.
    • ExecStart: 서비스가 시작될 때 실행할 명령입니다. 여기서는 5 초마다 타임스탬프가 찍힌 메시지를 /tmp/mytest.log에 쓰는 bash 루프입니다.
    • ExecStop: 서비스가 중지될 때 실행할 명령입니다. 로그에 중지 메시지를 씁니다.
    • Restart=on-failure: 서비스가 0 이 아닌 상태로 종료되면 서비스를 다시 시작하도록 구성합니다.
  • [Install]: 서비스가 설치되는 방법에 대한 정보를 포함합니다. WantedBy=multi-user.target은 시스템이 멀티유저 런레벨에 도달하면 이 서비스가 시작되어야 함을 의미합니다.

Ctrl+X를 누르고, Y를 눌러 확인한 다음, Enter를 눌러 파일을 저장하여 저장합니다.

이제 systemd 데몬을 다시 로드하여 새 서비스 파일을 인식하도록 합니다.

sudo systemctl daemon-reload

서비스 시작하기

서비스를 시작하려면 systemctl start 명령을 사용합니다.

mytest.service를 시작하려면 다음 명령을 실행합니다. systemctl 작업은 일반적으로 루트 권한이 필요하므로 sudo를 사용해야 합니다.

sudo systemctl start mytest.service

명령이 성공하면 즉시 출력은 없습니다.

이제 상태를 확인하여 서비스가 실행 중인지 확인합니다.

systemctl status mytest.service

서비스가 active (running)임을 나타내는 출력을 볼 수 있습니다.

● mytest.service - My Test Service
     Loaded: loaded (/etc/systemd/system/mytest.service; disabled; preset: disabled)
     Active: active (running) since ...
   Main PID: ... (bash)
      Tasks: 2 (limit: ...)
     Memory: ...
        CPU: ...
     CGroup: /system.slice/mytest.service
             ├─... /bin/bash -c "while true; do echo \"\$(date): My Test Service is running.\" >> /tmp/mytest.log; sleep 5; done"
             └─... sleep 5

...output omitted...

서비스가 메시지를 쓰고 있는지 확인하기 위해 로그 파일도 확인할 수 있습니다.

tail -f /tmp/mytest.log

5 초마다 다음과 유사한 새 줄이 나타나는 것을 볼 수 있습니다.

Tue Jul 22 09:15:09 AM CST 2025: My Test Service is running.
Tue Jul 22 09:15:14 AM CST 2025: My Test Service is running.

tail을 종료하려면 Ctrl+C를 누릅니다.

서비스 중지하기

실행 중인 서비스를 중지하려면 systemctl stop 명령을 사용합니다.

mytest.service를 중지하려면 다음 명령을 실행합니다.

sudo systemctl stop mytest.service

다시 말하지만, 즉시 출력은 없습니다.

서비스가 중지되었는지 확인합니다.

systemctl status mytest.service

출력은 이제 Active: inactive (dead)를 표시해야 합니다.

○ mytest.service - My Test Service
     Loaded: loaded (/etc/systemd/system/mytest.service; disabled; preset: disabled)
     Active: inactive (dead) since ...
...output omitted...

로그 파일 /tmp/mytest.log를 다시 확인합니다. "My Test Service stopped." 메시지가 표시되고 새로운 "running" 메시지가 나타나지 않아야 합니다.

tail /tmp/mytest.log

출력은 다음과 유사하게 표시됩니다.

Tue Jul 22 09:15:24 AM CST 2025: My Test Service is running.
Tue Jul 22 09:15:28 AM CST 2025: My Test Service stopped.

서비스 재시작하기

서비스를 다시 시작하려면 systemctl restart 명령을 사용합니다. 이 명령은 먼저 서비스를 중지한 다음 다시 시작합니다. 서비스 구성 변경 사항을 적용해야 할 때 유용합니다.

mytest.service를 다시 시작하려면 다음 명령을 실행합니다.

sudo systemctl restart mytest.service

서비스가 다시 실행 중인지 확인합니다.

systemctl status mytest.service

Active: active (running)이 다시 표시되어야 하며, Main PID는 새 프로세스가 시작되었음을 나타내는 새로운 숫자가 될 가능성이 높습니다.

● mytest.service - My Test Service
     Loaded: loaded (/etc/systemd/system/mytest.service; disabled; preset: disabled)
     Active: active (running) since ...
   Main PID: ... (bash)
      Tasks: 2 (limit: ...)
     Memory: ...
        CPU: ...
     CGroup: /system.slice/mytest.service
             ├─... /bin/bash -c "while true; do echo \"\$(date): My Test Service is running.\" >> /tmp/mytest.log; sleep 5; done"
             └─... sleep 5
...output omitted...

서비스가 "running" 메시지 쓰기를 재개했는지 확인하기 위해 로그 파일 /tmp/mytest.log를 확인합니다.

tail -f /tmp/mytest.log

"stopped" 메시지 다음에 새로운 "running" 메시지가 표시되어야 합니다.

Tue Jul 22 09:15:28 AM CST 2025: My Test Service stopped.
Tue Jul 22 09:15:40 AM CST 2025: My Test Service is running.

tail을 종료하려면 Ctrl+C를 누릅니다.

서비스에 구성 변경 사항 적용

이 단계에서는 서비스 구성을 다시 로드하는 방법에 대해 배웁니다. 일부 서비스는 전체 재시작 없이 구성 파일의 변경 사항을 적용할 수 있습니다. 이를 서비스 "다시 로드 (reloading)"라고 합니다. 다시 로드는 서비스 중단 시간을 피하고 기존 연결 또는 상태를 유지하기 때문에 일반적으로 재시작보다 선호됩니다. 서비스가 다시 로드될 때, PID 가 변경되는 전체 재시작과 달리 프로세스 ID(PID) 는 일반적으로 동일하게 유지됩니다.

이전 단계에서 사용했던 mytest.service를 계속 사용하겠습니다. 서비스의 동작을 수정하고 다시 로드하여 어떤 일이 발생하는지 살펴보겠습니다.

먼저 mytest.service가 실행 중인지 확인합니다. 실행 중이 아니라면 시작합니다.

sudo systemctl start mytest.service

상태를 확인하고 Main PID를 기록해 둡니다.

systemctl status mytest.service

이제 로그 메시지와 간격을 변경하기 위해 mytest.service 파일을 수정하겠습니다. 로그 메시지와 sleep 시간을 5 초에서 2 초로 변경합니다.

nano/etc/systemd/system/mytest.service를 엽니다.

sudo nano /etc/systemd/system/mytest.service

ExecStart 줄을 다음 내용으로 변경하여 메시지와 sleep 시간을 5 초에서 2 초로 수정합니다.

[Unit]
Description=My Test Service
After=network.target

[Service]
Type=simple
ExecStart=/bin/bash -c 'while true; do echo "$(date): My Test Service (reloaded) is running." >> /tmp/mytest.log; sleep 2; done'
ExecStop=/bin/bash -c 'echo "$(date): My Test Service stopped." >> /tmp/mytest.log'
Restart=on-failure

[Install]
WantedBy=multi-user.target

Ctrl+X를 누르고, Y를 누른 다음, Enter를 눌러 파일을 저장합니다.

변경 사항을 저장한 후, systemd에 서비스 구성이 변경되었음을 알려야 합니다.

sudo systemctl daemon-reload

이제 변경 사항을 적용하기 위해 서비스를 다시 로드해 보겠습니다.

sudo systemctl reload mytest.service

다음과 같은 오류가 발생할 수 있습니다.

Failed to reload mytest.service: Job type reload is not applicable for unit mytest.service.

이 오류는 간단한 서비스가 다시 로드 요청을 처리하도록 구성되지 않았기 때문에 발생합니다. 서비스가 다시 로드되려면 유닛 파일에 구성 다시 로드를 실행할 명령을 지정하는 ExecReload 지시어가 포함되어야 합니다. mytest.service에는 이 지시어가 없으므로 systemd는 다시 로드 방법을 알지 못합니다.

이러한 상황에서 systemd는 편리한 명령인 reload-or-restart를 제공합니다. 이 명령은 서비스를 다시 로드하려고 시도하지만, 다시 로드가 지원되지 않으면 서비스 재시작으로 대체됩니다. 이는 구성 변경 사항을 적용하는 더 안전하고 효과적인 방법인 경우가 많습니다.

이제 reload-or-restart를 사용해 보겠습니다.

sudo systemctl reload-or-restart mytest.service

이 명령은 성공해야 합니다. 이제 서비스 상태를 다시 확인합니다.

systemctl status mytest.service

Main PID를 관찰합니다. 서비스가 다시 시작되었으므로 (다시 로드할 수 없었기 때문에) Main PID새로운 숫자임을 알 수 있습니다. 이는 이전 프로세스가 중지되고 업데이트된 구성으로 새 프로세스가 시작되었음을 확인합니다.

마지막으로 /tmp/mytest.log 파일을 확인하여 변경 사항이 적용되었는지 확인합니다.

tail -f /tmp/mytest.log

2 초마다 "My Test Service (reloaded) is running."이라는 새 로그 메시지가 나타나는 것을 볼 수 있습니다. tail을 종료하려면 Ctrl+C를 누릅니다.

systemctl 로 부팅 시 서비스 활성화 및 비활성화

이 단계에서는 서비스를 부팅 시 자동으로 시작하도록 구성 (활성화) 하거나 부팅 시 시작되지 않도록 방지 (비활성화) 하는 방법을 배웁니다. 이는 시스템 리소스를 관리하고 시스템 시작 시 필요한 서비스가 사용 가능한지 확인하는 데 중요합니다.

일반적인 systemd 환경에서는 서비스를 활성화하면 적절한 systemd 구성 디렉토리 (예: /etc/systemd/system/multi-user.target.wants/) 에 서비스 유닛 파일을 가리키는 심볼릭 링크가 생성됩니다. 서비스를 비활성화하면 이러한 링크가 제거됩니다.

systemd가 컨테이너 재시작 시에도 유지되는 /etc/systemd/system 디렉토리에 실제 심볼릭 링크를 생성하지 않을 수 있는 컨테이너화된 환경에 있으므로, enabledisable 명령은 이러한 링크를 생성하지 않을 수 있습니다. 그러나 systemctl은 이러한 명령을 처리하고 내부 상태를 업데이트하며, 이것이 우리가 관찰할 내용입니다.

이 시연을 위해 mytest.service를 계속 사용하겠습니다.

먼저 이전 단계에서 mytest.service가 중지되었는지 확인합니다.

sudo systemctl stop mytest.service

서비스 활성화하기

서비스를 활성화하려면 systemctl enable 명령을 사용합니다. 이 명령은 시스템 부팅 시 서비스가 자동으로 시작되도록 구성합니다.

mytest.service를 활성화하려면 다음 명령을 실행합니다.

sudo systemctl enable mytest.service

전체 systemd 환경에서 심볼릭 링크가 생성될 것임을 나타내는 다음과 유사한 출력을 볼 수 있습니다.

Created symlink /etc/systemd/system/multi-user.target.wants/mytest.service → /etc/systemd/system/mytest.service.

이제 systemctl is-enabled를 사용하여 서비스가 활성화되었는지 확인합니다.

systemctl is-enabled mytest.service

예상 출력:

enabled

이는 systemctl이 이제 mytest.service를 부팅 시 활성화된 것으로 간주함을 확인합니다.

--now 옵션을 사용하여 서비스를 활성화하고 시작하는 것을 한 명령으로 결합할 수도 있습니다. 이는 서비스가 즉시 실행되고 향후 부팅 시 시작되도록 구성하는 편리한 방법입니다.

먼저 --now 시연을 위해 서비스를 비활성화합니다.

sudo systemctl disable mytest.service

이제 동시에 활성화하고 시작합니다.

sudo systemctl enable --now mytest.service

상태와 활성화 여부를 확인합니다.

systemctl status mytest.service
systemctl is-enabled mytest.service

status 명령에서 Active: active (running)을, is-enabled 명령에서 enabled를 볼 수 있어야 합니다.

서비스 비활성화하기

서비스를 비활성화하려면 systemctl disable 명령을 사용합니다. 이 명령은 서비스가 부팅 시 시작되도록 하는 구성을 제거합니다.

mytest.service를 비활성화하려면 다음 명령을 실행합니다.

sudo systemctl disable mytest.service

심볼릭 링크 제거를 나타내는 출력을 볼 수 있습니다.

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

이제 서비스가 비활성화되었는지 확인합니다.

systemctl is-enabled mytest.service

예상 출력:

disabled

활성화와 유사하게 --now 옵션을 사용하여 서비스를 비활성화하고 중지하는 것을 결합할 수 있습니다. 이렇게 하면 서비스가 즉시 중지되고 향후 부팅 시 시작되지 않도록 방지합니다.

sudo systemctl disable --now mytest.service

상태와 활성화 여부를 확인합니다.

systemctl status mytest.service
systemctl is-enabled mytest.service

status 명령에서 Active: inactive (dead)를, is-enabled 명령에서 disabled를 볼 수 있어야 합니다.

이것으로 서비스 활성화 및 비활성화 시연을 마칩니다. 실제 systemd 환경에서는 이러한 명령이 부팅 구성을 직접 조작한다는 것을 기억하십시오.

systemctl 로 서비스 마스킹 및 마스킹 해제

이 마지막 단계에서는 서비스 마스킹 및 언마스킹에 대해 배웁니다. 서비스 마스킹은 수동으로 또는 부팅 시 자동으로 시작되는 것을 방지하는 강력한 방법입니다.

서비스를 마스킹하면 systemd/etc/systemd/system/<service-name>.service에서 /dev/null로 심볼릭 링크를 생성하여 서비스 유닛 파일을 systemd에서 사용할 수 없게 만듭니다. 이는 disable보다 강력한 대안입니다.

이 메커니즘은 패키지가 서비스 파일을 설치하는 /usr/lib/systemd/system에 정의된 서비스에 가장 잘 작동합니다. mask 명령은 /etc/systemd/system에 재정의하는 "빈" 파일을 생성합니다. 그러나 발견했듯이, /etc/systemd/system에 직접 생성한 서비스 (예: mytest.service) 를 마스킹하려고 하면, 데이터 손실을 유발할 수 있는 기존 구성 파일을 덮어쓰지 않도록 설계되었기 때문에 명령이 실패할 수 있습니다.

마스킹을 올바르게 시연하기 위해 미리 존재하는 서비스인 atd.service를 사용하겠습니다.

먼저 atd.service의 현재 상태를 확인합니다. 활성 상태이고 활성화되어 있어야 합니다.

systemctl status atd.service

출력은 다음과 유사하며 서비스가 활성 상태이고 실행 중임을 보여줍니다.

● atd.service - Deferred execution scheduler
     Loaded: loaded (/usr/lib/systemd/system/atd.service; enabled; preset: enabled)
     Active: active (running) since Tue 2025-07-22 09:13:06 CST; 22min ago
       Docs: man:atd(8)
   Main PID: 1222 (atd)
      Tasks: 1 (limit: 22509)
     Memory: 900.0K
        CPU: 5ms
     CGroup: /system.slice/atd.service
             └─1222 /usr/sbin/atd -f

서비스 마스킹하기

마스킹하기 전에 서비스를 중지하는 것이 좋습니다.

sudo systemctl stop atd.service

이제 atd.service를 마스킹하려면 다음 명령을 실행합니다.

sudo systemctl mask atd.service

/dev/null로의 심볼릭 링크 생성을 나타내는 출력을 볼 수 있습니다.

Created symlink /etc/systemd/system/atd.service → /dev/null.

이제 마스킹된 서비스를 시작해 봅니다.

sudo systemctl start atd.service

서비스가 마스킹되었음을 나타내는 오류 메시지가 표시됩니다.

Failed to start atd.service: Unit atd.service is masked.

systemctl list-unit-files를 사용하여 서비스 상태를 확인할 수도 있습니다.

systemctl list-unit-files --type=service | grep atd.service

출력은 atd.service에 대해 masked를 표시해야 합니다.

atd.service                            masked      enabled

이는 서비스가 이제 마스킹되었으며 시작할 수 없음을 확인합니다.

서비스 언마스킹하기

서비스를 언마스킹하려면 systemctl unmask 명령을 사용합니다. 이 명령은 /dev/null로의 심볼릭 링크를 제거하여 /usr/lib/systemd/system의 원래 서비스 파일을 복원합니다.

atd.service를 언마스킹하려면 다음 명령을 실행합니다.

sudo systemctl unmask atd.service

심볼릭 링크 제거를 나타내는 출력을 볼 수 있습니다.

Removed "/etc/systemd/system/atd.service".

이제 systemctl list-unit-files를 다시 사용하여 서비스 상태를 확인합니다.

systemctl status atd.service

다음과 유사하게 Active: active (running)을 볼 수 있어야 합니다.

● atd.service - Deferred execution scheduler
     Loaded: loaded (/usr/lib/systemd/system/atd.service; enabled; preset: enabled)
     Active: active (running) since Tue 2025-07-22 09:36:10 CST; 2s ago
       Docs: man:atd(8)
   Main PID: 7372 (atd)
      Tasks: 1 (limit: 22509)
     Memory: 868.0K
        CPU: 6ms
     CGroup: /system.slice/atd.service
             └─7372 /usr/sbin/atd -f

이것으로 서비스 및 데몬 제어에 대한 실습을 마칩니다. systemctl을 사용하여 서비스를 보고, 시작하고, 중지하고, 다시 시작하고, 다시 로드하고, 활성화하고, 비활성화하고, 마스킹하고, 언마스킹하는 방법을 배웠습니다.

요약

이 실습에서는 systemd가 주 init 시스템이 아닐 수 있는 컨테이너화된 환경에서도 systemctl 명령을 사용하여 제어 시스템 서비스를 관리하는 실질적인 경험을 쌓았습니다. systemctl list-units --type=service를 사용하여 로드되고 활성 상태인 모든 서비스 유닛을 나열하는 방법을 배웠으며, UNIT, LOAD, ACTIVE, SUB 열을 이해하여 서비스 상태를 해석했습니다.

또한, 특정 서비스의 상태를 확인하는 systemctl status와 서비스를 시작, 중지 및 다시 시작하여 서비스 수명 주기를 제어하는 필수적인 서비스 관리 작업을 탐색했습니다. 부팅 시 동작을 제어하기 위해 서비스를 활성화 및 비활성화하는 방법과 서비스를 시작하지 못하도록 하는 마스킹 및 언마스킹의 고급 개념도 다루었습니다. 이러한 포괄적인 기술 세트는 RHEL 시스템에서 서비스를 관리하기 위한 견고한 기반을 제공합니다.