본문 바로가기
Q&A해결2026년 7월 31일1분 읽기

직접 실행하면 잘 되는 스크립트가 crontab에 넣으면 command not found로 죽습니다

c
cron_hyewon
조회 852댓글 4

매일 새벽에 백업 도는 쉘 스크립트를 crontab에 등록했는데, 로그를 보니 node: command not found 랑 aws: command not found 가 찍혀있습니다. 터미널에서 직접 ./backup.sh 하면 아무 문제 없이 잘 돌아가요.

crontab은 이렇게 등록했습니다.

0 3 * * * /home/deploy/backup.sh >> /home/deploy/backup.log 2>&1

스크립트 안에서 node 로 만든 CLI랑 aws cli 를 씁니다. nvm 으로 깐 node라 which node 하면 /home/deploy/.nvm/versions/node/v20.../bin/node 이렇게 나오고요. cron만 되면 왜 얘를 못 찾는 걸까요?

댓글 4

김김영삼3개월 전
cron은 로그인 셸이 아니라서 님이 평소 쓰는 환경을 전혀 물려받지 않습니다. .bashrc나 .bash_profile이 안 읽히고, PATH도 아주 빈약한 기본값(대개 /usr/bin:/bin 정도)만 들어있어요. 그래서 nvm이 PATH에 꽂아주던 node 경로도, aws cli 경로도 cron 세션엔 없어서 command not found가 나는 겁니다. 터미널에선 .bashrc가 nvm을 로드하니 잘 됐던 거고요.

특히 nvm이 골칫거리인데, nvm은 단순히 PATH만 추가하는 게 아니라 셸 함수로 동작해서 비대화형 cron에선 초기화 자체가 안 됩니다. 그러니 스크립트 상단에서 PATH를 직접 세팅하는 게 제일 확실합니다.

export PATH="/home/deploy/.nvm/versions/node/v20.11.0/bin:/usr/local/bin:/usr/bin:/bin"

이렇게 박아두면 cron에서도 node를 찾습니다. aws가 어디 있는지는 which aws 로 실제 경로 확인해서 그 디렉토리도 넣으세요.

디버깅 팁으로, cron 스크립트 맨 위에 env 랑 which node 를 로그로 찍어보면 cron이 실제로 뭘 물려받는지 바로 보입니다. 평소 셸이랑 얼마나 다른지 눈으로 보면 이해가 빨라요.
ccron_hyewon(guest)3개월 전
PATH 박으니 node랑 aws는 찾습니다. 근데 이번엔 스크립트가 config.json을 못 찾는다고 하네요. 상대경로로 ./config.json 이렇게 읽고 있거든요. cron이 홈 디렉토리에서 실행되는 게 아닌 건가요? cd 를 스크립트 안에 넣어야 하나요?
김김영삼3개월 전
cron 작업의 작업 디렉토리는 보통 그 사용자의 홈(/home/deploy)입니다. 근데 님 스크립트가 './config.json' 을 스크립트가 놓인 폴더 기준이라고 생각하고 있다면 어긋나요. 상대경로는 항상 '현재 작업 디렉토리(cwd)' 기준이지 '스크립트 파일 위치' 기준이 아닙니다. 터미널에선 마침 그 폴더에서 실행해서 우연히 맞았던 거고요.

둘 중 하나로 고정하세요. 스크립트 맨 위에서 자기 위치로 이동하는 게 제일 깔끔합니다.

cd "$(dirname "$0")"

이러면 스크립트가 어디서 불려도 자기 폴더로 가서 상대경로가 맞습니다. 아니면 config 경로 자체를 절대경로로 박으시고요. 크론 스크립트는 웬만하면 cwd에 의존하지 말고 절대경로 아니면 dirname 방식으로 짜는 게 나중에 안 터집니다.
ccron_hyewon(guest)3개월 전
dirname 으로 이동하게 하니 완벽히 돌아갑니다. 로컬에서 잘 되던 게 cron에서 다 깨지는 이유를 이제 알겠네요. 두 번이나 자세히 감사합니다 🙏
Ctrl+Enter로 등록