리눅스서버

systemd에서 부팅시 실행할 서비스 관리하기 (CentOS 7)

원래 부팅시 정해진 서비스 또는 스크립트를 실행시키는 건 init (System V Init)라는 프로그램의 몫이였습니다. 유닉스가 처음 생길때부터 그래왔고, 지금도 그렇습니다.(하지만 지금은 다른 아이로 교체되는 시기입니다.) init는 그 이름처럼 리눅스의 초기화부분을 담당합니다.


init 사용자들이 /etc/rc.d/init.d 디렉토리에 부팅시 실행할 서비스 스크립트를 넣으면, init는 부팅이나 특정행동이 있을때 그 스크립트들을 자동으로 실행시키는 역활을 했었습니다. 그러면 사용자들은 chkconfig명령으로 자동실행 서비스를 관리하거나 service start 명령으로 서비스들을 실행키거나 끌 수 있었습니다.


하지만 centos 7을 넘어온 현재...

끝까지 유지될 것 같았던 init는 systemd이라는 새로운 아이에게 임무를 빼앗버렸답니다. 결국 유눅스 탄생부터 항상 init가 있었던 자리.. 프로세스1(PID 1)의 자리 또한 systemd에게 빼앗기고 말았습니다. 

따라서 centos 7에서는 부팅 서비스를 systemd 에서 관리하게 되었습니다. init는 없어지지는 않았지만 제 기능을 하지못하는 상태입니다.



1. init를 밀어낸 새로운 아이 systemd의 정체

systemd는 init에 비해 우월한 성능과 뭐든지 잘하는 재능(기능)을 가지고 있었습니다. 그야말로 "엄친아"였던 것입니다. 그러니까 개발자들도 systemd 매력에 흠뻑 빠졌기에 데려왔겠죠.. 


systemd는 정말 기능이 많습니다. 서비스관리, 시스템 로그관리, 사용자관리, 시간, 원격, cgroup 관리등.. 참 할 수 있는 일이 많습니다. 시스템의 전반적인 관리를 전부 systemd 이 담당하고 있습니다. 그리고 아이는 부팅시 실행하는 서비스를 최소화하고, 추후 병렬실행이라는 정책을 갖고 있었습니다. 때문에 centos 7 에서는 부팅시간이 많이 잛아졌답니다.


참조사항 : http://www.freedesktop.org/wiki/Software/systemd/


잡설이지만, 아이를 데려오기전 말들이 많았다고 해요.. 기능많은 아이가 "한가지만 잘하자"라는 유닉스의 철학(?)과 맞지않다는 의견도 있었고, 오랫동안 함께한 init를 버리자니, 슬프다(?)는 의견도 있었습니다. 이처럼 논란이 있었다고 해요.. 집안(리눅스)에 새로운 아이를 들이는 문제로...



2. systemd 잠시 살펴보기

이 글의 목적과는 별로 상관없지만, 그래도 새로운 아이를 만났으니, 한번 살펴봅시다.


먼저 systemd의 설정파일들은 /etc/systemd 에 있습니다. 

( bootchart.conf  logind.conf  system.conf  user.conf )


systemd는 설정파일과 미리 정의된 Service, Target 파일을 통해서 시스템을 제어하게 됩니다. 파일이 있는 디렉토리는 다음과 같습니다.

  • 관련된 바이너리 실행파일 : /usr/lib/systemd
  • Service, Target 파일 : /usr/lib/systemd/system


* 유용한 명령어

# systemd-analyze : 부팅에 걸린시간 표시

# systemd-analyze blame : 부팅시 서비스별 걸린 시간표시

journalctl : 부팅을 포함한 전체적인 시스템 로그

# journalctl -b : 마지막 부팅 이후 시스템 로그

# hostnamectl : 호스트 이름표시

# hostnamectl set-hostname [변경이름] : 호스트이름 변경



3. systemd 에서 서비스 관리하기

A. 서비스 상태표시


- 존재하는 전체 서비스 목록

# systemctl 


- 서비스 목록 (활성화 여부만 표시) 

# systemctl list-unit-files


- 부팅시 실행에 실패한 서비스목록

# systemctl --failed


- 서비스 활성화 여부

# systemctl is-enabled [서비스명]


- 서비스 현재 동작 여부

# systemctl is-active [서비스명]


- 서비스의 자세한 상태 (해당 서비스의 로그도 표시)

# systemctl status -l [서비스명]



B. 서비스 제어

서비스를 활성화하게 되면 부팅시 해당 서비스가 자동실행됩니다.


- 서비스 활성화

# systemctl enable [서비스명]


- 서비스 비활성화

# systemctl disable [서비스명]


- 서비스 시작

# systemctl start [서비스명]


- 서비스 종료

# systemctl stop [서비스명]


- 서비스 재시작

# systemctl restart [서비스명]


- 서비스 갱신

# systemctl reload [서비스명]


위의 서비스 설정을 데몬에 즉시 반영하려면 아래 명령어를 실행하면 됩니다.

#systemctl daemon-reload


- 서비스와 관련된 프로세스도 모두 죽임

# systemctl kill [서비스명]


?