본문 바로가기
IT/LINUX

crontab 쉘스크립트 실행 안되는 현상

by SidePower 2020. 8. 23.

무한루프를 이용해서 반복적인 실행이 필요한
프로그램은 항시 기동되어 있조.

그럼 CPU나 메모리 등의 자원을 차지해 서버에 부담을 주게 될거에요.

매일 몇시 로그파일을 지우기
매달 1일에 전달 통계자료 생성
매년 1월 1일에 대사 작업 실행
등등...

리눅스에는 이러한 주기적인 또는 반복적인 실행을
대신 해주는 아주 소중한 crontab 이 있습니다.

crontab -e 명령어로 등록,수정을 해요.

예) 매분 test.sh 쉘스크립트를 실행할려면
아래 처럼 등록 하면 되요.

* * * * * test.sh
분 시 일 월 요일 프로그램 

crontab 사용시 꼭 알아야 될 두가지가 있어요.

이걸 모르면 실행시 오작동이나 실행이 안될수도 있어요.

crontab 은 crond 라는 시스템 데몬에 의해 수행됩니다.

등록된 정보를 해석해서 시간에 맞게 쉘스크립트나 프로그램을 실행합니다.

내가 리눅스에 로그인한 계정이 user1 이며
매일 0시에 exe1.sh 를 실행할려고 합니다.

crontab -e 엔터키 치면 텍스트 문서 편집기 화면으로 전환됩니다. 

여기서 아래처럼 설정합니다.

0 * * * * exe1.sh

그럼 매일 0시에 실행될까요? 안됩니다.^^;;

 


실행 안되는 첫번째는 crond 데몬은 exe1.sh 파일을 못찾기때문입니다.

crond 데몬은 root 계정이 실행했으며 root 계정의 shell 환경이고
exe1.sh는 user1 계정에서 만들어졌으며
user1 계정의 shell 환경입니다.

리눅스에선 shell 환경이 다른 파일은 못찾습니다.

PATH를 잡아주면 되지만 공통 영역까지 제어하게 되면 
shell 환경이 좀 지져분해져요.

그래서 간단한 방법으로 crontab 사용 쉘스크립트나 프로그램은 
모두 절대경로로 적어주면 해결됩니다.

exe1.sh => /home/user1/exe1.sh
0 * * * * /home/user1/exe1.sh

그래도 실행 안되는 경우가 있어요.?

두번째는 바로 exe1.sh 수행할때 user1 계정에만 
종속된 변수나 라이브러리를 사용할때입니다.

리눅스는 계정이 다른 shell 환경의 변수나 라이브러리를 알수 없습니다.

crond 은 exe1.sh 실행중에 user1 계정의 변수나 라이브러리에서 
오류가 발생하면서 종료됩니다.

해결방법은 exe1.sh 안의 시작부분에 user1 계정의 profile을 넣어주면 됩니다.

#!/bin/bash
. ~user1/.bash_profile
간단하조.

이렇게 두가지만 주의하시면 crontab 수행에 특별히 문제없이 잘 처리될거에요.

여기까지입니다.



반응형

댓글