날씨 정보를 불러오는 중...

systemd 유닛 생성기

서비스 정보를 입력하면 .service 유닛 파일과 등록 명령어를 만들어 줍니다.

파일명은 <이름>.service가 됩니다.
반드시 절대경로로 씁니다. systemd는 PATH를 로그인 셸처럼 잡아주지 않습니다.
/etc/systemd/system/myapp.service
등록 및 시작
Type은 어떤 걸 골라야 하나요?

대부분의 경우 simple이 맞습니다. 명령을 실행하면 그 프로세스가 포그라운드에서 계속 살아있는 형태(파이썬 스크립트, node 서버 등)입니다.

주의할 것은 forking입니다. 예전 데몬처럼 스스로 백그라운드로 빠지는(fork 후 부모가 종료되는) 프로그램에만 씁니다. simple인데 프로그램이 백그라운드로 빠져버리면 systemd는 "서비스가 끝났다"고 판단해 계속 재시작하려 합니다. 반대로 forking으로 지정했는데 프로그램이 포그라운드에 남으면 systemd가 기동 완료를 영원히 기다립니다.

oneshot은 백업 스크립트처럼 한 번 실행하고 끝나는 작업용입니다. 이 경우 RemainAfterExit=yes를 같이 쓰면 실행이 끝나도 "활성" 상태로 남아 부팅 시 1회 실행 용도로 쓰기 좋습니다.

재시작 정책
  • always — 어떤 이유로 종료되든 항상 재시작. 상시 떠 있어야 하는 서버에 씁니다.
  • on-failure — 비정상 종료(0이 아닌 exit code)일 때만 재시작. 정상 종료는 그대로 둡니다.
  • no — 재시작하지 않음. 기본값입니다.

RestartSec=5를 같이 넣은 이유는, 프로그램이 즉시 죽는 상황에서 systemd가 초당 수십 번 재시작을 시도하다 결국 포기(rate limit)하는 것을 막기 위해서입니다.

WantedBy=multi-user.target의 의미

systemctl enable을 했을 때 언제 자동 시작할지를 정합니다. multi-user.target은 "일반적인 다중 사용자 부팅이 끝난 시점"으로, 서버용 서비스는 거의 이 값을 씁니다. GUI가 필요한 서비스라면 graphical.target을 씁니다.

문제가 생겼을 때
  • systemctl status 서비스명 — 현재 상태와 최근 로그 몇 줄
  • journalctl -u 서비스명 -f — 로그 실시간 확인
  • journalctl -u 서비스명 --since "10 min ago" — 최근 10분 로그
  • systemd-analyze verify /etc/systemd/system/이름.service — 유닛 파일 문법 검사

유닛 파일을 수정한 뒤에는 반드시 systemctl daemon-reload를 실행해야 변경이 반영됩니다. 이걸 빠뜨려서 "고쳤는데 그대로인" 상황이 자주 생깁니다.

← 도구 전체 보기