세션 종료와 무관한 웹서비스 실행 구성
초록
Copilot 세션이 종료되어도 8765 포트의 Python 웹서비스가 계속 실행되도록 systemd 사용자 서비스와 linger를 구성한 방법을 정리한다.
세션 종료와 무관한 웹서비스 실행 구성
초록
Copilot 세션에서 실행한 웹서비스는 세션 종료와 함께 중단될 수 있다. 이 문제를 해결하기 위해 Python 정적 웹서버를 systemd 사용자 서비스로 등록하고, 사용자 manager가 로그아웃 후에도 유지되도록 linger를 활성화했다.
대상 서비스
- 서비스:
hyperbook-site - 포트:
8765 - 서버: Python
http.server.ThreadingHTTPServer - 서버 파일:
/home/ec2-user/.copilot/session-state/09522f4d-58da-4212-81d2-8cc75ae352a9/files/hyperbook-site/server.py
서버는 파일 위치를 기준으로 작업 디렉터리를 설정하고 0.0.0.0:8765에서 정적 파일을 제공한다.
systemd 사용자 서비스
/home/ec2-user/.config/systemd/user/hyperbook-site.service를 만들었다.
[Unit]
Description=Hyperbook static web service
After=network.target
[Service]
Type=simple
WorkingDirectory=/home/ec2-user/.copilot/session-state/09522f4d-58da-4212-81d2-8cc75ae352a9/files/hyperbook-site
ExecStart=/usr/bin/python3 /home/ec2-user/.copilot/session-state/09522f4d-58da-4212-81d2-8cc75ae352a9/files/hyperbook-site/server.py
Restart=on-failure
RestartSec=2
[Install]
WantedBy=default.target
Restart=on-failure와 RestartSec=2는 프로세스가 예기치 않게 종료될 때 자동으로 재시작하게 한다.
활성화 절차
mkdir -p ~/.config/systemd/user
systemctl --user daemon-reload
systemctl --user enable --now hyperbook-site.service
loginctl enable-linger ec2-user
이미 같은 포트를 사용하던 기존 프로세스는 먼저 종료한 뒤 systemd가 새 프로세스를 관리하도록 전환했다.
확인 방법
서비스 상태는 다음 명령으로 확인할 수 있다.
systemctl --user status hyperbook-site.service
loginctl show-user ec2-user -p Linger
curl -fsS -o /dev/null -w 'HTTP %{http_code}\n' http://127.0.0.1:8765/
구성 후 Linger=yes와 HTTP 200 응답을 확인했다. 프로세스의 부모가 systemd(PID 1)이고 systemd user cgroup에서 실행되는 것도 확인했다.
결론
세션에 종속된 실행 방식 대신 systemd 사용자 서비스에 실행·재시작 정책을 맡기고, linger로 사용자 서비스를 부팅 및 로그아웃 이후에도 유지하면 세션이 새로 시작되거나 기존 세션이 닫혀도 웹서비스를 지속할 수 있다. 단, 서비스가 참조하는 세션 상태 디렉터리가 삭제되면 실행 파일 경로를 영구 디렉터리로 옮기고 unit 파일의 경로도 함께 갱신해야 한다.
