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 참고