systemd 서비스 관리



systemd는 현대 리눅스의 표준 init 시스템으로, 서비스 시작/중지, 부팅 시 자동 실행, 로그 관리 등을 담당합니다.



언제 사용하나요?



  • 서버 재부팅 후 서비스 자동 시작 설정

  • Java/Node.js 애플리케이션을 데몬으로 실행

  • 서비스 상태 모니터링 및 재시작 정책 설정

  • 서비스 로그 확인 및 관리



기본 명령어


# 서비스 시작
sudo systemctl start nginx

# 서비스 중지
sudo systemctl stop nginx

# 서비스 재시작
sudo systemctl restart nginx

# 설정 리로드 (중단 없이)
sudo systemctl reload nginx

# 서비스 상태 확인
sudo systemctl status nginx

# 부팅 시 자동 시작 활성화
sudo systemctl enable nginx

# 부팅 시 자동 시작 비활성화
sudo systemctl disable nginx

# 활성화 + 즉시 시작
sudo systemctl enable --now nginx


서비스 파일 위치


# 시스템 서비스
/usr/lib/systemd/system/

# 사용자 정의 서비스 (권장)
/etc/systemd/system/

# 사용자 서비스
~/.config/systemd/user/


커스텀 서비스 만들기


# /etc/systemd/system/myapp.service

[Unit]
Description=My Java Application
After=network.target mysql.service
Wants=mysql.service

[Service]
Type=simple
User=appuser
Group=appuser
WorkingDirectory=/opt/myapp
ExecStart=/usr/bin/java -jar /opt/myapp/app.jar
ExecStop=/bin/kill -TERM $MAINPID
Restart=on-failure
RestartSec=10
StandardOutput=journal
StandardError=journal

# 환경 변수
Environment=JAVA_HOME=/usr/lib/jvm/java-11
Environment=SPRING_PROFILES_ACTIVE=production
EnvironmentFile=/opt/myapp/.env

[Install]
WantedBy=multi-user.target


서비스 타입 설명








Type설명
simple기본값. ExecStart 프로세스가 메인 프로세스
forkingfork하는 데몬 (PIDFile 필요)
oneshot실행 후 종료 (스크립트)
notifysd_notify()로 준비 완료 알림


재시작 정책


Restart=no           # 재시작 안 함 (기본)
Restart=on-success # 정상 종료 시에만
Restart=on-failure # 비정상 종료 시에만 (권장)
Restart=on-abnormal # 시그널로 종료 시
Restart=always # 항상 재시작

RestartSec=10 # 재시작 대기 시간 (초)
StartLimitBurst=5 # 시작 시도 횟수 제한
StartLimitIntervalSec=60 # 제한 기간


서비스 등록 및 실행


# 서비스 파일 생성 후
sudo systemctl daemon-reload # 변경사항 적용

# 서비스 시작 및 활성화
sudo systemctl enable --now myapp

# 상태 확인
sudo systemctl status myapp


로그 확인


# 특정 서비스 로그
journalctl -u myapp

# 실시간 로그
journalctl -u myapp -f

# 최근 100줄
journalctl -u myapp -n 100

# 오늘 로그만
journalctl -u myapp --since today

# 에러만
journalctl -u myapp -p err


유용한 명령어


# 모든 서비스 목록
systemctl list-units --type=service

# 실패한 서비스
systemctl --failed

# 서비스 의존성 확인
systemctl list-dependencies nginx

# 서비스 파일 위치 확인
systemctl show -p FragmentPath nginx

# 서비스 파일 편집
sudo systemctl edit myapp --full

# 재시작 없이 환경 변수 리로드
sudo systemctl daemon-reload
sudo systemctl restart myapp


Node.js 서비스 예시


[Unit]
Description=Node.js App
After=network.target

[Service]
Type=simple
User=node
WorkingDirectory=/var/www/myapp
ExecStart=/usr/bin/node /var/www/myapp/server.js
Restart=on-failure
Environment=NODE_ENV=production
Environment=PORT=3000

[Install]
WantedBy=multi-user.target


문제 해결


# 서비스 상태 상세 확인
systemctl status myapp -l

# 부팅 로그 확인
journalctl -b

# 서비스 문법 검사
systemd-analyze verify /etc/systemd/system/myapp.service