systemd — 리눅스 초기화 시스템과 서비스 관리
현대 리눅스에서
systemctl start nginx같은 명령을 쓸 때, 뒤에서 일하는 것이 systemd입니다. PID 1으로 실행되며 시스템의 모든 서비스를 관리합니다.
systemd란
리눅스의 초기화 시스템(init system)이자 서비스 관리자 입니다. 커널이 부팅 후 가장 먼저 실행하는 프로세스(PID 1)입니다.
커널 부팅 → PID 1: systemd 실행 → 나머지 모든 서비스 시작
SysVinit vs systemd
| 항목 | SysVinit | systemd |
|---|---|---|
| 서비스 시작 | 순차적 (하나씩) | 병렬 (동시에) |
| 부팅 속도 | 느림 | 빠름 |
| 설정 파일 | 셸 스크립트 | Unit 파일 (선언적) |
| 의존성 관리 | 실행 순서로 관리 | 명시적 의존성 |
| 프로세스 추적 | PID 파일 | cgroup |
| 로그 | syslog (/var/log) | journald (바이너리) |
Unit 파일
systemd는 Unit 이라는 단위로 자원을 관리합니다.
| Unit 유형 | 확장자 | 용도 |
|---|---|---|
| Service | .service | 데몬/서비스 |
| Socket | .socket | 소켓 활성화 |
| Timer | .timer | 주기적 작업 (cron 대체) |
| Mount | .mount | 파일 시스템 마운트 |
| Target | .target | Unit 그룹 |
Service Unit 예시
# /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 # 멀티유저 모드에서 활성화
주요 명령어
# 서비스 관리
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 (런레벨 대체)
# 현재 타겟 확인
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 대체)
# /etc/systemd/system/backup.timer
[Unit]
Description=Daily Backup Timer
[Timer]
OnCalendar=daily # 매일 실행
Persistent=true # 놓친 실행 보충
[Install]
WantedBy=timers.target
systemctl enable --now backup.timer
systemctl list-timers # 타이머 목록
핵심 포인트
- systemd가 PID 1인 이유: 커널이 부팅 후 첫 번째 프로세스로 실행, 모든 서비스의 부모
- 병렬 시작이 빠른 이유: 의존성 그래프를 분석하여 독립적인 서비스를 동시에 시작
- cgroup으로 프로세스 추적: fork된 자식 프로세스도 같은 cgroup에 속해서 추적 가능
정리
systemd는 현대 리눅스의 핵심 서비스 관리자입니다. systemctl 명령어와 Unit 파일 작성법을 알면 서버 관리의 기본을 갖춘 셈입니다. 실제로는 SysVinit과의 차이, 병렬 부팅, cgroup 기반 프로세스 추적을 설명할 수 있으면 좋습니다.