본문 바로가기

Linux

service, systemctl 란?

간단 설명

 service와 systemctl을 이해하기 위해서, 데몬이라는 개념에 대해서 알고 있어야 한다. 데몬이란 사용자가 직접적으로 제어하지 않고, 백그라운드에서 여러 작업을 하는 프로그램을 말한다. 일반적으로 데몬 프로세스는 systemd, syslogd 처럼 프로세스 이름 마지막에 d가 붙는다.

 

 Linux는 OS가 부팅되면서 여러가지 데몬들이 실행된다. 부팅과 함께 실행되는 데몬은 네트워크 요청을 처리하는 데몬, 하드웨어 동작을 처리하는 데몬 등, 시스템단에서 필요한 작업을 백그라운드로 처리하는 데몬들이다. 이러한 데몬들을 Linux에서는 service 파일로 설정하여 실행하고 있으며, systemd라는 프로세스가 관리하고 있다.

 

systemd는 1번 PID를 갖는 프로세스로 프로세스 트리에서 가장 상위의 프로세스이며 모든 프로세스의 직간접 부모인 데몬이다. 즉 OS부팅시 systemd 프로세스가 가장 먼저 실행되어서, OS에 필요한 여러 데몬들을 init해주는 역할을 하고 있다.

 

따라서 Service는 시스템 데몬 및 사용자 정의 데몬을 의미하며, systemctl은 service(데몬)들을 관리하는 명령어 이다.

 

Service

Linux OS가 부팅되었을 때, 생성되면서 종료될 때까지 실행되는 Process및 설정 파일을 service라고 한다.

 

Service 생성

Service는 /etc/systemd/system 경로에 존재한다. 이 경로에 있는 service 들은 systemd에 의해 관리되고 있는 service라는 뜻이다.

 

vim /etc/systemd/system/test.service

Service 파일 속성

Service파일은 [Unit], [Service], [Install]의 섹션으로 구성되어 있다.

전부 다 알아보긴 힘드니까 필요한거 몇 개만 알아보고, 조금씩 채워나가 보자!

 

[Unit]

Unit
Description 해당 Service 유닛에 대한 설명
Requires - 상위 의존성을 구성한다.
- 이 목록에 명시된 유닛이 정상적으로 동작할 경우에만 이 유닛을 시작한다.
RequiresOverridable - Requires와 유사하지만, 상위 의존성 유닛 구동에 실패하더라도 이를 무시하고 유닛을 시작한다.
Requisite - Requires와 유사함
- 상위 의존성 유닛이 시작되지 않으면, 바로 실패를 반환
RequisiteOverridable  
Wants - Requires의 완화된 버전
- 목록에 포함엔 유닛이 시작되지 않아도, 시작된다.
BindsTo  
PartOf  
Conflicts - 배타적 관계를 설정한다.
- 만일 '유닛1' 의 "Conflicts=" 설정이 '유닛2' 로 되어 있다면 '유닛1'이 시작된 경우 '유닛2'가 중지되고, '유닛1'이 중지된 경우 '유닛2'가 시작한다. 이 옵션은 "After=" 와 "Before=" 옵션과는 독립적으로 작동한다.
Before - 유닛 시작 전 관계를 설정한다.
- Requires 설정과는 독립적이다.
- 이 옵션에 나열된 유닛이 시작되기 전에 이 유닛이 시작된다.
After - 유닛 시작 후 관계를 설정한다.
- Requires 설정과는 독립적이다.
- 이 옵션에 나열된 유닛이 시작하고나서 이 유닛이 시작된다.
OnFailure - 해당 유닛이 실패상태가 되면 수행할 유닛 목록을 지정한다.
PropagatesReloadTo  
ReloadPropagatedFrom  
RequiresMountsFor  
OnFailuresolate=[yes|no]  
IgnoreOnIsolate=[yes|no]  

 

[Service]

Service
Type 유닛의 타입을 선언한다.

simple (default)
- 유닛이 시작된 경우 systemd는 즉시 유닛의 시작이 완료되었다고 판단한다.
- 다른 유닛과 통신하기 위해 소켓을 사용하는 경우 이 타입을 사용할 수 없다.

forking
- 자식 프로세스 생성이 완료되어야 systemd가 유닛의 시작이 완료되었다고 판단한다.
- 부모 프로세스를 추적할 수 있도록 PIDFile 옵션을 설정해주어야 한다.

oneshot
- simple과 유사하지만 단일 작업을 수행하는데 적합한 타입이다.
- 실행 후 해당 실행이 종료되더라도 RemainAfterExiet=yes 설정을 통해 유닛을 활성화 상태로 간주할 수 있다.

notify
- simple과 동일하지만, 유닛이 시작되면 systemd에 시그널을 보낸다.
- 시그널의 내용은 libsystemd-daemon.so에 선언되어있다.

dbus
- D-Bus에 지정된 BusName이 준비될 때까지 대기한다.
- D-Bus가 준비된 후에 유닛이 시작되었다고 간주한다.
RemainAfterExit [yes|no]  
GuessMainPID [yes|no]  
PIDFile  
BusName  
Environment - 유닛에서 사용할 환경변수를 선언한다.
- 반드시 Exec 옵션보다 상단에 위치해야 한다.
EnvironmentFile  
ExecStart - 시작 명령을 정의한다.
- 실행 멸령어는 반드시 절대 경로 또는 변수로 지정
- 다중 명령어를 지원한다
ExecStart="command1"
ExecStart="command2"
ExecStart="command3" or
ExecStart="command1; command2; command3"
ExecStop - 중지 명령을 정의한다.
- 사용법은 ExecStart와 같다.
- 중지 방식은 KillMode옵션에서 설정한다.
KillMode - 중지 방법에 대해서 설정하는 옵션

control-group (default)
  - 해당 유닛의 그룹까지 모두 중지시킨다.
process
  - 해당 유닛만 중지 시킨다.
none
  - 아무 액션을 취하지 않는다.
ExexReload  
ExecStartPre  
ExecStartPost  
ExecStopPre  
ExecStopPost  
RestartSec - 재시작 명령을 수행할때, 중지 이후 다시 시작하는데 대기하는 시간을 설정한다.
- 기본값은 100ms
- 각각 "min", "s", "ms"단위로 설정된다.
- Restart 옵션이 있는 경우에만 적용된다.
TimeoutStartSec  
TimeoutStopSec  
TimeoutSec  
WatchdogSec  
Restart [no | on-success | on-failure | on-watchdog | on-abort | always ]

no(기본값)
  - 유닛을 다시 시작하지 않는다.

on-success
  - 유닛이 정상적으로 종료되었을 때만 재시작한다.
  - 종료시에 "0" 값을 리턴하여 종료되었거나
  - SIGHUP, SIGINT, SIGTERM, SIGPIPE 등과 같은 시그널
  - "SuccessExitStatus=" 설정에서 지정된 리턴 코드 목록에 따른 시그널에 대해서 모두 성공으로 인식해 재시작을 하게 된다.

on-failure
  - 유닛이 비정상적으로 종료되었을때 재시작한다.
  - 리턴값이 "0" 이 아닌 경우,
  - core dump 와 같이 비정상적인 시그널을 받고 종료된 경우,
  - 타임 아웃값내 응답이 없는 경우 등일때 재시작 하게 된다.
on-watchdog
  - "WatchdogSec=" 에 설정된 시간내 응답이 없는 경우에만 재시작 한다.

on-abort
  - 지정되지 않은 리턴값을 받은 경우 재시작을 한다.

always
 - 종료 상태 등과 무관하게 무조건 재시작한다.
 - 사용자가 중지해도 시스템이 다시 띄우게 된다.

SuccessExitStatus  
RestartPreventExitStatus  
PermissionsStartOnly  
User  
Group  
RootDirectoryStartOnly  
RootDirectory  
WorkingDirectory - 유닛의 작업 디렉토리를 지정한다.
- 별도의 지정이 없으면 root("/") 디렉토리를 사용한다.
NonBlocking  
NotifyAccess  
Sockets  
StartLiitInterval  
StartLimitBurst  
StartLimitAction  
Nice  
OOMScoreAdjust  
UMast  
SyslogFacility  
SyslogLevel  
TCPWrapName  
PAMName  

 

[Install]

Install
Alias - 유닛의 별칭을 지정한다
- systemctl enable 명령어에 별칭을 사용할 수 있다.
- Alias는 유닛 파일의 확장자를 가지고 있어야 한다. (.service, .socket, .mount, .swap 등)
WantedBy - systemctl enable 명령어로 유닛을 등록할 때 필요한 유닛을 지정한다.
- Unit 섹션의 Wants와 관련이 있다.
RequiredBy - systemctl enable 명령어로 유닛을 등록할 때 필요한 유닛을 지정한다.
- Unit 섹션의 Requires와 관련이 있다.
Also systemctl enable/disable 명령어로 유닛을 등록하거나 해제할 때 다른 유닛도 함께 등록/해제 할 수 있게 만드는 설정이다.

 


SystemCtl

서비스 유닛 (.service)을 관리 및 제어하는 명령어 이다. CentOS7 버전 부터 사용하는 명령어이며, 이전버전에서는 Service 명령어로 사용이 가능하다.

명령 service systemctl
시작 service 서비스 이름 start systemctl start 서비스이름.service
(.service 생략 가능)
종료 service 서비스 이름 stop systemctl stop 서비스 이름
재시작 service 서비스 이름 restart systemctl restart 서비스 이름
재시작 (시작된 서비스) service 서비스 이름 condrestart systemctl try-restart 서비스 이름
설정 Reload service 서비스 이름 reload systemctl reload 서비스 이름
상태 확인 service 서비스 이름 status systemctl status 서비스 이름
systemctl is-active 서비스 이름
자동시작 활성화 (부팅시) x (chkconfig 명령어 사용해야 함) systemctl enable 서비스 이름
자동시작 비활성화 (부팅시) x systemctl disable 서비스 이름

'Linux' 카테고리의 다른 글

systemd란  (0) 2020.12.21
심볼릭 링크 (symbolic link)  (0) 2020.12.20