서비스 관리하기

systemd 란?

웹 서비스를 구성할 때 사용하는 apache httpd 나 nginx, tomcat 등은 부팅이 되면 자동으로 구동되어야 하며 설정이 변경되었을 때 서비스 데몬도 재구동되어야 합니다.


기존에는 부팅시 자동으로 구동되는 프로세스 관리를 init.d 라는 슈퍼 데몬(super daemon) 이 처리했지만 속도가 느리고 병렬로 실행이 안 되는 문제가 있어서 RHEL/CentOS 7과  Ubuntu16 은 systemd 라는 제품을 도입했습니다.


systemd  다루는 명령어인 systemctl 은 데몬의 시작과 종료, 상태 보기, 자동 시작 설정등 기존의 service 명령어와 chkconfig 명령어의 기능을 모두 수행할 수 있으며 기존 명령어인 servicechkconfig 와 비교는 아래와 같습니다.


servicesystemctl설명

service name start

systemctl start name.service

서비스 시작

service name stop

systemctl stop name.service

서비스 중지

service name restart

systemctl restart name.service

서비스 재시작

service name condrestart

systemctl try-restart name.service

서비스가 구동중이었을 경우에만 재시작

service name reload

systemctl reload name.service

설정 재구동

service name status

systemctl status name.service
systemctl is-active name.service

서비스 구동 여부 확인

service --status-all

systemctl list-units --type service --all

모든 서비스의 상태 표시

출처: 레드햇 관리자 매뉴얼(https://access.redhat.com/documentation/en-US/Red_Hat_Enterprise_Linux/7/html/System_Administrators_Guide/sect-Managing_Services_with_systemd-Services.html)

service 명령어와 systemctl 비교



servicesystemctl설명

chkconfig name on

systemctl enable name.service

서비스 활성화(부팅시 자동 구동)

chkconfig name off

systemctl disable name.service

서비스 비활성화

chkconfig --list name

systemctl status name.service
systemctl is-enabled name.service

서비스의 활성화 여부 표시

chkconfig --list

systemctl list-unit-files --type service

모든 서비스의 현재 활성화 여부 표시

chkconfig --list

systemctl list-dependencies --after

현재 target 이후에 시작하는 서비스의 목록

chkconfig --list

systemctl list-dependencies --before

현재 target 이전에 시작하는 서비스의 목록
chkconfig 명령어와 systemctl 비교

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 진하게 표시

journalctl 로그 보기


가끔 터미널 컬럼 길이보다 메시지가 길 경우 개행을 하지 않아서 에러 메시지를 보기가 어려운 경우가 있습니다. 위의 예제에서도 "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