dev.Log

systemd에서 conda 서비스가 안 뜨는 이유 본문

인공지능

systemd에서 conda 서비스가 안 뜨는 이유

초코푸딩 2026. 1. 2. 14:18

터미널에서는 되는데 서비스로만 실행하면 깨지는 진짜 원인

conda 환경에서 잘 동작하던 Python 서비스가
systemd 서비스로 등록하는 순간 실행되지 않는 문제는 매우 흔하다.

  • 터미널에서는 정상
  • conda activate 후 실행하면 정상
  • systemctl로 띄우면 실패

이 문제는 설정 실수가 아니라, conda와 systemd의 설계 철학이 근본적으로 다르기 때문이다.

이 글에서는
왜 systemd에서 conda 서비스가 안 뜨는지,
그리고 실무에서 어떻게 해결해야 하는지를 정리한다.


1. systemd는 쉘 초기화를 거치지 않는다

가장 중요한 차이점부터 보자.

터미널에서 실행할 때

  • 로그인 쉘 실행
  • .bashrc, .bash_profile 로드
  • conda 초기화 자동 적용
  • conda activate 정상 동작

systemd에서 실행할 때

  • 로그인 쉘 ❌
  • .bashrc ❌
  • .bash_profile ❌
  • ExecStart에 적힌 명령을 바로 실행

즉, systemd는
“쉘 환경을 구성해주는 역할”을 전혀 하지 않는다.

그 결과, conda가 기대하는 환경변수가 하나도 설정되지 않은 상태로 Python이 실행된다.


2. conda activate는 바이너리가 아니라 “쉘 함수”다

많이 하는 실수 중 하나가 이거다.

 
ExecStart=conda activate myenv && python app.py

이게 안 되는 이유는 단순하다.

  • conda activate는 실행 파일이 아니다
  • 쉘에 의해 정의되는 함수(function) 이다
  • systemd는 기본적으로 쉘을 띄우지 않는다

그래서 systemd에서는:

  • conda: command not found
  • 또는 activate가 아예 무시됨

3. conda는 실행 시 환경변수를 대량으로 바꾼다

conda activate가 내부적으로 하는 일은 생각보다 많다.

대표적으로:

  • PATH 변경 (env/bin 우선)
  • LD_LIBRARY_PATH 설정
  • PYTHONHOME, PYTHONPATH 조정
  • 경우에 따라 CUDA 관련 변수 간접 영향

이 중 특히 치명적인 게 LD_LIBRARY_PATH다.

systemd에서 이게 빠지면 다음과 같은 에러가 자주 발생한다.

  • ImportError: libstdc++.so.6: version 'GLIBCXX_xxx' not found
  • OSError: libcudart.so not found
  • Illegal instruction (core dumped)

터미널에서는 되는데 서비스에서는 깨지는 대표적인 이유다.


4. systemd는 유저 / 디렉토리 / 권한도 다르다

systemd 서비스는 다음 설정에 따라 실행 환경이 완전히 달라진다.

  • User=
  • WorkingDirectory=
  • Environment=

그래서 터미널에서는 문제가 없던 코드가:

  • 상대 경로 설정 파일을 못 찾거나
  • 로그 파일을 생성하지 못하거나
  • 모델 디렉토리에 접근하지 못하는 경우도 많다

이 문제는 conda 이슈와 겹치면 원인 파악이 더 어려워진다.


5. 그래서 실제로 자주 터지는 패턴

정리하면, 운영 서버에서 가장 흔한 흐름은 이렇다.

  1. 개발자가 conda env에서 서비스 개발
  2. 터미널에서 정상 동작 확인
  3. systemd 서비스로 등록
  4. 재시작 후 서비스 실패
  5. 로그에는 라이브러리 로딩 에러 또는 모듈 없음
  6. “재부팅하면 안 되는 서버” 탄생

6. 해결 방법 ① (권장): 운영에서 conda를 쓰지 않는다

운영 관점에서 가장 안정적인 해법은 이거다.

  • conda → 연구/실험 전용
  • 운영 서버 → Docker + venv/pip

conda가 잘 되는 이유(라이브러리 자체 제공)가
그대로 운영 리스크가 되기 때문이다.


7. 해결 방법 ②: bash -lc로 conda 초기화를 명시적으로 재현

conda를 꼭 써야 한다면,
systemd에서 쉘 환경을 강제로 만들어줘야 한다.

 
[Service] Type=simple User=myuser WorkingDirectory=/opt/app ExecStart=/bin/bash -lc 'source /opt/conda/etc/profile.d/conda.sh && conda activate myenv && exec python app.py' Restart=always

포인트:

  • /bin/bash -lc : 로그인 쉘 환경 재현
  • source conda.sh : conda 함수 등록
  • 마지막 exec : signal 처리 깔끔하게 유지

8. 해결 방법 ③: conda activate를 포기하고 python 절대경로 사용

더 단순한 방식은 이거다.

 
ExecStart=/opt/conda/envs/myenv/bin/python /opt/app/app.py

이 방식은:

  • 쉘 의존 제거
  • activate 불필요

다만, 여전히 라이브러리 문제가 나면 systemd에 직접 환경변수를 넣어야 한다.

 
Environment="LD_LIBRARY_PATH=/opt/conda/envs/myenv/lib" Environment="PATH=/opt/conda/envs/myenv/bin:/usr/bin:/bin"

9. 결론

systemd에서 conda 서비스가 안 뜨는 이유는 명확하다.

  1. systemd는 쉘 초기화를 하지 않는다
  2. conda activate는 쉘 함수다
  3. conda는 환경변수에 강하게 의존한다

그래서:

  • 연구 환경 → conda
  • 운영 서버 → Docker / venv
  • systemd + conda → 항상 추가 작업 필요

conda는 나쁜 도구가 아니다.
다만 운영 서버에는 맞지 않는 도구다.

Comments