[centos] 서비스

2019. 3. 25. 22:30study/centos 7 server & network



1. 서비스

: 시스템과 독자적으로 구동되어 제공하는 프로세스

ex) 웹서버(httpd), db 서버(mysqld), ftp 서버(vsftpd) 등이 있다.

: 서비스의 실행 스크립트 파일/usr/lib/systemd/system/비스이름.service


centos6까지는 /etc/rc.d/init.d  디렉터리에 서비스 관련 파일들이 있었다..

> 이를 chkconfig, service 명령어를 통해 제어했다.


centos7부터는 서비스들이 대부분 unit으로 분리되었고, 서비스이름.service 파일명을 가지며, 

systemctl 명령어로 제어한다.


2. systemctl

(아래 표에 대한 출처는 링크 걸어놨습니다.)


systemctl 

description 

systemctl start name.service

starts a service 

systemctl stop name.service  

stops a service 

systemctl restart name.service

restarts a service 

systemctl try-restart name.service

restarts a service only if it is running 

systemctl reload name.service

reloads configuration 

systemctl status name.service

systemctl is-active name.service

checks if a service is running 

 systemctl list-units --type service -all

displays the status of all services 


* systemctl 명령어의 자세한 내용 포스팅 예정



3. *.service


ex) sshd.service


[Unit]

Description=OpenSSH server daemon

Documentation=man:sshd(8) man:sshd_config(5)

After=network.target sshd-keygen.service

Wants=sshd-keygen.service


[Service]

Type=notify

EnvironmentFile=/etc/sysconfig/sshd

ExecStart=/usr/sbin/sshd -D $OPTIONS

ExecReload=/bin/kill -HUP $MAINPID

KillMode=process

Restart=on-failure

RestartSec=42s


[Install]

WantedBy=multi-user.target



3.1 [Unit]


- Description 

: 해당 유닛에 대한 상세한 설명을 포함한다.

: systemctl status 명령을 사용했을 때 출력되는 내용이다.


- Documentation

: 해당 유닛에 대한 문서를 참조하는 url의 목록을 제공한다.


- After 

: 유닛이 시작되는 순서를 정의한다.

: 이 항목에 지정된 유닛이 시작한 후에만 해당 유닛이 시작한다.


ex)

  After = network.target sshd-keygen.service

: network.target과 sshd-keygen.service가 시작된 후에 sshd.service가 시작된다.


* Before 옵션은 After과 반대 기능


- Wants

: Requires 보다는 약한 의존성을 설정한다.

: 만약 Wants 항목에 있는 모든 유닛이 성공적으로 시작하지 못하더라도, 해당 유닛의 활성화에 영향을 주지 않는다.


ex) 

  Wants = sshd-keygen.service

: sshd-keygen.service가 시작되지 못해도 sshd.service가 시작하는데 영향을 주지 않는다.


- Requires

: 다른 유닛들에 대한 의존성을 설정한다.

: 만약 Requires 항목에 있는 유닛들이 해당 유닛과 함께 활성화된다.

: 만약 항목에 있는 유닛들이 시작하지 못하면, 해당 유닛은 시작되지 않는다.


- Conflicts 

: Require과 반대


ex) 

  Conflicts = test.service

: sshd.service가 시작된 경우 test.service가 중지되고,

: sshd.service가 중지된 경우에는 test.service가 시작된다.




3.2 [Service]


- Type 

: 유닛 시작 타입을 설정한다.

(Execstart와 관련 옵션들의 기능에 영향을 주는)


 simple (default) 

: 유닛이 시작할 때의 (ExecStart 명령으로 시작한) 프로세스가 서비스의 메인 프로세스

: 즉, 유닛이 시작할 때 서비스가 시작된다고 판단


 forking 

: fork를 하는 데몬을 위해 사용된다.

: 서비스의 메인 프로세스가 되는 자식 프로세스를 생성한다.

> 완전히 시작되면 부모 프로세스는 종료된다.


* PIDFILE = 로 pid 파일을 선언 해줘야한다.


 oneshot 

: simple과 비슷한 타입

: consequent 유닛을 시작하기 전에 종료된다.


 dbus  

: simple과 비슷한 타입

: 메인 프로세스가 D-Bus 이름을 가진 후에만, 유닛이 시작된다.


 notify 

: simple과 비슷한 타입

: 알림 메시지(notification message)가 보내진 후에만, 유닛이 시작된다.


* sd_notify()가 메시지를 보낸다. 


 idle  

: simple과 비슷한 타입

: 모든 작업이 끝날 때까지 서비스의 실행이 지연된다.


: 쉘의 출력과 상태 결과가 섞이지 않는다. (아직 무슨 말인지 모르겠다..)

+ consequent unit이 무엇인지 더 알아보기


- ExecStart

: (유닛) 실행 명령을 지정한다.

: Type = oneshot의 경우, 여러개의 사용자 정의 명령을 지정할 수 있다. (순차적으로 실행)


* ExecStartPre : ExecStart 명령 전에 실행되는 사용자 정의 명령

* ExecStartPost : ExecStart 명령 후에 실행되는 사용자 정의 명령


- ExecStop

: 중지 명령을 지정한다.


- ExecReload

: reload을 수행할 명령을 지정한다.


- Restart 

: 프로세스가 종료된 후에 서비스를 재시작한다.


* systemctl 명령에 의해 종료된 경우를 제외하고


- RemainAfterExit ( 기본값 = False )

: True의 경우, 모든 프로세스가 종료되도, 서비스는 계속 실행중이라고 여겨진다.

: Type = oneshot인 경우, 특히 유용하다.




3.3 [Install]


- Alias

 : 해당 유닛의 추가적인 이름(별칭)을 지정한다.

대부분의 systemctl 명령은 이 별칭을 사용할 수 있다.

(systemctl enable을 제외하고)


- RequireBy

: 해당 유닛에 대해 의존성을 가진 유닛들을 지정한다.

: 항목에 있는 유닛들은 "Require= " 옵션을 가진다.


- WantedBy

: 해당 유닛에 대해 약한 의존성을 가진 유닛들을 지정한다.

: 항목에 있는 유닛들은 "Wants= " 옵션을 가진다.


- Also

: 같이 등록하거나 해제할 유닛들을 지정한다.



4. unit 파일 만들기

case A 사용자 정의 데몬 만들기

case B 이미 존재하는 서비스의 또 다른 instance 만들기

case C 이미 존재하는 서비스 수정


case A 사용자 정의 데몬 만들기

1. 서비스 실행파일을 준비한다. 

: 사용자가 만든 스크립트 or 소프트웨어 제공자가 제공한 실행파일

1.1 필요한 경우, 주 프로세스에 대한 일정한 pid를 가지고 있는 pid 파일을 준비한다.

1.2 또한, 쉘 변수를 저장하기 위한 환경파일(environment file)을 포함시킬 수 있다.

* 스크립트가 실행가능하도록 한다. > chmod a+x


2. 유닛 파일을 만든다.

: /etc/systemd/system/ 디렉터리 안에 

(올바른 파일 허가권을 갖도록 한다.)

* root 계정으로 파일을 만든다.


[root@localhost] # vim /etc/systemd/system/(name).service

[root@localhost] # chmod 664 /etc/system/system/(name).service


3. 서비스 구성 옵션을 추가한다. [unit], [service], [install]

: 3번 항목 참고


4. 새로운 서비스를 등록한다.


[root@localhost] # systemctl daemon-reload

[root@localhost] # systemctl start (name).service


* 새로운 유닛 파일을 만들거나 기존의 파일을 수정한 후에는 항상 systemctl daemon-reload 명령을 실행해야한다.

> systemctl start or enable 명령어가 systemd의 상태와 실제 서비스 유닛 파일 사이의 불일치로 실패할 수 있다.




[출처] :

- 시스템 유닛 파일

'study > centos 7 server & network' 카테고리의 다른 글

[centos] 쿼터  (0) 2019.03.31
[centos] 하드디스크  (0) 2019.03.26
[centos] 프로세스  (0) 2019.03.24
[centos] 파이프, 필터, 리다이렉션  (0) 2019.03.24
[centos] 네트워크 관련 명령어, selinux  (0) 2019.03.24