상세 컨텐츠

본문 제목

[Ubuntu] crontab 현재 날짜 파일명으로 사용하기

ETC

by jeonghojin 2022. 6. 3. 10:49

본문

cron 스케줄러 설정시 로그를 쌓도록 설정하는 경우,

현재 날짜를 기준으로 매일의 로그 데이터를 관리할 필요성을 느낀다면, 날짜별로 로그가 쌓이도록 파일명을 설정해야한다.

crontab -e

crontab 상단에 쉘스크립트를 선언한다.

#!/bin/bash
TODAY=`date '+%Y%m%d_'`

오늘의 날짜를 변수로 설정.

*/10 * * * * sleep 75; /usr/bin/python3 /home/cosmo/apps/reuters/market_price.py --mode=STAGING >> /home/cosmo/apps/reuters/log/market_price_log/$(TODAY)market_price.log 2>&1

 

다음과 같이 변수를 사용하여 동적으로 파일명을 만든다.


실행되지 않는다.

 

crontab은 nologin shell로 실행되기 때문에 PATH 등 /etc/profile에 걸어둔 내용들이 적용되지 않는다. 따라서 특정 위치에 있는 명령어를 절대경로로 적어두지 않는 경우 crontab이 PATH에서 해당 명령어를 찾지 못해 실패하게 된다.

 

* shell script를 cron으로 동작시킬 경우, .bashrc .bash_profile 의 변수가 적용되지 않는다.

예1) 오라클 sqlplus 를 동작시키는 shell script를 작성하여 테스트 해봤을때 정상동작하는 것을 확인했는데,

        crontab에 등록하여 실행하면 sqlplus가 실행되지 않는다. 

 

예2)  foobar 유저의 .bash_profile 에  FOOBAR="foobar" 라는 변수를 설정하고

         shell script 작성하여 직접 실행시 FOOBAR 변수의 내용이 잘 보이는데, crontab에 등록하면 FOOBAR 변수값이 미지정으로 나온다.

: .bashrc  .bash_profile 등의 초기화 파일은 interactive mode에서만 실행되기 때문이다.

 

 


해결방법

1. 명령어를 절대경로로 사용한다.

ex) java 대신 /app/jdk/bin/java

 

2. bash 스크립트 최상단에 #!/bin/bash  뒤에 -l 을 붙인다.(로그인)

ex) #!/bin/bash 대신 #!/bin/bash -l

* bash -login 옵션을 사용하면 초기화 파일이 모두 수행된다.

 

3. bash 스크립트 내부에서 /etc/profile을 한번 불러들인다.

ex) source /etc/profile 또는 . /etc/profile

 

4. crontab에 등록할때 bash -lc를 활용한다. (로그인)

ex) * * * * * bash -lc /tmp/hello.py

 

 

cf) 위 해결방법으로도 해결되지 않는 문제가 있다. 환경변수와 무관한 문제인데 crontab 내부에서 % 문자열을 사용했을 경우이다. 날짜를 파일명으로 해서 로그를 남기고 싶은 경우이다.

원인은 %문자가 crontab 내부에서 newline으로 해석되기 때문이다.

*/10 * * * * sleep 75; /usr/bin/python3 /home/cosmo/apps/reuters/market_price.py --mode=STAGING >> /home/cosmo/apps/reuters/log/market_price_log/`date +\%Y\%m\%d_`market_price.log 2>&1​

 

다음과 같이 \ (backslash)로 escape시켜주어야 한다.

 

 

참고 : 

https://www.snoopybox.co.kr/2064

 

리눅스 crontab date +% 포맷 작동하지 않는 경우

리눅스 crontab에 걸어둔 파일이 작동하지 않는 경우 일반적인 원인은 환경변수이다. crontab은 nologin shell로 실행되기 때문에 PATH 등 /etc/profile에 걸어둔 내용들이 적용되지 않는다. 따라서 특정 위

www.snoopybox.co.kr

http://www.ischo.net/bd_linux/19376

 

ischo.net - shell script를 cron으로 동작시킬때 .bashrc .bash_profile의 변수가 적용되지 않는다

원문 : http://www.ischo.net -- 조인상 //시스템 엔지니어 +++++++++++++++++++++++++++++++++++++++++++++++++++++++ shell script를 cron으로 동작시킬때 .bashrc .bash_profile의 변수가 적용되지 않는다예1) 오...

www.ischo.net

 

관련글 더보기