본문 바로가기
자료분석 및 코딩/기타 해양, 기상 정보 및 분석툴

[기타 - 쉘] 해양수치모델 하이컴 다운로드 2 - 스크립트를 활용한 자동 다운로드. 쉘, wget, crontab

by 아다콘다 2023. 7. 31.

 이번에는 지난글에 이어, 스크립트를 통해 하이컴 정보를 수집하는 방법에 대해 소개해보도록 하겠다. 웹페이지에서 바로 다운로드 받는 방법은 짧은 자료나 단기적으로 자료를 활용할 때는 편할수도 있지만, 정기적으로 수집하거나 광범위한 기간을 수집해야 할 경우에는 매우 번거로운 작업이다. 따라서, 이번에는 스크립트를 작성하여 일괄적으로 정보를 수집하는 방법에 대해 알아보도록 하겠다.

 

 1. wget 활용

 보통 장기 정보를 수집하거나 정기적으로 정보를 수집할 때는 자료의 크기가 매우 커지게 된다. 또한 이런 경우는 보통 연구 또는 실무적으로 활용하기 위한 경우가 많아 서버에 자료를 수집해두는 경우가 많다. 따라서, 리눅스 운영체제에서 웹페이지의 자료를 다운로드 받는 프로그램인 wget을 활용한다.

 wget은 web get의 약자로 웹 서버로부터 콘텐츠를 가져오는 프로그램이다. 사용법은 간단히 'wget 웹서버의주소' 와 같이 입력하면 된다. 그럼 다운로드 받을 정보의 웹 서버 주소만 알면 되는데, 이는 아래 사진과 같이 지난 분석글에서 체크해두며 기억해둬야한다고 언급한적이 있다. 이 파란박스의 주소가 다운로드 주소가 된다.

 그럼 간단하게 아래와 같이 입력하면 해당 정보를 다운로드할 수 있게 된다.

wget "https://ncss.hycom.org/thredds/ncss/GLBy0.08/expt_93.0/FMRC/sur/runs/GLBy0.08_930_FMRC_sur_RUN_2023-07-25T12:00:00Z?var=ssh&var=u_barotropic_velocity&var=v_barotropic_velocity&north=45&west=110&east=140&south=25&disableProjSubset=on&horizStride=1&time_start=2023-07-25T12%3A00%3A00Z&time_end=2023-08-02T00%3A00%3A00Z&timeStride=1&accept=netcdf4"

 추가적으로 wget에도 몇몇 유용한 옵션이 있는데, 자주 사용하는 옵션들은 아래와 같다.

  • -c : 중단된 다운로드 재실행
  • --tries : 재시도 횟수 지정 (--tries=10 과 같이 사용)
  • -O : 다른이름으로 저장 (-O test.nc 와 같이 사용)
  • -o : 다운로드 로그 기록 (-o downlog.txt 와 같이 사용)

 보통 위 네가지 옵션을 자주 사용한다. 하이컴 서버가 불안정하여 다운로드가 매우 자주 끊기는데 이로 인해 -c, 와 --tries는 거의 필수적으로 사용해야한다. 그 외에 어디서 끊겼는지 확인하고 싶다면 로그를 기록하는 -o 옵션을 쓰면되고, 자료를 체계적으로 수집하려면 -O로 별도의 파일명으로 저장하는 것이 효율적이다.

 

 따라서, 아래와 같이 입력하면 선택한 하이컴 정보를 test.nc라는 파일로 저장할 수 있다.

wget -c --tries=10 "https://ncss.hycom.org/thredds/ncss/GLBy0.08/expt_93.0/FMRC/sur/runs/GLBy0.08_930_FMRC_sur_RUN_2023-07-25T12:00:00Z?var=ssh&var=u_barotropic_velocity&var=v_barotropic_velocity&north=45&west=110&east=140&south=25&disableProjSubset=on&horizStride=1&time_start=2023-07-25T12%3A00%3A00Z&time_end=2023-08-02T00%3A00%3A00Z&timeStride=1&accept=netcdf4" -O /home/user/test.nc

 

 

2. 하이컴 정보 선택

 하이컴 정보 중 원하는 기간, 영역, 변수 등을 스크립트 내에서 수정할 수 있다. 다운로드 서버 주소를 보면,

https://ncss.hycom.org/thredds/ncss/GLBy0.08/expt_93.0/FMRC/sur/runs/GLBy0.08_930_FMRC_sur_RUN_2023-07-25T12:00:00Z?var=ssh&var=u_barotropic_velocity&var=v_barotropic_velocity&north=45&west=110&east=140&south=25&disableProjSubset=on&horizStride=1&time_start=2023-07-25T12%3A00%3A00Z&time_end=2023-08-02T00%3A00%3A00Z&timeStride=1&accept=netcdf4

과 같이 ?와 &로 구분할 수 있다. ?는 파일명의 구분자이고, &는 옵션 구분자인 것을 확인할 수 있는데, 이를 확인하기 좋게 구분하여 적어보면 아래 사진과 같다.

  따라서, 위 코드의 각 옵션들을 수정하면, 원하는 정보만 선택하여 수집이 가능하다.

 

 이제 실질적으로 예를 들어 스크립트를 작성해보도록 하겠다. 예를들어, 매일매일 하이컴의 해수면 높이정보를 우리나라영역을 포함한 위도 25~45, 경도 110~140, 1일 데이터를 다운로드 한다고 가정해보자. 그럼 옵션을 1.날짜(생산일, 시작일, 종료일), 2. 변수, 3.영역, 4.파일명 정도를 지정하면 된다.

2.1 날짜

 위 다운로드 주소에서 보면 앞쪽의 파일명에 날짜가 있고, 뒤쪽에도 시작&종료 날짜가 있는 것을 볼 수 있다. 앞쪽의 날짜는 파일명이다. 따라서, 정보가 생산된 시간을 의미하는 날짜로 볼 수 있다. 뒷쪽의 시작 & 종료 날짜는 실질적으로 데이터안의 예측시작 시간과 끝시간을 의미한다.

 따라서, 오늘 생산(23.07.31)된 내일(23.08.01)의 예측정보를 수집하고 싶을 때는 앞쪽 날짜에 "2023-07-31T12:00:00Z?" 를 입력하고, 뒷쪽 time_start는 "2023-08-01T00:00:00Z?" , time_end는 "2023-08-01T21:00:00Z?" 과 같이 입력하면 된다. 하지만 보통 생산된 정보가 업로드되는 시간, 우리 시간보다 9시간 느린점, 그리고 하이컴이 7일까지 예측한다는 점을 감안해서 하루전에 생산된 정보의 1~2일 후의 예측정보를 수집하는 것이 훨씬 안정적으로 자료를 수집할 수 있다. 따라서, 아래 그림과 같이 입력하는 것이 더 효율적이다.

 

2.2 변수 및 영역

 수집하려는 변수와 영역도 &옵션으로 선택가능하다. 위 사진처럼 'var=~~~&' 와 같이 옵션을 주면 되고, 영역 역시 동서남북의 각 경계를 지정해주면 된다. 이는 크게 어려울 것 없이 위 이미지대로 입력을 하면 된다.

 

2.3 기타옵션

 알아둬야할 다른 옵션은 accept인데, 보통 netcdf 형식을 활용하니, 그대로 활용하면 된다. 그 외에 horizStride와 timeStride는 수평, 수직 간격을 의미하는데 이 역시 1을 입력하면 된다.

 

이렇게 옵션까지 입력한 다운로드 주소를 붙여 쓰면 아래와 같다. 이를 wget과 같이 입력해주면 해당 정보가 다운로드 된다.

 

 

3. 자동화

 위 스크립트로 매일매일 정기적으로 수집하려면, 스크립트의 날짜만 수정되면 된다. 따라서 코드내에 포함된 날짜만 변수화하여 입력하면 별다른 수정 없이 한가지 스크립트로 매일 수집이 가능하다. 따라서, 날짜 정보를 변수화해보도록 하겠다. 리눅스에서 날짜 정보는 보통 date로 확인할 수 있다. 명령창에 date라고 입력하면 아래와 같이 현재 시각이 표출된다.

 스크립트에 필요한 날짜는 생산된 날짜, 예측기간인데 이는 현재날짜에서 하루전, 하루후의 날짜이다. 따라서 시간계산이 필요한데, date의 시간계산 옵션은 -d이다. 어제 날짜를 알고 싶다면 date -d "-1 day" , 내일 날짜를 알고 싶다면, date -d "1day" 와 같이 입력하면 된다.

 이러한 날짜를 코드내에 입력해야 되는데 날짜의 입력 형식은 YYYY-MM-DD로 되어있다. date의 형식을 지정할 때는 '+%'를 활용하면 된다. 따라서 '+%Y-%m-%d'와 같이 입력하면 된다. 그럼 아래와 같이 어제와 내일을 코드내 날짜 형식으로 입력할 수 있다.

 이제 이러한 날짜 정보를 스크립트 내에서 변수로 저장하면 되는데, 쉘스크립트 내에서 날짜를 문자열로 변수화할 때는 ``로 입력한다. 그레이브인데 따옴표와 헷갈릴 수 있다. 따옴표가 아니라 키보드 좌측의 탭 키 위에 있는 키이다. 따라서 아래 사진과 같이 스크립트를 작성하여 실행한다면 별도의 수정 없이 매일 동일한 코드로 내일의 예측정보 수집이 가능하다.

위 스크립트를 실행하면 아래와 같이 정보 수집이 진행된다.

 또한, 매일 이 스크립트를 실행할 필요 없이 crontab을 활용하면 특정 시간에 해당 스크립트를 반복하여 실행하도록 일정관리가 가능해진다. 크론탭에 대한 내용은 추후에 설명해보도록 하겠다. 간단히만 언급하자면, crontab -e 를 입력하면 크론탭 스케줄을 설정할 수 있는 데 "분 시 일 월 년 실행파일" 과 같이 입력하면 설정한 시간에 반복적으로 실행파일을 실행한다. 매번 반복한다면 *로 표기한다. 예를들어, 매일 아침 9시 30분에 hycom_blog.sh를 실행한다면, 아래 그림과 같이,       30 09 * * * /home/user/hycom_blog.sh 를 입력하고 저장하면 된다. 크론탭 스케줄러의 편집은 vi편집기와 동일하다.

 

 전체 스크립트는 아래와 같다. 매일 정기적으로 하이컴을 수집해야한다면 아래 코드를 그대로 활용하면 된다. 만약, 다른 변수를 수집하거나, 다른 영역, 다른 기간을 수집한다면 해당 부분만 수정하여 사용하면 된다.

#!/bin/bash


fdate=`date -d "-1 day" '+%Y-%m-%d'`
sdate=`date -d "1 day" '+%Y-%m-%d'`

expt_name=expt_93.0
vers_name=GLBy0.08

wget -c --tries=10 "https://ncss.hycom.org/thredds/ncss/${vers_name}/${expt_name}/FMRC/runs/GLBy0.08_930_FMRC_RUN_${fdate}T12:00:00Z?var=surf_el&north=45&west=110&east=140&south=25&horizStride=1&time_start=${sdate}T00%3A00%3A00Z&time_end=${sdate}T21%3A00%3A00Z&timeStride=1&vertCoord=1&accept=netcdf4" -O ./hycom_ssh_${sdate}.nc

 

 추가적으로 하이컴의 모델 및 버전명까지 변수화하였는데, 이는 현재의 기간이 아닌 과거 기간을 수집할 때를 위해서이다. 하이컴은 기간에 따라 버전이 나뉘어져 있는데, 이에 따라 버전명을 다르게 입력해야 한다. 다음에는 과거정보를 수집할 때 이를 자동화하는 코드에 대해 소개해보도록 하겠다.

 

반응형