systemd 란?

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


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


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




systemd 의 target 은 유닉스의 SysV init 의 run level 과 같은 개념이나 구분이 쉽도록 숫자가 아닌 문자열로 입력하며 .target 확장자를 갖습니다.

systemd 의 기본 타겟은 다중 사용자 모드인 multi-user.target 이며 이는 기존 유닉스의 /etc/inittab 에 지정된 런 레벨중 3 번 Full multiuser mode 와 동일합니다.



이번 절에서는 systemctl 의 주요 기능중 프로세스 관리 기능에 대해서만 알아 봅시다.


서비스 관리

서비스 상태 확인

서비스의 현재 상태를 확인하려면 status 명령어 뒤에 서비스명을 주면 되며 아래 예제는 nginx 서비스의 상태를 표시합니다.



서비스 구동

서비스를 구동하려면 start 명령어 뒤에 서비스명을 주면 되며 아래 예제는 mariadb 서비스를 시작합니다.


서비스 중지

서비스 중지는 stop 옵션과 중지할 서비스 이름을 주면 되며 아래는 mariadb 서비스를 중지합니다.


서비스 자동 시작

웹 서버, DBMS 서버등 서비스에 필요한 데몬들은 부팅과 동시에 자동으로 구동되어야 합니다.

CentOS 6 까지는 chkconfig 명령으로 자동 부팅 여부를 설정할 수 있었지만 Ubuntu 16, CentOS 7 부터는 systemctl enable 명령을 사용하면 됩니다.


서비스 자동 시작 중지

자동 시작을 취소하고 싶은 경우  systemctl disable 명령을 사용하면 됩니다.


동작중인 모든 서비스 목록

systemctl 에 등록된 유닛은 부팅시 자동 구동되는 모든 명령어도 포함되므로 만약 서비스만 보려면 필터 명령어인 --type=service 구문을 주면 됩니다.

또 이중에서 실행중인 서비스 목록만 뽑아 볼 경우 --state=running 옵션을 주면 되며 아래는 서비스중에 현재 동작중인 목록을 표시하는 명령입니다.


자동 시작 서비스 목록

부팅시 자동 시작되는 서비스중 필요없는 서비스가 있을 수 있습니다. 이를 확인하려면 먼저 전체 등록된 서비스중에 부팅시 자동으로 시작되는 서비스의 목록을 확인해야 하며 --state=enable 옵션으로 목록을 확인할 수 있습니다.



journalctl 로 로그 보기

systemd 로 데몬 프로세스 구동시 데몬 프로세스가 제대로 구동되지 않을 경우 systemd 가 발행하는 로그 파일에 해당 이력을 남기게 됩니다. 그러므로 무엇때문에 구동에 실패했는지를 확인하려면 이 로그를 보아야 하며 이를 위해 journalctl 이라는 별도의 명령어를 사용하면 됩니다.


예로 아파치 웹 서버 구동에 실패하면 systemctl 은 아래와 같이 로그를 통해 원인을 파악하라는 메시지를 표시해 줍니다.


안내 메시지처럼 systemctl status 명령어로 아파치 웹 서버의 상태를 확인할 수 있고 더 자세한 로그를 보려면 journalctl -xe 명령어를 사용하면 됩니다.


가끔 터미널 컬럼 길이보다 메시지가 길 경우 개행을 하지 않아서 에러 메시지를 보기가 어려운 경우가 있습니다. 위의 예제에서도 "Apache is running" 뒤에 에러 메시지가 있지만 개행하지 않아서 정확한 메시지를 읽을수가 없어서 원인 파악이 힘들어 집니다.


이런 경우 journalctl 에 pager 를 사용하지 않도록 설정하면 터미널 길이보다 긴 메시지는 자동 개행이 되므로 전체 에러 로그를 확인할 수 있습니다.


위에서 진한 색으로 강조한 부분처럼 아파치가 구동되지 않은 에러 메시지를 표시해 주므로 원인을 파악하고 이에 따라 적절한 조치를 할 수 있으니 -xn --no-pager 옵션을 익혀 두기 바랍니다.