서비스 관리하기
systemd 란?
웹 서비스를 구성할 때 사용하는 apache httpd 나 nginx, tomcat 등은 부팅이 되면 자동으로 구동되어야 하며 설정이 변경되었을 때 서비스 데몬도 재구동되어야 합니다.
기존에는 부팅시 자동으로 구동되는 프로세스 관리를 init.d 라는 슈퍼 데몬(super daemon) 이 처리했지만 속도가 느리고 병렬로 실행이 안 되는 문제가 있어서 RHEL/CentOS 7과 Ubuntu16 은 systemd 라는 제품을 도입했습니다.
systemd 를 다루는 명령어인 systemctl 은 데몬의 시작과 종료, 상태 보기, 자동 시작 설정등 기존의 service 명령어와 chkconfig 명령어의 기능을 모두 수행할 수 있으며 기존 명령어인 service 와 chkconfig 와 비교는 아래와 같습니다.
service | systemctl | 설명 |
---|---|---|
|
| 서비스 시작 |
|
| 서비스 중지 |
|
| 서비스 재시작 |
|
| 서비스가 구동중이었을 경우에만 재시작 |
|
| 설정 재구동 |
|
| 서비스 구동 여부 확인 |
|
| 모든 서비스의 상태 표시 |
service | systemctl | 설명 |
---|---|---|
|
| 서비스 활성화(부팅시 자동 구동) |
|
| 서비스 비활성화 |
|
| 서비스의 활성화 여부 표시 |
|
| 모든 서비스의 현재 활성화 여부 표시 |
|
| 현재 target 이후에 시작하는 서비스의 목록 |
|
| 현재 target 이전에 시작하는 서비스의 목록 |
systemd 의 target 은 유닉스의 SysV init 의 run level 과 같은 개념이나 구분이 쉽도록 숫자가 아닌 문자열로 입력하며 .target 확장자를 갖습니다.
systemd 의 기본 타겟은 다중 사용자 모드인 multi-user.target 이며 이는 기존 유닉스의 /etc/inittab 에 지정된 런 레벨중 3 번 Full multiuser mode 와 동일합니다.
이번 절에서는 systemctl 의 주요 기능중 프로세스 관리 기능에 대해서만 알아 봅시다.
서비스 관리
서비스 상태 확인
서비스의 현재 상태를 확인하려면 status 명령어 뒤에 서비스명을 주면 되며 아래 예제는 nginx 서비스의 상태를 표시합니다.
$ sudo systemctl status nginx ● nginx.service - nginx - high performance web server Loaded: loaded (/usr/lib/systemd/system/nginx.service; enabled; vendor preset: disabled) Active: active (running) since Mon 2017-07-03 17:18:37 KST; 15h ago Docs: http://nginx.org/en/docs/ Process: 1251 ExecStart=/usr/sbin/nginx -c /etc/nginx/nginx.conf (code=exited, status=0/SUCCESS) Process: 1201 ExecStartPre=/usr/sbin/nginx -t -c /etc/nginx/nginx.conf (code=exited, status=0/SUCCESS) Main PID: 1269 (nginx) CGroup: /system.slice/nginx.service ├─1269 nginx: master process /usr/sbin/nginx -c /etc/nginx/nginx.conf └─1275 nginx: worker process
서비스 구동
서비스를 구동하려면 start 명령어 뒤에 서비스명을 주면 되며 아래 예제는 mariadb 서비스를 시작합니다.
$ sudo systemctl start mariadb.service
서비스 중지
서비스 중지는 stop 옵션과 중지할 서비스 이름을 주면 되며 아래는 mariadb 서비스를 중지합니다.
$ sudo systemctl stop mariadb.service
서비스 자동 시작
웹 서버, DBMS 서버등 서비스에 필요한 데몬들은 부팅과 동시에 자동으로 구동되어야 합니다.
CentOS 6 까지는 chkconfig 명령으로 자동 부팅 여부를 설정할 수 있었지만 Ubuntu 16, CentOS 7 부터는 systemctl enable 명령을 사용하면 됩니다.
$ sudo systemctl enable mariadb.service
서비스 자동 시작 중지
자동 시작을 취소하고 싶은 경우 systemctl disable 명령을 사용하면 됩니다.
$ sudo systemctl disable mariadb.service
동작중인 모든 서비스 목록
systemctl 에 등록된 유닛은 부팅시 자동 구동되는 모든 명령어도 포함되므로 만약 서비스만 보려면 필터 명령어인 --type=service 구문을 주면 됩니다.
또 이중에서 실행중인 서비스 목록만 뽑아 볼 경우 --state=running 옵션을 주면 되며 아래는 서비스중에 현재 동작중인 목록을 표시하는 명령입니다.
$ sudo systemctl list-units --type=service --state=running UNIT LOAD ACTIVE SUB DESCRIPTION auditd.service loaded active running Security Auditing Service avahi-daemon.service loaded active running Avahi mDNS/DNS-SD Stack crond.service loaded active running Command Scheduler dbus.service loaded active running D-Bus System Message Bus firewalld.service loaded active running firewalld - dynamic firewall daemon getty@tty1.service loaded active running Getty on tty1 httpd.service loaded active running The Apache HTTP Server
자동 시작 서비스 목록
부팅시 자동 시작되는 서비스중 필요없는 서비스가 있을 수 있습니다. 이를 확인하려면 먼저 전체 등록된 서비스중에 부팅시 자동으로 시작되는 서비스의 목록을 확인해야 하며 --state=enable 옵션으로 목록을 확인할 수 있습니다.
$ sudo systemctl list-unit-files --type=service --state=enabled UNIT FILE STATE auditd.service enabled autovt@.service enabled avahi-daemon.service enabled crond.service enabled dbus-org.fedoraproject.FirewallD1.service enabled dbus-org.freedesktop.Avahi.service enabled dbus-org.freedesktop.NetworkManager.service enabled dbus-org.freedesktop.nm-dispatcher.service enabled
journalctl 로 로그 보기
systemd 로 데몬 프로세스 구동시 데몬 프로세스가 제대로 구동되지 않을 경우 systemd 가 발행하는 로그 파일에 해당 이력을 남기게 됩니다. 그러므로 무엇때문에 구동에 실패했는지를 확인하려면 이 로그를 보아야 하며 이를 위해 journalctl 이라는 별도의 명령어를 사용하면 됩니다.
예로 아파치 웹 서버 구동에 실패하면 systemctl 은 아래와 같이 로그를 통해 원인을 파악하라는 메시지를 표시해 줍니다.
$ sudo systemctl restart apache2 Job for apache2.service failed because the control process exited with error code. See "systemctl status apache2.service" and "journalctl -xe" for details.
TODO systemctl status apache2.service, "journalctl -xe" 진하게 표시
안내 메시지처럼 systemctl status 명령어로 아파치 웹 서버의 상태를 확인할 수 있고 더 자세한 로그를 보려면 journalctl -xe 명령어를 사용하면 됩니다.
$ sudo journalctl -xe -- Unit apache2.service has begun starting up. 7월 09 00:23:39 ubuntu apache2[4750]: * Starting Apache httpd web server apache2 7월 09 00:23:39 ubuntu apache2[4750]: * 7월 09 00:23:39 ubuntu apache2[4750]: * The apache2 configtest failed. 7월 09 00:23:39 ubuntu apache2[4750]: Output of config test was: 7월 09 00:23:39 ubuntu apache2[4750]: [Sun Jul 09 00:23:39.723059 2017] [:crit] [pid 4760:tid 139925195380608] Apache is running 7월 09 00:23:39 ubuntu apache2[4750]: AH00013: Pre-configuration failed 7월 09 00:23:39 ubuntu apache2[4750]: Action 'configtest' failed. 7월 09 00:23:39 ubuntu apache2[4750]: The Apache error log may have more information. 7월 09 00:23:39 ubuntu systemd[1]: apache2.service: Control process exited, code=exited status=1
TODO 139925195380608] Apache is running 진하게 표시
가끔 터미널 컬럼 길이보다 메시지가 길 경우 개행을 하지 않아서 에러 메시지를 보기가 어려운 경우가 있습니다. 위의 예제에서도 "Apache is running" 뒤에 에러 메시지가 있지만 개행하지 않아서 정확한 메시지를 읽을수가 없어서 원인 파악이 힘들어 집니다.
이런 경우 journalctl 에 pager 를 사용하지 않도록 설정하면 터미널 길이보다 긴 메시지는 자동 개행이 되므로 전체 에러 로그를 확인할 수 있습니다.
# journalctl -xn --no-pager 7월 09 00:23:39 ubuntu apache2[4750]: * The apache2 configtest failed. 7월 09 00:23:39 ubuntu apache2[4750]: Output of config test was: 7월 09 00:23:39 ubuntu apache2[4750]: [Sun Jul 09 00:23:39.723059 2017] [:crit] [pid 4760:tid 139925195380608] Apache is running a threaded MPM, but your PHP Module is not compiled to be threadsafe. You need to recompile PHP. 7월 09 00:23:39 ubuntu apache2[4750]: AH00013: Pre-configuration failed 7월 09 00:23:39 ubuntu apache2[4750]: Action 'configtest' failed.
TODO Apache is running a threaded MPM, but your PHP Module is not compiled 진하게
위에서 진한 색으로 강조한 부분처럼 아파치가 구동되지 않은 에러 메시지를 표시해 주므로 원인을 파악하고 이에 따라 적절한 조치를 할 수 있으니 -xn --no-pager 옵션을 익혀 두기 바랍니다.
Ref
- systemd(system daemon) 을 관리하는 systemctl 명령어 사용법
- https://access.redhat.com/documentation/en-US/Red_Hat_Enterprise_Linux/7/html/System_Administrators_Guide/sect-Managing_Services_with_systemd-Services.html
- service 와 chkconfig
- service 와 chkconfig
- Service Management
- RHEL/CentOS 용 System V service init scripts 작성하기
- https://access.redhat.com/documentation/en-US/Red_Hat_Enterprise_Linux/7/html/Security_Guide/sec-Securing_Services.html