(linux) crontab 실행 시 환경변수 읽어오지 못하는 이유와 처리 방법

리눅스 환경에서 내부적으로 Google Cloud Vision API를 사용하고 있는 jar 파일을 'crontab'을 통해 실행했을 때 '~/.bashrc' 파일에 설정된 환경변수를 읽어오지 못하는 경우가 발생하여 환경변수를 읽어오지 못하는 이유와 처리 방법에 대해 정리해 보았습니다.
(Google Cloud Vision API 사용 시 인증키가 필요하며, 해당 인증키의 full path를 GOOGLE_APPLICATION_CREDENTIALS 변수로 '~/.bashrc' 파일에 등록해 둔 상태였습니다.)
crontab 작업 시 환경변수를 불러오지 못하는 이유
cron 작업 시 환경변수를 불러오지 못하는 이유는 결론적으로 'crontab'이 'non-interactive(비대화형)' + 'non-login(비로그인)' 셸로 명령어를 실행하기 때문입니다.
예를 들어 사용자가 'SSH 접속'을 하거나 '콘솔 로그인', 'su - 유저명' 방식으로 접속하는 '로그인 셸'의 경우 실행될 때 시스템 전체 설정인 '/etc/profile' 파일과 사용자 개인 설정인 '~/.bash_profile', '~/.profile' 같은 초기화 파일을 읽어서 실행하게 됩니다.
또한 'bash'와 같이 명령 프롬프트를 통해 사용자와 상호작용하는 '대화형 셸'의 경우 역시 '~/.bashrc' 파일을 읽어 그 안에 있는 설정들을 적용하게 되는데요.
정리하자면, cron은 로그인 셸 및 대화형 셸에서 수행되는 초기화작업을 생략하기 때문에 '~/.bashrc'나 '~/.bash_profile' 파일에 설정된 환경변수를 불러오지 못하는 것입니다.
따라서 cron 작업에서 환경변수가 필요한 경우 crontab 내에서 직접 정의하거나 스크립트 내에서 관련 초기화 파일을 명시적으로 source 해주는 방식의 추가적인 설정이 필요합니다.
crontab 작업에서 환경변수를 사용하는 방법
1. crontab 내부에서 직접 환경변수 선언
GOOGLE_APPLICATION_CREDENTIALS=/home/app/account-key.json
10 9 * * * /usr/bin/java -jar /home/app/example.jar
(crontab)
첫 번째는 다음과 같이 crontab 파일 상단에 직접 변수를 선언하는 방법입니다.
cron은 파일 최상단의 변수 선언을 자동적으로 환경변수로 사용하기 때문에 편리하고 안전한 방법입니다.
2. 스크립트 내부에서 환경변수 선언
#!/bin/bash
export GOOGLE_APPLICATION_CREDENTIALS=/home/app/account-key.json
/usr/bin/java -jar /home/app/example.jar
(script.sh)
10 9 * * * /home/app/script.sh
(crontab)
두 번째 방법은 crontab에서는 스크립트 파일만 호출하고 환경변수는 스크립트 내부에 선언하여 처리하는 방법입니다.
해당 방법의 경우 관리가 쉬우며, 스크립트만 직접 실행해도 환경이 유지된다는 장점이 있습니다.
3. 스크립트에서 ~/.bashcr 또는 ~/.bash_profile 수동 로드
#!/bin/bash
source /etc/profile
source ~/.bashrc
/usr/bin/java -jar /home/app/example.jar
(script.sh)
10 9 * * * /home/app/script.sh
(crontab)
실행에 필요한 환경변수가 많은 경우 다음과 같이 '~/.bashrc' 또는 '~/.bash_profile' 파일을 수동으로 로드해서 사용하는 방법도 있습니다. 해당 방법의 경우 경로에 사용되는 '~'가 인식되지 않을 수 있기 때문에 '/home/ubuntu/.bashrc'와 같이 절대경로를 명시해야 할 수 있습니다.
여기까지 crontab 실행 시 환경변수를 읽어오지 못하는 이유와 몇 가지 대표적인 처리 방법에 대해서 정리해 보았습니다.
< 참고 자료 >
https://www.baeldung.com/linux/load-env-variables-in-cron-job
'Programming > Linux' 카테고리의 다른 글
| (linux) 로그 파일 비우기, 로그 파일 내용 삭제 '/dev/ null' (0) | 2024.11.28 |
|---|---|
| (linux) /etc/profile ~/.bash_profile /etc/bashrc ~/.bashrc 환경 파일 내용 정리 (0) | 2024.08.21 |
| 리눅스 vim(vi) 편집기 문자열 치환 명령어 정리 (0) | 2024.08.18 |
| ubuntu jdk tar.gz 설치 방법 (+ update-alternatives란) (0) | 2024.07.24 |
| CentOS MariaDB 오프라인 수동 설치 방법 (tar.gz 파일) (0) | 2024.02.01 |