본문 바로가기
Linux/Linux Shell Command

systemctl 명령어

by 드로니뚜벅이 2023. 4. 25.

 

systemd 구조 (출처: Wikipedia)

리눅스 부팅 시 시스템을 초기화하거나 서비스들을 실행하기 위한 환경을 제공하는 등 서비스들을 관리하는 프로세스가 필요합니다. 이런 역할을 systemd이 맡습니다.

 

이전 리눅스 버전에서는 init 프로세스(PID1)가 담당했었는데 최신 버전에서는 systemd이 담당하고 있습니다. systemdinit 프로세스의 한계를 극복하고 보다 더 많은 기능을 제공하면서도 병렬 실행을 통해 부팅 속도를 향상시켰습니다. 즉, systemd는 리눅스 시스템이 부팅할 때 실행되는 프로세스를 제어하기 위한 표준 프로세스입니다.

 

프로세스명에 'd'를 붙인 프로세스를 보통 데몬이라고 합니다. 다시 설명하면 데몬은 사용자가 직접적으로 제어하지 않고 백그라운드에서 여러 작업을 하는 프로그램입니다. 이러한 데몬들을 service 파일로 설정하여 실행하고 있으면 systemd 프로세스가 관리하고 있습니다.

 

이전에는 service 명령어를 사용하여 /etc/init.d 디렉토리에 있는 링크 파일들 중에 시작이나 종료 및 재시작을 선택하여 시스템 서비스를 조작할 수 있었지만 최신 버전에서는 systemctl을 통해 조작할 수 있습니다.

 

한마디로 systemctl 명령어는 시스템에서 백그라운드로 실행되는 데몬(서비스, service)을 관리하는 프로그램입니다.

 

Service

리눅스가 실행될 때 생성되고 종료될 때까지 실행되는 프로세스와 설정 파일을 말합니다.

systemd에 의해 관리되고 있는 서비스는 /etc/systemd/system 경로에서 확인할 수 있습니다.

 

서비스 파일은 [Unit], [Service], [Install] 등 세 개의 섹션으로 구성되어 있습니다.

[Unit]

항목 설명
Description Unit에 대한 설명을 기술합니다.
Requires 상위 의존성을 구성합니다.
이 목록에 명시된 유닛이 정상적으로 동작할 경우에만 이 유닛을 시작합니다.
RequiresOverridable 상위 의존성 유닛 구동에 실패하더라도 이를 무시하고 유닛을 시작합니다.
Requisite 상위 의존성 유닛이 시작되지 않으면 바로 실패를 반환합니다.
Wants Requires의 완화된 버전으로 목록에 포함된 유닛이 시작되지 않아도 시작됩니다.
Conflicts 배타적 관계를 설정합니다.
아래 "After="와 "Before=" 옵션과는 독립적으로 작동합니다.
Before 유닛 시작 전 관계를 설정합니다.
Requires 설정과는 독립적입니다.
이 옵션에 나열된 유닛이 시작되기 전에 이 유닛이 시작됩니다.
After 유닛 시작 후 관계를 설정합니다.
Requires 설정과는 독립적입니다.
이 옵션에 나열된 유닛이 시작하고 나서 이 유닛이 시작됩니다.
OnFailure 해당 유닛이 실패상태가 되면 수행할 유닛 목록을 지정합니다.

 

[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"
혹은,
ExecStart="command1; command2; command3"
ExecStop * 중지 명령을 정의합니다.
* 사용법은 ExecStart와 같습니다.
* 중지 방식은 KillMode옵션에서 설정합니다.
KillMode 중지 방법에 대해서 설정하는 옵션입니다.

control-group (default)
 - 해당 유닛의 그룹까지 모두 중지시킵니다.
process
 - 해당 유닛만 중지 시킵니다.
none
 - 아무 액션을 취하지 않습니다.
RestartSec * 재시작 명령을 수행할 때, 중지 이후 다시 시작하는데 대기하는 시간을 설정합니다.
* 기본값은 100ms
* 각각 "min", "s", "ms"단위로 설정됩니다.
* Restart 옵션이 있는 경우에만 적용됩니다.
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
 - 종료 상태 등과 무관하게 무조건 재시작합니다.
 - 사용자가 중지해도 시스템이 다시 띄우게 됩니다. 
WorkingDirectory 유닛의 작업 디렉토리를 지정합니다.
별도의 지정이 없으면 root("/") 디렉토리를 사용합니다.

 

[Install]

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

 

명령어 형식

systemctl [OPTION...] COMMAND ...

COMMAND DESCRIPTION
list-units 시스템 내부에서 실행되는 기본 유닛들을 볼 수 있습니다.
$ systemctl -all list-units <- 모든 유닛 확인
list-unit-files 부팅할 때 로드되지 않은 서비스 확인이 가능합니다.
- enable: 부팅 시 로드
- disable: 부팅 시 로드되지 않음
status UNIT 유닛명의 현재 상태를 확인합니다. (active or inactive)
stop UNIT... 하나 이상의 유닛들을 비활성화 상태로 전환합니다. (active -> inactive)
start UNIT... 하나 이상의 유닛들을 활성화 상태로 전환합니다. (inactive -> active)
restart UNIT... 하나 이상의 유닛들을 시작 혹은 재시작 합니다.
reload UNIT 하나 이상의 유닛들을 서비스를 중지하지 않고 설정 값을 반영합니다.
disable UNIT... 하나 이상의 유닛 파일들을 부팅 시 로드가 되지 않게 설정합니다. (부팅 시 서비스 자동 시작 비활성화)
enable UNIT... 하나 이상의 유닛 파일들을 부팅 시 로드하도록 설정합니다. (부팅 시 서비스 자동 시작 활성화)
kill UNIT... 하나 이상의 유닛들과 관련된 프로세스까지 모두 종료시킵니다.

 

명령어 실행 예

$ systemctl list-units
$ systemctl list-unit-files
$ systemctl status sshd
$ systemctl stop sshd
$ systemctl start sshd
$ systemctl restart sshd
$ systemctl disable sshd
$ systemctl list-uint-files
$ systemctl enable sshd
$ systemctl list-unit-files

 

 

'Linux > Linux Shell Command' 카테고리의 다른 글

7z 압축  (0) 2023.06.15
gz 압축 (gzip)  (0) 2023.06.15
scp (Secure Copy) 명령어 - 파일 전송  (0) 2023.04.18
chmod - 파일 접근 권한 변경 명령어  (0) 2023.03.07
mount - 파일시스템 마운트하기  (0) 2023.02.04