Contents
see Listsystemd 서비스 관리
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 프로세스가 메인 프로세스 |
| forking | fork하는 데몬 (PIDFile 필요) |
| oneshot | 실행 후 종료 (스크립트) |
| notify | sd_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 myappNode.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