[Bitnmai ubuntu]쉘스크립트 작성 방법 및 HTTP API 호출 방법( crontab 등록 등)
공공데이터 포털의 api를 호출하여 데이터를 json타입으로 가져오는 서비스를 php로 구현 후 새벽에 서버 스케줄을 등록하여 동작하게 하기위해 작업을 진행한 기록을 남긴다.
스크립트 파일 생성 및 crontab 등록
- vi call_script.sh 명령어를 실행하여 파일을 생성한다.
- 아래 스크립트를 작성 후 저장한다
- #!/bin/sh
- curl -i https://test.com/api/stock/getKrxInfo.php
- 생성한 파일을 아래 명령어를 실행하여 실행할 수 있는 권한을 부여한다.
- chmod +x call_script.sh 또는 chmod 755 call_script.sh
- 정상동작하는지 확인을 위해 스크립트를 실행한다.
- ./call_script.sh
- crontab -e 명령어를 실행하여 작업을 등록한다.
0 3 * * * /home/bitnami/call_script.sh
- 크론탭 설정 변경 내용을 반영하기위해 cron를 재시작명령어를 실행해준다.
- sudo service cron restart : 재시작 명령어
- sudo service cron start: 시작
- sudo service cron stop: 중지
- 서버 스케줄이 정상적으로 동작하였는지 체크(ubuntu는 syslog에 cron 로그가 통합되어 기록됨)
- cat /var/log/syslog
서버 스케줄(crontab) 작업 등록
crontab -e 입력 후 다음과 같은 내용을 입력한다.
저장은 콜론 (:) 입력 후 wq 로 갱신한다.(vi에디터와 유사함)
사용자를 배려하기 위해 새벽 시간에 작업이 수행되도록 처리하자.
아래 처럼 매일 03:00에 /root/test.sh 실행하도록 등록하였다.
0 3 * * * /home/bitnami/call_script.sh
제대로 동작하는지 테스트를 위해 매분 마다 호출해자
* * * * * /home/bitnami/call_script.sh
혹시모를 상황에 대비하여 크론탭 스케줄을 아래 명령어를 실행하여 백업해두자.
crontab -l > crontab_bak.txt
현재 위 명령어를 실행하는 위치에 백업 텍스트 파일이 생성된다. 현재 실행되는 명령어의 위치는 pwd 명령어를 실행하여 확인할 수 있다.
curl 옵션 정리표
옵션 | 내용 |
---|---|
-o {파일명}, –ouutput {파일명} | 지정한 파일명으로 파일 다운로드 |
-O {경로} | 파일 이름으로 다운로드 |
-s | 추가 정보없이 처리 |
-I | 헤더 정보만 확인 |
-i | 헤더정보 확인 |
-H | 헤더 정보 전달 |
-G | 파라미터 전달 |
-X | 메소드 타입 설정(기본 GET), POST, DELETE 등 |
-d | 전달 데이터, POST 타입일 때 json 형태로 입력하면 데이터 전달 |
-L | 3XX 응답이 오면 경로를 변경함. |
-k | SSL 검증없이 접근. –insecure와 동일. |
-x | 프록시 설정 |
-v | 상세 |
-d/–data-binary | 텍스트를 그대로 전송 |
-T/–upload-file | 파일을 전송 |
–trace-ascii <파일명> | curl로 송신한 정보, 수신한 정보를 파일로 저장 |
–retry | 재시도 횟수 |
–retry-max-time | 최대 재시도 시간 |
–retry-connrefused | connection refused 오류도 재시도 |
–retry-all-errors | 모든 오류에 재시도 |
crontab 명령어
crontab -l
: 예약된 작업 리스트 확인crontab -e
: 작업 수정crontab -r
: 예약된 작업 삭제crontab -u 사용자명
: root관리자는 해당 사용자의 crontab 파일에 대한 읽기 수정 삭제 모두 가능
crontab -l 명령어를 수행해보니, ssl인증서 작업이 등록되어 있었네.
27 11 * * * sudo /opt/bitnami/letsencrypt/lego --path /opt/bitnami/letsencrypt --email="jxxxxxt2023
@gmail.com" --http --http-timeout 30 --http.webroot /opt/bitnami/apps/letsencrypt --domains=xxxx.com --user-agent bitnami-bncert/1.1.1 renew && sudo /opt/bitnami/apache/bin/httpd -f /opt/bitnam
i/apache/conf/httpd.conf -k graceful # bncert-autorenew
crontab 실행결과
새벽3시에 맞춰놓은 스케줄이 새벽3시가 아닌 12시에 실행되었다. 언제 실행되었는지 체크 하기위해 db에 실행결과를 남겼다.
aws 라이트세일 서버를 서울 리전을 선택했지만… 서버시간은 아마도 미국시간인 듯 싶다.
MariaDB [stock]> select * from crontab_exec_hist;
+-----+-------------+-----------------------+---------------------+
| idx | action_type | memo | reg_date |
+-----+-------------+-----------------------+---------------------
| 1 | KRX_INFO | 2711 data items added | 2024-11-18 12:00:07 |
| 2 | STOCK_PRICE | 2849 data items added | 2024-11-18 12:00:13 |
+-----+-------------+-----------------------+---------------------+
2 rows in set (0.000 sec)
16시로 해야 새벽3시에 실행되겠는데??
0 16 * * * sudo /home/bitnami/call_script.sh
하지만 예상은 빗나갔다. 새벽1시에 실행되었다. 18시로 설정하면 새벽 3시에 실행됨을 확인하였다.
하지만 문제가 발생했다. 공공데이터 포탈에서 가져오는 증권 종목과 종목별 가격에 대한 정보가 새벽에 업데이트 되지 않더라… 아직 정확한 시간을 파악하진 못했는데, 오전 업무 시간에 업데이트 되는게 아닌가 싶다.
사용자가 사용하는 시간은 최대한 피해서 데이터 동기화를 하려고 하는데… 계획 변경이 필요해보인다.
2024.11.21 확인사항
오전 11시에 전날 데이터가 올라온다.
점심시간에 실행되도록 최초안으로 변경하였다.
혹시 모를 상황에 대비해 관리페이지를 만들고 바로 실행할 수 있도록 동기화버튼도 추가하였다. 물론 실행로그도 바로 확인할 수 있도록하였다.
[참고자료]
https://inpa.tistory.com/entry/LINUX-쉘-프로그래밍-핵심-문법-총정리#
https://velog.io/@foqlzm12345/Bash-스크립트를-사용한-HTTP-API-호출-방법
https://skyblue-java.tistory.com/5
https://velog.io/@kero1004/linux-crontab설정