diff --git a/README.md b/README.md index 8a83ec0..30c9202 100644 --- a/README.md +++ b/README.md @@ -165,6 +165,54 @@ uvicorn app.main:app --reload --host 127.0.0.1 --port 8025 --- +## Linux + Conda: `libtinfo.so.6` / `vi`·`bash` 경고 + +`(ncue)` 등 conda 환경을 켠 뒤 **`LD_LIBRARY_PATH`에 `${CONDA_PREFIX}/lib`가 들어가면**, 터미널에서 돌아가는 **시스템 프로그램(`vi`, `bash`, `less` 등)** 이 conda에 들어 있는 `libtinfo.so.6`을 먼저 물 수 있습니다. 그 라이브러리에 ELF 버전 태그가 맞지 않을 때 **«no version information available»** 가 납니다. (`run.sh`는 스크립트 안에서 이를 피하도록 처리해 두었습니다.) + +**`conda deactivate` 해도 경고가 남는 경우** + +- `deactivate`만으로 **`LD_LIBRARY_PATH`가 비워지지 않을 수 있습니다** (이전 셸 값 복원 실패, `.bashrc`에서 직접 export, 다른 툴이 덧붙임). +- **`vi`가 conda·vim 빌드**일 수 있습니다. `type -a vi`, `which -a vi` 로 확인하고, 가능하면 **`/usr/bin/vi`** 또는 **`/usr/bin/vim`** 을 쓰세요. + +**당장 편집·실행** + +```bash +unset LD_LIBRARY_PATH +vi run.sh +``` + +또는 한 줄로: + +```bash +env -u LD_LIBRARY_PATH /usr/bin/vi run.sh +LD_LIBRARY_PATH= /usr/bin/vi run.sh +``` + +저장소 헬퍼 (`chmod +x scripts/env-no-ld.sh` 후): + +```bash +./scripts/env-no-ld.sh vi run.sh +./scripts/env-no-ld.sh /usr/bin/vi run.sh +``` + +**원인 확인** + +```bash +echo "LD_LIBRARY_PATH=${LD_LIBRARY_PATH-<비어 있음>}" +type -a vi +conda deactivate +echo "LD_LIBRARY_PATH=${LD_LIBRARY_PATH-<비어 있음>}" # 여전히 miniconda 경로면 .bashrc 등 확인 +grep -n LD_LIBRARY_PATH ~/.bashrc ~/.profile ~/.bash_profile 2>/dev/null +``` + +**장기적으로** + +1. `grep -r LD_LIBRARY_PATH "$HOME/workspace/miniconda3/envs/ncue/etc/conda/activate.d/"` 등으로 어떤 패키지가 넣는지 확인합니다. +2. GPU/torch가 꼭 필요한 터미널과 **편집·git용 터미널**을 나누거나, 편집 전에 `unset LD_LIBRARY_PATH` 를 습관화합니다. +3. `conda install -c conda-forge ncurses` 로 env 안 ncurses를 맞추면 완화되는 경우가 있습니다(환경마다 다름). + +--- + ## 플랫폼 요약 | 항목 | Ubuntu | macOS | diff --git a/run.sh b/run.sh index 100165d..098dde6 100755 --- a/run.sh +++ b/run.sh @@ -1,22 +1,38 @@ -#!/usr/bin/env bash -# libtinfo 경고: 터미널에 이미 conda가 켜져 LD_LIBRARY_PATH가 잡혀 있으면 -# env -u LD_LIBRARY_PATH ./run.sh -# 로 실행해 보세요. +#!/bin/sh +# conda가 LD_LIBRARY_PATH에 lib를 넣은 상태에서 bash가 스크립트를 읽으면 +# 시스템 bash가 conda의 libtinfo를 물어 경고가 난다. /bin/sh로 한 번 감싼 뒤 +# LD_LIBRARY_PATH 없이 bash를 다시 실행한다. +if [ -z "${STT_RUN_WITH_CLEAN_LDLIB:-}" ]; then + export STT_RUN_WITH_CLEAN_LDLIB=1 + exec env -u LD_LIBRARY_PATH /bin/bash "$0" "$@" +fi + set -euo pipefail -if [[ -z "${BASH_VERSION:-}" ]]; then - echo "ERROR: bash로 실행하세요. 예) ./run.sh 또는 bash run.sh" >&2 +SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" +cd "$SCRIPT_DIR" + +if [[ -z "${CONDA_BASE:-}" || ! -f "${CONDA_BASE}/bin/activate" ]]; then + CONDA_BASE="" + for cand in "${HOME}/workspace/miniconda3" "${HOME}/miniconda3" "${HOME}/anaconda3" "/opt/anaconda3"; do + if [[ -n "$cand" && -f "$cand/bin/activate" ]]; then + CONDA_BASE="$cand" + break + fi + done +fi +if [[ -z "${CONDA_BASE:-}" || ! -f "${CONDA_BASE}/bin/activate" ]]; then + echo "ERROR: conda를 찾을 수 없습니다. 예: export CONDA_BASE=/path/to/miniconda3" >&2 exit 1 fi -cd /home/dsyoon/workspace/stt +# 기본은 ncue (기존 동작). 다른 환경은 CONDA_ENV=stt 등으로 지정. +CONDA_ENV="${CONDA_ENV:-ncue}" +# shellcheck source=/dev/null +source "${CONDA_BASE}/bin/activate" "${CONDA_ENV}" -CONDA_BASE="/home/dsyoon/workspace/miniconda3" -source "${CONDA_BASE}/bin/activate" ncue - -# 전역 LD_LIBRARY_PATH에 conda lib를 넣으면, 같은 터미널의 bash가 conda의 -# libtinfo.so 를 물며 «no version information available» 경고가 날 수 있음. -# torch/ctranslate2 등은 uvicorn 자식 프로세스에만 경로를 넘긴다. +# 전역 LD_LIBRARY_PATH에 conda lib를 넣지 않음 (bash/libtinfo 경고 방지). +# torch/ctranslate2 등은 uvicorn 자식에만 경로 전달. PORT="${PORT:-8025}" RELOAD="${RELOAD:-0}" diff --git a/scripts/env-no-ld.sh b/scripts/env-no-ld.sh new file mode 100755 index 0000000..0da60a2 --- /dev/null +++ b/scripts/env-no-ld.sh @@ -0,0 +1,5 @@ +#!/bin/sh +# LD_LIBRARY_PATH 없이 명령 실행 (conda libtinfo 때문에 vi/bash 등이 경고 낼 때) +# 사용: ./scripts/env-no-ld.sh vi run.sh +# ./scripts/env-no-ld.sh bash -c 'echo ok' +exec env -u LD_LIBRARY_PATH "$@"