문제 인식
필요한 파이썬 명령어들을 넣어 쉘 스크립트(.sh) 파일을 작성해서 구동해야 할 일이 있다. 해당 파이썬 파일은 특정 아나콘다(혹은 미니콘다) 환경을 적용해서 명령어를 실행해야 한다. 그래서 일반적으로 쉘 스크립트 안에다가 conda activate {my_env}
같은 명령어를 넣는다. 하지만 저렇게 적은 쉘 스크립트 파일은 제대로 적용되지 않는 문제가 있다. 추가적으로 해당 스크립트 파일을 크론으로 예약된 시간에 돌릴 때도 콘다 환경이 적용되는 것을 목표로 한다.
우선 다음과 같이 my_work.sh
파일을 작성하였다.
#!/bin/bash
conda activate my_env
python my_python_work.py
my_python_work.py
는 실제로는 다른 복잡한 작업들이 있지만 포스팅에서는 예시를 들기 위해 다음과 같이 정의한다.
# my_python_work.py
import tensorflow as tf
print(tf.__version__)
위와 같이 적은 이유는 base
환경에는 tensorflow
프레임워크가 설치되지 않아 해당 파이썬 파일이 작동을 하지 않고 my_env
라는 콘다 환경에서는 tensorflow
를 설치하여 해당 파이썬 파일이 정상적으로 작동하기 때문에 예시를 저렇게 들었다.
그래서 위의 쉘 파일 my_work.sh
를 실행하면 다음과 같은 메시지가 뜨게 된다.
일단 conda activate ...
명령문도 제대로 적용되지 않은것으로 확인된다.
추가적으로 기본적으로 base
환경이 적용되는지 여부 자체가 궁금해서 conda info
를 추가하여 아래와 같이 쉘 스크립트 파일 내용을 수정하였다.
#!/bin/bash
conda info
conda activate my_env
conda info
python my_python_work.py
환경 활성화 명령어 앞 뒤로 현재 콘다 환경의 정보를 출력을 해보았더니 출력되는 환경이 위/아래가 다음의 이미지와 같이 2번 출력되었다. 즉 둘다 base
환경만 적용된 것이다.
당연히 파이썬 실행결과는 다음과 같이 오류를 던진다.
Traceback (most recent call last):
File "my_python_work.py", line 1, in <module>
import tensorflow as tf
ModuleNotFoundError: No module named 'tensorflow'
일단 해당 conda activate
명령어가 작동하지 않음은 확실해졌다.
다른 시도
콘다환경 및 가상환경 들을 source activate ...
명령어로 활성화 할 수 있는 점이 떠올랐다. 그래서 해당 명령어로 쉘 스크립트 구성을 바꿔보기로 한다. 실제로 source activate my_env
도 conda activate my_env
와 동일하게 일반적인 터미널에서 작동한다.
해당 쉘 파일을 다음과 같이 변경하였다.
#!/bin/bash
conda info
source activate my_env
conda info
python my_python_work.py
결과는 다음과 같이 출력된다.
결과를 보고 작동을 하는 것으로 판단하고 해당 작업을 cronjob
으로 돌릴 일이 있어서 크론탭에 등록했다. 실행결과를 로그파일로 남기기 위해 쉘 스크립트 내용을 로그파일 출력 부분을 추가하여 다음과 같이 작성하고 크론탭에 등록한다.
#!/bin/bash
date >> /home/dong/result.log
echo `conda info` >> /home/dong/result.log
source activate my_env
echo `conda info` >> /home/dong/result.log
python my_python_work.py >> /home/dong/result.log
크론탭은 다음과 같이 적용한다. 작동의 여부를 확인하기 위해 date
명령어를 추가해주고 1분 간격으로 실행한다. 적당히 1~2분 뒤에 해당 명령어들이 올바르게 수행되었는지 확인한다. 크론 탭은 다음 명령어로 실행한다
$ crontab -e
* * * * *
내용은 매 초 / 매 분 / 매 시간 / 매 월 / 모든 요일 이렇게 적용을 한다는 것이다. crontab에 관련된 사용법은 다른 포스팅들을 통해서 확인하자. 그리고 저장하고 나와서 크론의 서비스를 재시작해준다.
$ sudo service cron restart
생성된 로그파일을 열어서 결과를 확인하니 전혀 2번째 줄인 conda info
부분부터 아무런 로그도 찍혀있지 않았다.
행여나 로그를 출력하는 방식이 잘못 되었을까봐 다음과 같이 바꾸어서 모두 시도해보았다. 아래의 명령어는 전부 작동하지 않았다.
echo `conda info` >> /home/dong/result.log
echo ${conda info} >> /home/dong/result.log
${conda info} >> /home/dong/result.log
conda info >> /home/dong/result.log
최종적으로 해결은 아래와 같이 했다.
작동 성공
최종적으로 구글링과 다른 쉘 스크립트를 크론잡에 등록하는 사례들을 찾아본 결과 다음과 같은 방법으로 적용할 수 있었다.
- 처음에 우리가 터미널을 열 때 적용되는
PATH
환경변수는 크론잡에서 스크립트를 실행 시 자동으로 적용되지 않는다. 그래서 스크립트 내부에서 기존PAHT
가 가지는 경로 값들을 따로 export 해준다. - 콘다 환경을 사용하기 위해
~/anaconda3/etc/profile.d/conda.sh
해당 스크립트를source
명령어를 통해 적용해준다. - 그 뒤는 기본
base
환경을 위한conda activate
,my_env
까지 활성화 하고 해당 작업들을 수행해준다.
#!/bin/bash
export PATH=/home/dong/anaconda3/bin:/home/dong/anaconda3/condabin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/snap/bin
source ~/anaconda3/etc/profile.d/conda.sh
date >> /home/dong/result.log
conda activate
conda info >> /home/dong/result.log
conda activate my_env
conda info >> /home/dong/result.log
python /home/dong/my_python_work.py >> /home/dong/result.log
결과는 완벽하게 base
환경과 my_env
환경에서 파이썬 파일 수행까지 잘 적용된 모습이다.
cron + sh file + conda 이 조합을 이제는 수행할 때 막힘 없이 수행할 수 있을 것이다.
댓글남기기