cronjob을 통해 원격 VPS를 정기적으로 백업하고 싶습니다. 두 시스템 모두 데비안 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 키의 암호를 삭제하여이 작업을 수행했습니다. 이상적으로는 암호를 다시 추가해도 작동하는 솔루션을 원합니다.
Cron에 의해 실행되는 명령은 매우 기본적인 실행 환경과 경로 설정을 가지고 있으며, 일반적인 사용자 ID로 명령이나 스크립트를 테스트하는 경우가 자주 발생합니다. 그런 다음 Cron에서 실행할 때 실패합니다.
내 보낸 환경 변수는 종종 간과됩니다. 배포 전에 최종 테스트로 하위 셸을 사용하여 완전히 축소 된 환경에서 루트로 최종 테스트를 수행하는 것이 현명합니다. 언제든지 로그 파일에 env를 인쇄하는 일회성 cronjob을 추가 할 수 있습니다. 이렇게하면 Cron이 호출 할 때 명령이 실행될 정확한 조건을 에뮬레이트 할 수 있습니다. 두 번째 장점은 오류가 발생하는 경우 터미널에 표시 될 수 있다는 것입니다.이 방법으로 디버깅하는 것이 더 쉽습니다.
스크립트에 할당 된 변수가 내보내지지 않은 것처럼 보이므로 SSH가이를 선택하지 않습니다.
스크립트에서 절대 파일 경로를 사용하는 것도 중요합니다. 디렉토리를 구체적으로 변경하지 않는 한 특정 디렉토리에 있다고 가정 할 수 없으며, 앞서 언급 한 일회성 테스트 스크립트에서 작업 디렉토리를 인쇄하는 것도 도움이됩니다. 이 점에서 모든 분포가 동일하다고 가정 할 수는 없습니다. 확인하는 것은 확실히 아프지 않습니다.
이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.
침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제
몇 마디 만하겠습니다