EQVPS

앱을 계속 실행되게 하는 systemd 서비스 만드는 방법

어떤 스크립트나 앱이든 부팅 시 시작되고, 충돌하면 재시작되며, journalctl에 로그를 남기는 관리형 서비스로 바꾸세요. 유닛 파일을 작성하고 활성화한 뒤 상태를 확인하세요 — 리눅스에서 무언가를 24/7 돌리는 표준 방법입니다.

앱을 &nohup으로 돌리는 것은 서버가 재부팅되거나, 프로세스가 충돌하거나, 로그를 찾고 싶어지기 전까지는 괜찮습니다 — 그때 무너집니다. systemd가 표준 답입니다. 부팅 시 앱을 시작하고, 죽으면 재시작하며, 로그를 캡처합니다. 스크립트나 바이너리를 관리형 서비스로 바꾸는 것은 작은 파일 하나입니다.

1. 유닛 파일을 작성하세요

/etc/systemd/system/myapp.service를 만듭니다:

[Unit]
Description=My application
After=network.target

[Service]
User=myapp
WorkingDirectory=/opt/myapp
ExecStart=/usr/bin/python3 /opt/myapp/run.py
Restart=always
RestartSec=5

[Install]
WantedBy=multi-user.target

ExecStart, WorkingDirectory, User를 앱에 맞게 조정하세요. Restart=always가 바로 그것을 살아 있게 하는 것입니다.

2. 전용 사용자를 만드세요 (권장)

sudo useradd --system --no-create-home --shell /usr/sbin/nologin myapp
sudo chown -R myapp:myapp /opt/myapp

비-root 사용자로 실행하면 앱이 언젠가 탈취되더라도 피해를 제한합니다.

3. 활성화하고 시작하세요

sudo systemctl daemon-reload
sudo systemctl enable --now myapp

enable은 부팅 시 시작하게 하고, --now는 즉시 시작합니다.

4. 상태와 로그를 확인하세요

sudo systemctl status myapp
journalctl -u myapp -f       # 실시간 로그 따라가기

일상 명령

sudo systemctl restart myapp   # 변경 후 재시작
sudo systemctl stop myapp      # 멈추기
sudo systemctl disable myapp   # 부팅 시 시작 끄기

솔직한 주의점

다음 단계

systemd 서비스는 무엇이든 24/7 돌아가게 하는 방법입니다 — 예를 들어 24시간 돌아가는 AI 에이전트자체 호스팅 RustDesk 서버 뒤의 릴레이입니다. 앱이 대신 컨테이너화되어 있다면 Docker의 --restart unless-stopped가 같은 역할을 합니다 — Docker 설치하는 방법을 참조하세요.

자주 묻는 질문

앱을 그냥 백그라운드로 돌리지 않고 왜 systemd를 쓰나요?

백그라운드 프로세스(& 또는 nohup)는 재부팅하면 죽고, 충돌해도 돌아오지 않으며, 로그를 흩뿌립니다. systemd 서비스는 부팅 시 자동으로 시작하고, 실패하면 재시작하며, 출력을 journalctl로 보냅니다. 리눅스에서 오래 사는 무언가를 돌리는 표준적이고 믿을 만한 방법입니다.

유닛 파일은 어디에 두나요?

여러분의 서비스는 /etc/systemd/system/에 서비스마다 하나씩, something.service 같은 이름으로 둡니다. 만들거나 편집한 뒤 'systemctl daemon-reload'를 실행해 systemd가 변경을 인식하게 한 다음, 활성화하고 시작하세요.

'Restart=always'는 무엇을 하고, 단점이 있나요?

systemd에게 서비스가 어떤 이유로든 종료될 때마다 재시작하라고 지시합니다 — 무언가를 계속 돌리는 핵심입니다. 유일한 함정은 충돌 루프입니다. 앱이 시작 즉시 실패하면 systemd가 계속 재시작합니다. 'RestartSec=5'를 더해 시도 간격을 벌리고, 로그를 확인해 근본 오류를 고치세요.

서비스 로그는 어떻게 보나요?

실시간 출력을 따라가려면 'journalctl -u yourservice -f', 이력을 읽으려면 -f 없이 사용하세요. systemd가 stdout과 stderr를 자동으로 캡처하므로 직접 로그 파일을 연결할 필요가 없습니다.

서비스를 root로 실행해야 하나요?

되도록 아닙니다. 전용 비-root 사용자를 만들고 유닛에 'User='를 설정하세요. 그러면 앱이 탈취돼도 머신 전체를 넘겨주지 않습니다. 서비스가 정말로 필요할 때만 root로 실행하세요.

댓글

아직 댓글이 없습니다. 첫 번째가 되세요.

댓글 남기기

댓글은 표시되기 전에 검토됩니다.