매일 새벽에 백업 도는 쉘 스크립트를 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
특히 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이 실제로 뭘 물려받는지 바로 보입니다. 평소 셸이랑 얼마나 다른지 눈으로 보면 이해가 빨라요.
둘 중 하나로 고정하세요. 스크립트 맨 위에서 자기 위치로 이동하는 게 제일 깔끔합니다.
cd "$(dirname "$0")"
이러면 스크립트가 어디서 불려도 자기 폴더로 가서 상대경로가 맞습니다. 아니면 config 경로 자체를 절대경로로 박으시고요. 크론 스크립트는 웬만하면 cwd에 의존하지 말고 절대경로 아니면 dirname 방식으로 짜는 게 나중에 안 터집니다.