systemd로 내 프로그램을 서비스로 등록하기
서비스 파일 작성, 자동 시작, 재시작 정책, 로그 확인까지 한 번에 정리했습니다.
터미널에서 띄운 프로그램은 접속이 끊기면 함께 멈추기 쉽습니다. systemd 서비스로 등록하면 부팅 시 자동 시작되고, 죽으면 다시 살리고, 로그도 한곳에 모입니다.
서비스 파일 만들기
/etc/systemd/system/myapp.service 파일을 작성합니다.
[Unit]
Description=My App
After=network-online.target
Wants=network-online.target
[Service]
User=myapp
WorkingDirectory=/opt/myapp
ExecStart=/usr/bin/java -jar /opt/myapp/app.jar
Restart=on-failure
RestartSec=5
EnvironmentFile=/etc/myapp/env
[Install]
WantedBy=multi-user.target등록과 시작
sudo systemctl daemon-reload
sudo systemctl enable --now myapp
systemctl status myapp서비스 파일을 고칠 때마다 daemon-reload가 필요합니다. enable은 부팅 시 자동 시작, --now는 지금 바로 시작까지 함께 합니다.
로그 보기
journalctl -u myapp -f
journalctl -u myapp --since "1 hour ago"안전하게 실행하기
- root가 아닌 전용 계정으로 실행합니다.
- 비밀값은 서비스 파일이 아니라 권한 600의 EnvironmentFile에 둡니다.
- NoNewPrivileges=true, ProtectSystem=strict 같은 격리 옵션을 검토합니다.
시작이 안 될 때
- status=203/EXEC: ExecStart의 경로나 실행 권한이 틀렸습니다.
- status=217/USER: User에 적은 계정이 없습니다.
- start-limit-hit: 짧은 시간에 너무 많이 재시작했습니다. 원인을 고친 뒤 systemctl reset-failed를 실행합니다.