10.2. 시스템 서비스 관리
전문 지식을 확장하려면 Red Hat System Administration II(RH 442) 교육 과정에도 관심이 있을 수 있습니다.
SysV init 또는 Upstart와 함께 배포된 이전 버전의 Red Hat Enterprise Linux는 /etc/rc.d/init.d/
디렉터리에 있는 init 스크립트 를 사용했습니다. 이러한 init 스크립트는 일반적으로 Bash로 작성되었으며 시스템 관리자가 시스템의 서비스 및 데몬 상태를 제어할 수 있습니다. Red Hat Enterprise Linux 7에서는 이러한 init 스크립트가 서비스 단위로 교체되었습니다.
서비스 단위는 .service
파일 확장자로 종료되고 init 스크립트와 유사한 목적을 제공합니다. 시스템 서비스를 확인, 시작, 중지, 다시 시작, 활성화 또는 비활성화하려면 이 섹션의 표 10.3. “systemctl과 서비스 utility 비교”, 표 10.4. “systemctl과 chkconfig utility 비교” 및 기타에 설명된 대로 systemctl
명령을 사용합니다. service
및 chkconfig
명령은 계속 시스템에서 사용할 수 있으며 예상대로 작동하지만 호환성상의 이유로만 포함되어 피해야 합니다.
service | systemctl | 설명 |
---|---|---|
|
| 서비스를 시작합니다. |
|
| 서비스를 중지합니다. |
|
| 서비스를 다시 시작합니다. |
|
| 실행 중인 경우에만 서비스를 다시 시작합니다. |
|
| 구성을 다시 로드합니다. |
|
| 서비스가 실행 중인지 확인합니다. |
|
| 모든 서비스의 상태를 표시합니다. |
chkconfig | systemctl | 설명 |
---|---|---|
|
| 서비스를 활성화합니다. |
|
| 서비스를 비활성화합니다. |
|
| 서비스가 활성화되어 있는지 확인합니다. |
|
| 모든 서비스를 나열하고 활성화되어 있는지 확인합니다. |
|
| 지정된 유닛 전에 시작하도록 정렬된 서비스를 나열합니다. |
|
| 지정된 유닛 후에 시작하도록 정렬된 서비스를 나열합니다. |
서비스 단위 지정
명확성을 위해 이 섹션의 모든 명령 예제는 .service
파일 확장자와 함께 전체 단위 이름을 사용합니다. 예를 들면 다음과 같습니다.
~]# systemctl stop nfs-server.service
그러나 파일 확장자는 생략할 수 있습니다. 이 경우 systemctl
유틸리티는 인수가 서비스 단위라고 가정합니다. 다음 명령은 위의 명령과 동일합니다.
~]# systemctl stop nfs-server
또한 일부 유닛에는 별칭 이름이 있습니다. 이러한 이름은 실제 장치 이름 대신 사용할 수 있는 유닛보다 짧은 이름을 가질 수 있습니다. 특정 유닛에 사용할 수 있는 모든 별칭을 찾으려면 다음을 사용합니다.
~]# systemctl show nfs-server.service -p Names
chroot 환경에서 systemctl 동작
chroot
명령을 사용하여 루트 디렉터리를 변경하는 경우 대부분의 systemctl
명령은 모든 작업 수행을 거부합니다. 그 이유는 systemd
프로세스와 chroot
명령을 사용한 사용자에게 파일 시스템에 대한 동일한 보기가 없기 때문입니다. 예를 들어 Kickstart
파일에서 systemctl
을 호출할 때 이러한 상황이 발생합니다.
이 예외는 systemctl enable
및 systemctl disable
명령과 같은 단위 파일 명령입니다. 이러한 명령은 실행 중인 시스템이 필요하지 않으며 실행 중인 프로세스에는 영향을 미치지 않지만 장치 파일에 영향을 미칩니다. 따라서 chroot
환경에서도 이러한 명령을 실행할 수 있습니다. 예를 들어 /srv/website1/
디렉터리의 시스템에서 httpd
서비스를 활성화하려면 다음을 수행합니다.
~]# chroot /srv/website1 ~]# systemctl enable httpd.service Created symlink /etc/systemd/system/multi-user.target.wants/httpd.service, pointing to /usr/lib/systemd/system/httpd.service.
10.2.1. 서비스 나열
현재 로드된 서비스 유닛을 모두 나열하려면 쉘 프롬프트에서 다음을 입력합니다.
systemctl list-units --type service
각 서비스 유닛 파일에 대해 이 명령은 전체 이름(UNIT
)을 표시하고 단위 파일이 로드되었는지 여부(LOAD
), 높은 수준의( started ) 및 하위 수준(SUB
) 단위 파일 활성화 상태, 짧은 설명(DESCRIPTION
)을 표시합니다.
기본적으로 systemctl list-units
명령은 활성 유닛만 표시합니다. 상태에 관계없이 로드된 유닛을 모두 나열하려면 --all
또는 -a
명령줄 옵션을 사용하여 이 명령을 실행하십시오.
systemctl list-units --type service --all
사용 가능한 모든 서비스 유닛을 나열하여 활성화되어 있는지 확인할 수도 있습니다. 이렇게 하려면 다음을 입력합니다.
systemctl list-unit-files --type service
각 서비스 유닛에 대해 이 명령은 전체 이름(UNIT FILE
)을 표시하고 서비스 유닛이 활성화되었는지 여부(STATE
)가 있는지 여부가 표시됩니다. 개별 서비스 유닛의 상태를 결정하는 방법에 대한 자세한 내용은 10.2.2절. “서비스 상태 표시” 을 참조하십시오.
예 10.1. 서비스 나열
현재 로드된 서비스 유닛을 모두 나열하려면 다음 명령을 실행합니다.
~]$ systemctl list-units --type service
UNIT LOAD ACTIVE SUB DESCRIPTION
abrt-ccpp.service loaded active exited Install ABRT coredump hook
abrt-oops.service loaded active running ABRT kernel log watcher
abrt-vmcore.service loaded active exited Harvest vmcores for ABRT
abrt-xorg.service loaded active running ABRT Xorg log watcher
abrtd.service loaded active running ABRT Automated Bug Reporting Tool
...
systemd-vconsole-setup.service loaded active exited Setup Virtual Console
tog-pegasus.service loaded active running OpenPegasus CIM Server
LOAD = Reflects whether the unit definition was properly loaded.
ACTIVE = The high-level unit activation state, i.e. generalization of SUB.
SUB = The low-level unit activation state, values depend on unit type.
46 loaded units listed. Pass --all to see loaded but inactive units, too.
To show all installed unit files use 'systemctl list-unit-files'
설치된 모든 서비스 장치 파일을 나열하여 활성화되어 있는지 확인하려면 다음을 입력합니다.
~]$ systemctl list-unit-files --type service UNIT FILE STATE abrt-ccpp.service enabled abrt-oops.service enabled abrt-vmcore.service enabled abrt-xorg.service enabled abrtd.service enabled ... wpa_supplicant.service disabled ypbind.service disabled 208 unit files listed.
10.2.2. 서비스 상태 표시
시스템 서비스에 해당하는 서비스 유닛에 대한 자세한 정보를 표시하려면 쉘 프롬프트에서 다음을 입력합니다.
systemctl status name.service
name 을 검사할 서비스 유닛의 이름으로 바꿉니다(예: gdm
). 이 명령은 선택한 서비스 단위의 이름, 간단한 설명, 표 10.5. “사용 가능한 서비스 단위 정보” 에 설명된 하나 이상의 필드, root
사용자가 실행하는 경우 가장 최근 로그 항목도 표시합니다.
필드 | 설명 |
---|---|
| 서비스 유닛이 로드되었는지 여부, 단위 파일의 절대 경로 및 장치가 활성화되었는지 여부를 나타냅니다. |
| 서비스 유닛이 실행 중인지 여부 및 타임스탬프를 제공합니다. |
| 해당 시스템 서비스의 PID와 해당 이름. |
| 해당 시스템 서비스에 대한 추가 정보입니다. |
| 관련 프로세스에 대한 추가 정보. |
| 관련 제어 그룹(cgroups)에 대한 추가 정보. |
특정 서비스 장치가 실행 중인지 확인하려면 다음 명령을 실행합니다.
systemctl is-active name.service
마찬가지로 특정 서비스 장치가 활성화되어 있는지 여부를 확인하려면 다음을 입력합니다.
systemctl is-enabled name.service
systemctl is-active
및 systemctl is-enabled
는 모두 지정된 서비스 장치가 실행 중이거나 활성화되어 있는 경우 종료 상태 0
을 반환합니다. 현재 로드된 모든 서비스 단위를 나열하는 방법에 대한 자세한 내용은 10.2.1절. “서비스 나열” 을 참조하십시오.
예 10.2. 서비스 상태 표시
GNOME Display Manager의 서비스 단위는 gdm.service
라고 합니다. 이 서비스 장치의 현재 상태를 확인하려면 쉘 프롬프트에서 다음을 입력합니다.
~]# systemctl status gdm.service gdm.service - GNOME Display Manager Loaded: loaded (/usr/lib/systemd/system/gdm.service; enabled) Active: active (running) since Thu 2013-10-17 17:31:23 CEST; 5min ago Main PID: 1029 (gdm) CGroup: /system.slice/gdm.service ├─1029 /usr/sbin/gdm ├─1037 /usr/libexec/gdm-simple-slave --display-id /org/gno... └─1047 /usr/bin/Xorg :0 -background none -verbose -auth /r... Oct 17 17:31:23 localhost systemd[1]: Started GNOME Display Manager.
예 10.3. 서비스 시작하기 전에 주문된 서비스 표시
지정된 서비스 이전에 정렬된 서비스를 확인하려면 쉘 프롬프트에서 다음을 입력합니다.
~]# systemctl list-dependencies --after gdm.service gdm.service ├─dbus.socket ├─getty@tty1.service ├─livesys.service ├─plymouth-quit.service ├─system.slice ├─systemd-journald.socket ├─systemd-user-sessions.service └─basic.target [output truncated]
예 10.4. 서비스 종료 후 서비스에 주문한 서비스 표시
지정된 서비스 후에 시작하도록 정렬된 서비스를 확인하려면 쉘 프롬프트에서 다음을 입력합니다.
~]# systemctl list-dependencies --before gdm.service gdm.service ├─dracut-shutdown.service ├─graphical.target │ ├─systemd-readahead-done.service │ ├─systemd-readahead-done.timer │ └─systemd-update-utmp-runlevel.service └─shutdown.target ├─systemd-reboot.service └─final.target └─systemd-reboot.service
10.2.3. 서비스 시작
시스템 서비스에 해당하는 서비스 장치를 시작하려면 root
로 쉘 프롬프트에 다음을 입력합니다.
systemctl start name.service
시작할 서비스 유닛의 이름으로 이름을 바꿉니다(예: gdm
). 이 명령은 현재 세션에서 선택한 서비스 유닛을 시작합니다. 부팅 시 서비스 유닛을 시작하는 방법에 대한 자세한 내용은 10.2.6절. “서비스 활성화” 을 참조하십시오. 특정 서비스 유닛의 상태를 결정하는 방법에 대한 자세한 내용은 10.2.2절. “서비스 상태 표시” 을 참조하십시오.
예 10.5. 서비스 시작
Apache HTTP 서버의 서비스 단위는 httpd.service
라고 합니다. 이 서비스 장치를 활성화하고 현재 세션에서 httpd
데몬을 시작하려면 root
로 다음 명령을 실행합니다.
~]# systemctl start httpd.service
10.2.4. 서비스 중지
시스템 서비스에 해당하는 서비스 장치를 중지하려면 쉘 프롬프트에 root
로 다음을 입력합니다.
systemctl stop name.service
중지하려는 서비스 유닛의 이름으로 이름을 바꿉니다(예: bluetooth
). 이 명령은 현재 세션에서 선택한 서비스 유닛을 중지합니다. 서비스 유닛을 비활성화하고 부팅 시 시작되지 않게 하는 방법에 대한 자세한 내용은 10.2.7절. “서비스 비활성화” 을 참조하십시오. 특정 서비스 유닛의 상태를 결정하는 방법에 대한 자세한 내용은 10.2.2절. “서비스 상태 표시” 을 참조하십시오.
예 10.6. 서비스 중지
bluetoothd
데몬의 서비스 단위 이름은 bluetooth.service
입니다. 이 서비스 유닛을 비활성화하고 현재 세션에서 bluetoothd
데몬을 중지하려면 root
로 다음 명령을 실행합니다.
~]# systemctl stop bluetooth.service
10.2.5. 서비스 다시 시작
시스템 서비스에 해당하는 서비스 장치를 다시 시작하려면 root
로 쉘 프롬프트에 다음을 입력합니다.
systemctl restart name.service
이름을 재시작할 서비스 유닛의 이름으로 바꿉니다(예: httpd
). 이 명령은 현재 세션에서 선택한 서비스 장치를 중지하고 즉시 다시 시작합니다. 중요한 점은 선택한 서비스 장치가 실행되고 있지 않으면 이 명령도 시작합니다. 해당 서비스가 이미 실행 중인 경우에만 서비스 장치를 재시작하도록 systemd에 지시하려면 root
로 다음 명령을 실행합니다.
systemctl try-restart name.service
또한 특정 시스템 서비스를 사용하면 실행을 중단하지 않고 구성을 다시 로드할 수 있습니다. 이 작업을 수행하려면 root
로 입력합니다.
systemctl reload name.service
이 기능을 지원하지 않는 시스템 서비스는 이 명령을 모두 무시합니다. 편의를 위해 systemctl
명령은 서비스를 다시 시작하는 reload-or-restart
및 reload-or-try-restart
명령도 지원합니다. 특정 서비스 유닛의 상태를 결정하는 방법에 대한 자세한 내용은 10.2.2절. “서비스 상태 표시” 을 참조하십시오.
예 10.7. 서비스 다시 시작
사용자가 불필요한 오류 메시지나 부분적으로 렌더링된 웹 페이지가 발생하지 않도록 하려면 Apache HTTP Server를 사용하여 구성을 다시 시작하고 적극적으로 처리된 요청을 중단하지 않고도 해당 구성을 편집하고 다시 로드할 수 있습니다. 이렇게 하려면 쉘 프롬프트에서 root
로 다음을 입력합니다.
~]# systemctl reload httpd.service
10.2.6. 서비스 활성화
부팅 시 자동으로 시스템 서비스에 해당하는 서비스 장치를 구성하려면 쉘 프롬프트에서 root
로 다음을 입력합니다.
systemctl enable name.service
name 을 활성화할 서비스 유닛의 이름으로 바꿉니다(예: httpd
). 이 명령은 선택한 서비스 장치의 [Install]
섹션을 읽고 /etc/systemd/system
파일에 대한 적절한 심볼릭 링크를 생성합니다. 그러나 이 명령은 이미 존재하는 링크를 다시 작성하지 않습니다. 심볼릭 링크가 다시 생성되었는지 확인하려면 /
디렉터리에 있는 /usr/lib/systemd/system/name.serviceroot
로 다음 명령을 사용하십시오.
systemctl reenable name.service
이 명령은 선택한 서비스 장치를 비활성화하고 즉시 다시 활성화합니다. 특정 서비스 유닛이 부팅 시 시작되도록 활성화되었는지 확인하는 방법에 대한 자세한 내용은 10.2.2절. “서비스 상태 표시” 을 참조하십시오. 현재 세션에서 서비스를 시작하는 방법에 대한 자세한 내용은 10.2.3절. “서비스 시작” 을 참조하십시오.
예 10.8. 서비스 활성화
부팅 시 자동으로 시작하도록 Apache HTTP Server를 구성하려면 root
로 다음 명령을 실행합니다.
~]# systemctl enable httpd.service Created symlink from /etc/systemd/system/multi-user.target.wants/httpd.service to /usr/lib/systemd/system/httpd.service.
10.2.7. 서비스 비활성화
부팅 시 시스템 서비스에 해당하는 서비스 장치가 자동으로 시작되지 않도록 하려면 쉘 프롬프트에서 root
로 다음을 입력합니다.
systemctl disable name.service
비활성화하려는 서비스 유닛의 이름으로 이름을 바꿉니다(예: bluetooth
). 이 명령은 선택한 서비스 장치의 [Install]
섹션을 읽고 /etc/systemd/system
파일에 대한 적절한 심볼릭 링크를 제거합니다. 또한 서비스 유닛을 마스킹하여 수동으로 또는 다른 서비스에 의해 시작되지 않도록 할 수 있습니다. 이렇게 하려면 /
디렉터리 및 하위 디렉터리의 /usr/lib/systemd/system/name.serviceroot
로 다음 명령을 실행하십시오.
systemctl mask name.service
이 명령은 /etc/systemd/system/name.service
파일을 /dev/null
에 대한 심볼릭 링크로 대체하여 systemd에 액세스할 수 없는 실제 장치 파일을 렌더링합니다. 이 작업을 취소하고 서비스 유닛을 마스크 해제하려면 root
로 를 입력합니다.
systemctl unmask name.service
특정 서비스 유닛이 부팅 시 시작되도록 활성화되었는지 확인하는 방법에 대한 자세한 내용은 10.2.2절. “서비스 상태 표시” 을 참조하십시오. 현재 세션에서 서비스를 중지하는 방법에 대한 자세한 내용은 10.2.4절. “서비스 중지” 을 참조하십시오.
예 10.9. 서비스 비활성화
예 10.6. “서비스 중지” 현재 세션에서 bluetooth.service
유닛을 중지하는 방법을 보여줍니다. 이 서비스 장치가 부팅 시 시작되지 않도록 하려면 쉘 프롬프트에 root
로 다음을 입력합니다.
~]# systemctl disable bluetooth.service Removed symlink /etc/systemd/system/bluetooth.target.wants/bluetooth.service. Removed symlink /etc/systemd/system/dbus-org.bluez.service.
10.2.8. 서비스 충돌 시작
systemd 에서 서비스 간 양수 및 음수 종속성이 있습니다. 특정 서비스를 시작하려면 하나 이상의 다른 서비스(positive dependency)를 시작하거나 하나 이상의 서비스(negative 종속성)를 중지해야 할 수 있습니다.
새 서비스를 시작하려고 하면 systemd 는 모든 종속성을 자동으로 해결합니다. 이 작업은 사용자에게 명시적인 알림 없이 수행됩니다. 이미 서비스를 실행하고 음수 종속성으로 다른 서비스를 시작하려고 하면 첫 번째 서비스가 자동으로 중지됩니다.
예를 들어 postfix
서비스를 실행 중이고 sendmail
서비스를 시작하려고 하면 systemd 는 먼저 postfix
를 자동으로 중지합니다. 이러한 두 서비스가 충돌하며 동일한 포트에서 실행할 수 없기 때문입니다.