Linux 시스템에서 .NET 애플리케이션 프로세스를 Systemd로 관리하기

.NET 애플리케이션을 Linux 시스템에서 백그라운드 서비스로 안정적으로 실행하고 관리하기 위해 Systemd를 활용하는 방법을 알아봅니다. Systemd는 현대 Linux 배포판에서 널리 사용되는 시스템 및 서비스 관리자로, 서비스의 자동 시작, 중지, 재시작 및 리소스 관리를 효율적으로 처리할 수 있습니다.

Systemd는 대부분의 주요 Linux 배포판(Ubuntu, Debian, CentOS, Fedora, RHEL 등)에서 기본 관리자로 채택되어 있어, 다양한 환경에서 일관된 방식으로 서비스를 관리할 수 있습니다. 아래 단계에 따라 .NET 애플리케이션을 Systemd 서비스로 등록하고 관리할 수 있습니다.

서비스 등록 및 관리 절차

  1. Systemd 서비스 유닛 파일 생성 /etc/systemd/system/ 디렉토리에 myapp.service와 같은 이름으로 유닛 파일을 생성합니다. 텍스트 편집기를 사용하여 다음 내용을 작성합니다:
[Unit]
Description=My .NET 6 Web API Application
After=network.target

[Service]
User=your_user          # 애플리케이션 실행 사용자 (보안상 root 대신 지정 권장)
Group=your_group        # 애플리케이션 실행 그룹
WorkingDirectory=/var/www/my-dotnet-app # 애플리케이션 실행 디렉토리
ExecStart=/usr/bin/dotnet /var/www/my-dotnet-app/YourApp.dll # 실행 명령어
Restart=on-failure      # 실패 시 재시작 정책
# RestartSec=5          # 재시작 간격 (초)
# LimitNOFILE=65535     # 열 수 있는 최대 파일 핸들 수
# StandardOutput=journal # 표준 출력을 journald로 리다이렉트
# StandardError=journal  # 표준 에러를 journald로 리다이렉트

[Install]
WantedBy=multi-user.target

User, Group, WorkingDirectory, ExecStart의 경로는 실제 애플리케이션 환경에 맞게 수정해야 합니다.

  1. 서비스 활성화 및 시작 생성한 서비스를 활성화하고 시작하기 위해 다음 명령어를 실행합니다:
sudo systemctl daemon-reload
sudo systemctl enable myapp.service
sudo systemctl start myapp.service

daemon-reload는 Systemd가 새 유닛 파일을 인식하도록 합니다. enable은 시스템 부팅 시 서비스가 자동으로 시작되도록 설정하며, start는 즉시 서비스를 시작합니다.

  1. 서비스 상태 확인 서비스가 정상적으로 실행 중인지 확인하려면 다음 명령어를 사용합니다:
sudo systemctl status myapp.service

출력에서 Active: active (running) 상태를 확인하고, 오류 메시지가 없는지 주의 깊게 살펴봅니다.

유닛 파일 구성 요소 설명

  • [Unit] 섹션:
  • Description: 서비스에 대한 간단한 설명입니다.
  • After: 서비스가 시작되기 전에 완료되어야 하는 다른 유닛(예: 네트워크)을 지정합니다.

[Service] 섹션:

  • User, Group: 서비스를 실행할 시스템 사용자 및 그룹을 지정합니다. 보안상의 이유로 root 권한이 아닌 특정 사용자로 실행하는 것이 좋습니다.
  • WorkingDirectory: 서비스가 실행될 작업 디렉토리를 설정합니다.
  • ExecStart: 서비스를 시작하기 위해 실행될 전체 명령어를 지정합니다.
  • Restart: 서비스가 예기치 않게 종료되었을 때 재시작 정책을 설정합니다. on-failure는 오류로 종료 시 재시작합니다. always는 어떤 이유로든 종료 시 항상 재시작합니다.
  • RestartSec: 재시작 시도 사이에 대기할 시간을 초 단위로 설정합니다.
  • LimitNOFILE: 프로세스가 열 수 있는 최대 파일 디스크립터 수를 제한합니다.
  • StandardOutput, StandardError: 프로세스의 표준 출력 및 표준 오류를 시스템 저널(journald)로 보내도록 설정하여 로그 관리를 용이하게 합니다.

[Install] 섹션:

  • WantedBy: systemctl enable 명령 실행 시 이 서비스가 포함될 부팅 타겟을 지정합니다. multi-user.target은 일반적인 다중 사용자 텍스트 모드 부팅을 의미합니다.

주요 Systemd 관리 명령어

Systemd로 관리되는 .NET 애플리케이션 서비스를 제어하는 데 사용되는 일반적인 명령어는 다음과 같습니다:

  • 서비스 재설정 (유닛 파일 변경 후): sudo systemctl daemon-reload
  • 서비스 상태 확인: sudo systemctl status myapp.service
  • 서비스 시작: sudo systemctl start myapp.service
  • 서비스 중지: sudo systemctl stop myapp.service
  • 서비스 재시작: sudo systemctl restart myapp.service
  • 서비스 자동 시작 비활성화: sudo systemctl disable myapp.service
  • 서비스 로그 확인 (journalctl 사용): sudo journalctl -u myapp.service -f

태그: .NET systemd linux 프로세스 관리 백그라운드 서비스

7월 24일 19:45에 게시됨