본문 바로가기

SeSAC 금융데이터 분석가/파이썬 프로그래밍

8/26 금 ft. sh, crontab(리눅스 예약작업)

728x90

1. nb_conda

기존에 수업 들을 땐 그냥 설치하라고 해서 용도를 몰랐는데,
jupyter notebook 상에서 anaconda 가상환경과 설치된 패키지들을 관리할 수 있다! Conda라는 tab이 생김..

 

 

2. numpy boolean indexing

- x[x > 3]
- x[x == 1]
- x[~(x==1)]: ~는 not
- x[(x > 3) & (x < 8)]

a = np.arange(20).reshape(4, 5)
print(a)

print(a > 3)
print(a[a > 3])
print(a[a == 1])
print(a[~(a == 1)]) # ~는 Not
print(a[(a > 3)&(a < 8)])

# [[ 0  1  2  3  4]
#  [ 5  6  7  8  9]
#  [10 11 12 13 14]
#  [15 16 17 18 19]]
# [[False False False False  True]
#  [ True  True  True  True  True]
#  [ True  True  True  True  True]
#  [ True  True  True  True  True]]
# [ 4  5  6  7  8  9 10 11 12 13 14 15 16 17 18 19]
# [1]
# [ 0  2  3  4  5  6  7  8  9 10 11 12 13 14 15 16 17 18 19]
# [4 5 6 7]

 

3. numpy concatenate

- np.concatenate([x, y]): 배열을 연결

array([[ 0,  1,  2,  3,  4],
       [ 5,  6,  7,  8,  9],
       [10, 11, 12, 13, 14],
       [15, 16, 17, 18, 19]])

- np.concatenate([x, y], axis = 1): 열을 기준으로 연결

array([[ 0,  1,  2,  3,  4, 10, 11, 12, 13, 14],
       [ 5,  6,  7,  8,  9, 15, 16, 17, 18, 19]])

 

4. numpy split

- np.split(x, 4): 배열을 분해

결과: [array([0, 1, 2]), array([3, 4, 5]), array([6, 7, 8]), array([ 9, 10, 11])]

 

- np.split(x, 2, axis=1): 열을 기준으로 분해

[array([[ 0,  1],
        [ 4,  5],
        [ 8,  9],
        [12, 13]]),
 array([[ 2,  3],
        [ 6,  7],
        [10, 11],
        [14, 15]])]

 

5. numpy broadcast

 

 

6. numpy 연산 및 집계함수

- np.linalg.inv(x) # 역행렬
- np.linalg.det(x) # 행렬식

- np.cumsum(x) # 누적합
- np.cumprod(x) # 누적곱
- np.min(x) # 최솟값
- np.argmin(x) #최솟값 위치
- np.argmax(x) # 최댓값 위치
- np.any(x > 4) # 하나라도 참이어야 참
- np.all(x > 4) # 모든 요소가 참이어야 참

- np.where(x > 4) # 조건에 맞는 위치
- np.where(x > 4, x, -100) # 조건, True일 경우, False일 경우

 

7. 쉘 스크립트로 Anaconda env(가상환경) 활성화하고 Jupyter Notebook 실행하기

vim JupyterAuto.sh    # 스크립트 파일 생성

"""                   # vim 편집기로 스크립트 작성(i - 입력 모드, esc - 입력 종료, :wq - 저장 및 닫기)
#!/bin/bash           # bash 실행

__conda_setup="$('/home/jeon2/anaconda3/bin/conda' 'shell.bash' 'hook' 2> /dev/null)"

if [ $? -eq 0 ]; then
    eval "$__conda_setup"
else
    if [ -f "/home/jeon2/anaconda3/etc/profile.d/conda.sh" ]; then
        . "/home/jeon2/anaconda3/etc/profile.d/conda.sh"
    else
        export PATH="/home/jeon2/anaconda3/bin:$PATH"
    fi
fi                    # conda 경로 잡기

echo "Hello, Angela! Jupyter Notebook(Study env) will begin soon on chrome. :D"

conda activate study  # env(가상환경) 활성화
jupyter notebook      # 주피터 노트북 실행

exit 0                # 성공하면 exit
"""                   # 스크립트 저장 후 닫기

sh JupyterAuto.sh     # 스크립트 실행

 

8. crontab

windows 사용할 때는 작업 스케줄러 GUI가 있어서 시작 프로그램 설정하기가 쉬웠는데,
리눅스는 crobtab으로 지정한 시간에 지정한 작업을 하도록 설정해야 한다.

crontab -l                            # 기존 예약작업 있는지 확인. "no crontab for jeon2"
crontab -e                            # 편집기 선택 후 예약작업 작성하고 :wq
crontab -r                            # 예약작업 삭제

service cron start                    # crontab 시작
service cron restart                  # crontab 재시작(or reload). 예약작업 작성 후 restart해야 함
service cron status                   # crontab 작동 여부 확인

cat /var/log/syslog | grep cron       # crontab는 백그라운드에서 돌기 때문에 오류 발생 시 로그를 봐야함
# (CRON) info (No MTA installed, discarding output) 로그에 좌측과 같이 뜨면, MTA(메일 전송 관리자)가 설치되지 않아서 생기는 오류
sudo apt-get install postfix          # MTA 설치

ps -ef | grep cron                    # cron이라는 이름으로 돌고 있는 프로세스 있는지 확인
kill -9 '프로세스 번호'

 

되는 놈(?)이 걸려라라는 마음으로 다양한 버전으로 crontab을 작성했는데,

시간 지정, 리부트, cron restart/reload 해도 자동 실행이 안 된다.. 어렵잖아!! 🤢

 

어제부터 혼자 끙끙대다가 창현님이 원격(Open SSH Server 설치→방화벽 SSH 허용→이미 깔려있는 Client로 username@ip_address 접속)으로 .sh에 실행 권한을 주고,
기존에 작성해둔 .py 파일에 config.yaml를 절대 경로로 잡아주니 해결이 되었다.. 😇

 

ft. 파일에 실행 권한 부여하는 방법!

-rwxrwxrwx: 이 파일은 소유자/그룹/모두가 읽고 쓰고 실행할 수 있음

r == 4, w == 2,  x == 1, -(아무 권한 없음) == 0. r + w + x = 7

ls -l                    # 권한을 줄 파일이 위치한 디렉터리로 이동 후 각 파일별로 어떤 권한을 가졌는지 확인
chmod 777 JupyterAuto.sh # 소유자/그룹/모두에게 읽기, 쓰기, 실행 권한 부여

 

chmod로 파일에 권한 부여

 

>> vim StockAuto.sh

#!/bin/bash

echo $(date '+%Y-%m-%d %H:%M:%S')
python3 /mnt/FE0A5E240A5DDA6B/workspace/jeon2_package/KoreaStockAutoTrade.py

 

>> crontab -e # 로그가 남도록 옵션을 줬음

#@reboot /mnt/FE0A5E240A5DDA6B/workspace/jeon2_package/StockAuto.sh >> /mnt/FE0A5E240A5DDA6B/workspace/jeon2_package/StockLog.log 2>&1
0 9 * * 1-5 /mnt/FE0A5E240A5DDA6B/workspace/jeon2_package/StockAuto.sh >> /mnt/FE0A5E240A5DDA6B/workspace/jeon2_package/StockLog.log 2>&1

월 ~ 금 오전 9시에 StockAuto.sh가 실행되고, StockLog.log에 기록을 남긴다.

 

윈도우에서처럼 디스코드 알림도 잘 오고, 한국투자증권 API도 잘 작동하고 해당 디렉터리에 로그도 잘 남는다.. 끝!!

 

cf. crontab을 사용하면 스크립트들이 많아지고 서로 의존성이 커지고 컨트롤하기 어려워,
그에 대한 대체로 Airflow(?)를 쓴다고 한다!

728x90

'SeSAC 금융데이터 분석가 > 파이썬 프로그래밍' 카테고리의 다른 글

8/25 목 ft. OpenSSH Key  (0) 2022.08.25
8/24 수  (0) 2022.08.24
8/23 화  (0) 2022.08.24