본문 바로가기

기타/Linux

systemd service file

systemd unit 중 service 파일의 구성

(unit 에는 service 외에도 socket, 등 다양하게 있다.)

https://www.freedesktop.org/software/systemd/man/systemd.unit.html

https://www.freedesktop.org/software/systemd/man/systemd.service.html

Unit 파일 구성

service 파일의 구성은 다음과 같이 세개의 section 으로 이뤄져 있다.

[Unit]

unit 유형에 상관없는 unit의 기본 정보가 포함된다.

[Service]

서비스관련 정보들

[Install]

unit install 관련 정보들. 런타임 동안은 systemd 가 해당섹션은 보지 않음.
systemctl 의 enable, disable 명령에 의해 사용됨

Unit Section

다음과 같은 정보들이 포함될 수 있다. (적힌 옵션 외에도 더 많은 옵션이 존재함.)

Description=

사람이 읽을 수 있는 unit이름. systemd 에서 unit의 레이블로 사용이 되어서 장치를 식별할 수 있는 이름이여야 함.

Documentation=

unit 또는 구성에 대한 문서를 참조하는 url 목록

Wants=

다른 unit 에 대한 dependency 요구 사항.

나열된 unit이 가동이 실패해도 전체 결과에 영향을 주진 않는다. (해당 unit도 가동됨)

다른 서비스들의 시작,중지 순서에 영향을 주지 않는다. (순서에 영향을 주고 싶다면 After, Before 옵션사용)

Requires=

Wants 보다 더 강력한 dependency 요구 사항.

목록의 unit 이 정상적으로 시작되어야 unit이 시작된다.

BindsTo=

Requires= 와 비슷하나 더 강력함.

bind 된 unit 이 inactive 될 경우, 해당 unit 은 정지된다.

Conflicts=

Conflicts 에 설정된 unit들이 시작되면, 해당 unit 이 중지된다. 그 반대도 마찬가지

Before=, After=

순서 dependency 를 걸어줌.

Before= 에 적힌 unit들은 해당 unit 이 시작되고 난 후, 시작될수 있는 unit들

(해당 unit이 해당 리스트들 시작 전에 시작되는 것.)

ex)

foo.service unit이 Before=bar.service를 포함하고 있고, 두 unit 이 시작되려고 하는 상태

=> bar.service 는 foo.service 가 starting up 이 끝날때까지 start-up이 지연됨.

=> 즉 foo.service 시작후에 bar.service 가 시작됨

Afetr= 는 Before=의 반대.

리스트에 적힌 unit들이 모두 실행되고 난 후에 해당 unit 이 실행될수 있음.

shutdown 시에는 반대로 적용된다.

(Before 의 경우 list 에 적힌 unit 들이 모두 종료되고 난 후에, 해당 unit 이 종료)

Service Section

Type=

서비스 unit 의 타입

simple, exec, forking, oneshot,dbus 등

simple : main service process가 시작된 후, 서비스 매니저는 바로 해당 unit이 시작됐다고 판단한다.

해당 모드에서는, 다른 프로세스한테 기능을 제공하는 프로세스라면

service 가 시작되기 전에 통신할수 있는 채널이 설치되야 한다.

(ex. 소켓은 socket activation 을 통해 systemd 에 의해 설정되야 한다.)

ExecStart=

구동 명령어(또는 스크립트) 선언. 반드시 절대경로또는 변수로 시작해야함

ExecSTop =

서비스 중지하기 위해 실행할 명령어.

여기에 적힌 명령어가 실행 된 후에는 서비스가 중지되고, 해당 서비스에 대해 남아있는 모든

프로세스가 killMode= 설정에 따라 종료됨. 옵션을 지정하지 않으면, 서비스 중지를 요청함.

KillMode=

서비스 중지방법에 대해 선언. default 는 control-group

  • control-group : 해당 유닛의 그룹까지 모두 중지. 유닛과 그유닛에 종속성 가지는 묶음 모두)

    stop command 가 실행된 후에 kill 됨.

  • process : 해당 유닛의 메인 프로세스만

  • mixed : 메인 프로세스한테는 sigterm singal 보내고 , 그룹의 남아있는 프로세스들한테는 sigkill 보냄

여기서 그룹인란 유닛&유닛에 종속성 가지는 유닛의 묶음 모두 포함

Install section

Alias=

unit 등록할때 쓰는 이름. (systemctl enable, or disable 할때 쓰는 이름)

WantedBy=, RequiredBy=

리스트에 적힌 unit의 Wants=, Requires= 에 해당 unit이 추가되는 효과가 있다.

나열된 unit이 시작될 때, 해당 unit도 시작된다.

sysemctl enable 에 의해 설치될 때, 나열된 unit들의 .wants/ or .requires/
디렉토리 안해 symbolic link 가 생성된다.

여기에 multi-user.target 이런걸 적어주면 부팅시에 자동으로 켜지게 된다.

 --> 왜 그런지는 system runlevel 참고

'기타 > Linux' 카테고리의 다른 글

ldconfig  (0) 2020.07.25
runlevel  (0) 2020.07.25