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
The Tomcat connector configured to listen on port 9999 failed to start. (0) | 2022.07.28 |
---|---|
shell script 로그 수집 개선 (0) | 2022.06.14 |
동기/비동기, 블록/논-블록 (0) | 2022.05.27 |
정보처리기사 실기 - 10.애플리케이션 테스트 관리 (0) | 2022.04.20 |
정보처리기사 실기 - 9.소프트웨어 개발 보안 구축 (0) | 2022.04.03 |