현대 리눅스에서 systemctl start nginx 같은 명령을 쓸 때, 뒤에서 일하는 것이 systemd입니다. PID 1으로 실행되며 시스템의 모든 서비스를 관리합니다.


systemd란

리눅스의 초기화 시스템(init system)이자 서비스 관리자 입니다. 커널이 부팅 후 가장 먼저 실행하는 프로세스(PID 1)입니다.

systemd 서비스 관리 구조

PLAINTEXT
커널 부팅 → PID 1: systemd 실행 → 나머지 모든 서비스 시작

SysVinit vs systemd

항목SysVinitsystemd
서비스 시작순차적 (하나씩)병렬 (동시에)
부팅 속도느림빠름
설정 파일셸 스크립트Unit 파일 (선언적)
의존성 관리실행 순서로 관리명시적 의존성
프로세스 추적PID 파일cgroup
로그syslog (/var/log)journald (바이너리)

Unit 파일

systemd는 Unit 이라는 단위로 자원을 관리합니다.

Unit 유형확장자용도
Service.service데몬/서비스
Socket.socket소켓 활성화
Timer.timer주기적 작업 (cron 대체)
Mount.mount파일 시스템 마운트
Target.targetUnit 그룹

Service Unit 예시

INI
# /etc/systemd/system/myapp.service
[Unit]
Description=My Application
After=network.target           # 네트워크 시작 후에 실행
Requires=postgresql.service    # PostgreSQL이 필수

[Service]
Type=simple
User=appuser
WorkingDirectory=/opt/myapp
ExecStart=/opt/myapp/bin/start.sh
ExecStop=/opt/myapp/bin/stop.sh
Restart=on-failure             # 실패 시 자동 재시작
RestartSec=5                   # 재시작 대기 시간

[Install]
WantedBy=multi-user.target     # 멀티유저 모드에서 활성화

주요 명령어

BASH
# 서비스 관리
systemctl start nginx          # 시작
systemctl stop nginx           # 중지
systemctl restart nginx        # 재시작
systemctl reload nginx         # 설정만 리로드
systemctl status nginx         # 상태 확인

# 부팅 시 자동 시작
systemctl enable nginx         # 활성화
systemctl disable nginx        # 비활성화
systemctl is-enabled nginx     # 활성화 여부

# 서비스 목록
systemctl list-units --type=service          # 활성 서비스
systemctl list-units --type=service --all    # 전체 서비스

# Unit 파일 수정 후
systemctl daemon-reload        # systemd에 변경 알림

# 로그 확인 (journald)
journalctl -u nginx            # nginx 로그
journalctl -u nginx --since today    # 오늘 로그만
journalctl -u nginx -f         # 실시간 로그 (tail -f)
journalctl -b                  # 현재 부팅 이후 전체 로그

Target (런레벨 대체)

BASH
# 현재 타겟 확인
systemctl get-default

# 기본 타겟 변경
systemctl set-default multi-user.target    # 텍스트 모드
systemctl set-default graphical.target     # GUI 모드

# SysVinit 런레벨과 대응
# 런레벨 3 = multi-user.target (텍스트)
# 런레벨 5 = graphical.target (GUI)

Timer (cron 대체)

INI
# /etc/systemd/system/backup.timer
[Unit]
Description=Daily Backup Timer

[Timer]
OnCalendar=daily               # 매일 실행
Persistent=true                # 놓친 실행 보충

[Install]
WantedBy=timers.target
BASH
systemctl enable --now backup.timer
systemctl list-timers          # 타이머 목록

핵심 포인트

  • systemd가 PID 1인 이유: 커널이 부팅 후 첫 번째 프로세스로 실행, 모든 서비스의 부모
  • 병렬 시작이 빠른 이유: 의존성 그래프를 분석하여 독립적인 서비스를 동시에 시작
  • cgroup으로 프로세스 추적: fork된 자식 프로세스도 같은 cgroup에 속해서 추적 가능

정리

systemd는 현대 리눅스의 핵심 서비스 관리자입니다. systemctl 명령어와 Unit 파일 작성법을 알면 서버 관리의 기본을 갖춘 셈입니다. 실제로는 SysVinit과의 차이, 병렬 부팅, cgroup 기반 프로세스 추적을 설명할 수 있으면 좋습니다.

댓글 로딩 중...