dev.Log
systemd에서 conda 서비스가 안 뜨는 이유 본문
터미널에서는 되는데 서비스로만 실행하면 깨지는 진짜 원인
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는 바이너리가 아니라 “쉘 함수”다
많이 하는 실수 중 하나가 이거다.
이게 안 되는 이유는 단순하다.
- 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. 그래서 실제로 자주 터지는 패턴
정리하면, 운영 서버에서 가장 흔한 흐름은 이렇다.
- 개발자가 conda env에서 서비스 개발
- 터미널에서 정상 동작 확인
- systemd 서비스로 등록
- 재시작 후 서비스 실패
- 로그에는 라이브러리 로딩 에러 또는 모듈 없음
- “재부팅하면 안 되는 서버” 탄생
6. 해결 방법 ① (권장): 운영에서 conda를 쓰지 않는다
운영 관점에서 가장 안정적인 해법은 이거다.
- conda → 연구/실험 전용
- 운영 서버 → Docker + venv/pip
conda가 잘 되는 이유(라이브러리 자체 제공)가
그대로 운영 리스크가 되기 때문이다.
7. 해결 방법 ②: bash -lc로 conda 초기화를 명시적으로 재현
conda를 꼭 써야 한다면,
systemd에서 쉘 환경을 강제로 만들어줘야 한다.
포인트:
- /bin/bash -lc : 로그인 쉘 환경 재현
- source conda.sh : conda 함수 등록
- 마지막 exec : signal 처리 깔끔하게 유지
8. 해결 방법 ③: conda activate를 포기하고 python 절대경로 사용
더 단순한 방식은 이거다.
이 방식은:
- 쉘 의존 제거
- activate 불필요
다만, 여전히 라이브러리 문제가 나면 systemd에 직접 환경변수를 넣어야 한다.
9. 결론
systemd에서 conda 서비스가 안 뜨는 이유는 명확하다.
- systemd는 쉘 초기화를 하지 않는다
- conda activate는 쉘 함수다
- conda는 환경변수에 강하게 의존한다
그래서:
- 연구 환경 → conda
- 운영 서버 → Docker / venv
- systemd + conda → 항상 추가 작업 필요
conda는 나쁜 도구가 아니다.
다만 운영 서버에는 맞지 않는 도구다.
'인공지능' 카테고리의 다른 글
| CUDA + PyTorch에서 pip vs conda 차이 (0) | 2026.01.02 |
|---|---|
| ML Docker 이미지 크기 줄이는 법 (0) | 2026.01.02 |
| 운영 서버에서 conda 쓰면 실제로 터지는 사례들 (0) | 2026.01.02 |
| conda vs venv vs Docker (0) | 2026.01.02 |
| Whisper vs NeMo (EPD) (0) | 2025.12.30 |