cronjob을 통해 정기적으로 원격 VPS를 백업하고 싶습니다. 두 시스템 모두 Debian 10을 실행합니다. 나는주의를 기울여 왔습니다.이 가이드그리고 내 맘대로 조정했다. 스크립트의 관련 부분:
/root/.local/bin/backup
#!/bin/bash
SSH_AUTH_SOCK=$(gpgconf --list-dirs agent-ssh-socket)
rsync -avzAHXh -e ssh root@[someIP]:/path/to/remote/dir /path/to/local/dir \
|| { echo "rsync died with error code $?"; exit 1; }
터미널에서 실행하면 모든 것이 잘 작동합니다. 그러나 cronjob을 통해 실행하면 다음과 같습니다.
crontab -u root -e
# m h dom mon dow command
0 6 * * * /root/.local/bin/backup >> /var/log/backup 2>&1
그런 다음 /var/log/backup
다음이 표시됩니다.
root@[someIP]: Permission denied (publickey).^M
rsync: connection unexpectedly closed (0 bytes received so far) [Receiver]
rsync error: error in rsync protocol data stream (code 12) at io.c(235) [Receiver=3.1.3]
rsync died with error code 12
cronjob에 어떤 문제가 있었으며 어떻게 해야 합니까?
추신: 여기에서 작동시키기 위해 사용하고 있는 gpg 키의 비밀번호를 제거했습니다. 이상적으로는 암호를 다시 추가하더라도 작동하는 솔루션을 원합니다.
답변1
Cron이 실행하는 명령에는 매우 기본적인 실행 환경과 경로 설정이 있습니다. 일반적인 실수는 일반 사용자 ID를 사용하여 명령이나 스크립트를 테스트하는 것입니다. 그러면 Cron이 실행하면 실패합니다.
내보낸 환경 변수는 종종 간과됩니다. 배포하기 전에 하위 쉘을 사용하여 완전히 제거된 환경에서 루트로 최종 테스트를 수행하는 것이 현명합니다. 언제든지 해당 환경을 로그 파일에 인쇄하는 일회성 cronjob을 추가할 수 있습니다. 이를 통해 cron이 호출될 때 명령이 실행되는 정확한 조건을 시뮬레이션할 수 있습니다. 두 번째 장점은 오류가 발생하면 터미널에 표시되어 디버깅이 더 쉬워진다는 것입니다.
스크립트에 할당된 변수가 내보내지지 않은 것 같아서 SSH가 이를 선택하지 않습니다.
스크립트에서 절대 파일 경로를 사용하는 것도 중요합니다. 디렉터리를 특별히 변경하지 않는 한 특정 디렉터리에 있다고 가정할 수 없으며, 일회성 테스트 스크립트에서 작업 디렉터리를 인쇄합니다. 앞서 언급한 내용도 도움이 됩니다. 이와 관련하여 모든 분포가 동일하다고 가정할 수는 없습니다. 확인해 보는 것도 나쁘지 않습니다.