2014-06-23 14 views
2

mysqldump를 만들 스크립트를 만들었습니다.이 덤프를 로컬 Git에 커밋 한 다음이 Git을 내 bitbucket 계정으로 푸시합니다. 터미널 (sh script.sh)을 통해 실행하면 스크립트가 제대로 실행됩니다. Plist 파일을 만들어 Launchd가 실행하도록 추가했습니다.스크립트가 Launchd를 통해 실행될 때 Git Push가 작동하지 않습니다.

Launchd는 매일 밤 3시에 계획대로 계획대로 실행하고 로컬 Git 커밋을 bitbucket으로 푸시하는 것을 제외하고는 모든 명령을 잘 실행합니다. 내가 도대체 ​​뭘 잘못하고있는 겁니까?

제 스크립트에서 볼 수 있듯이 많은 로깅을 추가하려고했지만 로깅은 여전히 ​​작동하지 않는 이유를 알려주지 않습니다. 단지 작동하지 않는 것입니다.

그래서 제 질문은 두 가지이다 :

  1. 어떻게 내 로컬 힘내 launchd에 통해 실행 스크립트에서의 Bitbucket 밀어 수 있습니까?
  2. launchd 또는이 스크립트에서 로깅 할 수 있도록 내 스크립트 (또는 다른 곳)에 추가 할 수있는 항목이 무엇이 잘못되었는지 진단 할 수 있습니까?

내 스크립트를

#!/bin/sh 

exec 1> /Library/WebServer/Documents/backup/fulllog 

# echo start message 
echo $(date) "- Backup Script Processing" >> /Library/WebServer/Documents/backup/log 

# navigate to backup dir 
if 
    cd /Library/WebServer/Documents/backup/ 
then 
    echo $(date) "- Successfully navigated to backup dir" >> /Library/WebServer/Documents/backup/log 
else 
    echo $(date) "- Could not locate backup directory" >>  /Library/WebServer/Documents/backup/log 
    exit 0 
fi 

# echo message 
echo $(date) "- Exporting SQL dump" >> /Library/WebServer/Documents/backup/log 

if 
    #dump the db into a .sql file 
    /usr/local/mysql/bin/mysqldump --user=root --password=password --skip-extended-insert library > /Library/WebServer/Documents/backup/library.sql; 
then 
    #echo success message 
    echo $(date) "- SQL dump successful" >> /Library/WebServer/Documents/backup/log 
else 
    #echo error message 
    echo $(date) "- Mysqldump error" >> /Library/WebServer/Documents/backup/log 
    exit 0 
fi 

#add just created mysqldump to git 
if 
    /usr/local/git/bin/git add library.sql 
then 
    echo $(date) "- Backup successfully added to local Git staging" >> /Library/WebServer/Documents/backup/log 
else 
    echo $(date) "- Error adding backup to local Git staging" >> /Library/WebServer/Documents/backup/log 
    exit 0 
fi 

if 
    /usr/local/git/bin/git add log 
then 
    echo $(date) "- Log successfully added to local Git staging" >> /Library/WebServer/Documents/backup/log 
else 
    echo $(date) "- Error adding log to local Git staging" >> /Library/WebServer/Documents/backup/log 
    exit 0 
fi 

if 
    /usr/local/git/bin/git commit -m 'Nightly SQL dump' 
then 
    echo $(date) "- Backup successfully committed to local Git" >> /Library/WebServer/Documents/backup/log 
else 
    echo $(date) "- Error committing backup to local Git" >> /Library/WebServer/Documents/backup/log 
    exit 0 
fi 

if 
    /usr/local/git/bin/git push origin master 
then 
    echo $(date) "- Backup Git Commit successfully pushed to origin master" >> /Library/WebServer/Documents/backup/log 
else 
    echo $(date) "- Backup Git Commit not pushed to origin master" >> /Library/WebServer/Documents/backup/log 
fi 

편집은 추가 : 이 답변 주셔서 감사합니다. 환경 변수 GIT_TRACE=1을 추가했습니다.

스크립트에서 Bitbucket에 대한 인증이 없다는 것이 맞습니다. Keychain에서 username/pw 콤보를 사용하여 https를 푸시했습니다.

Bitbucket instructions을 사용하여 SSH를 설정했습니다. I는 다음과 같이 보이는 ssh.sh 스크립트를 만들었다 (및 chmod +x '는 그것을 D) :

#!/bin/sh 
exec ssh -i "Users/sara/.ssh" "[email protected]" 

export GIT_SSH = /Library/WebServer/Documents/scripts/ssh.sh를 사용하여 변수로서 스크립트를 추가했다.

이 설정을 테스트하여 Bitbucket (터미널을 사용)으로 설정하면 작동하지만 SSH 디렉토리 또는 파일이 존재하지 않는다는 오류가 발생합니다. 나는 ssh-agent가 이미 실행 중이며 launchd를 실행할 때 '존재하지 않습니다'라는 오류로 인해 실패 할 것이기 때문에 지금 만 작동한다고 가정합니다. "~/.ssh"라는 위치를 참조하려고 시도했지만 파일 이름을 포함하면 모든 옵션에서 동일한 오류가 발생합니다.

다음에해야 할 일은 무엇입니까? 내 주요 위치를 어떻게 찾을 수 있도록 참조 할 수 있습니까?

솔루션 : 결국 환경 변수를 사용하지 않았습니다.

나를 위해 작동하게하는 해결책은 SSH (이전에 HTTPS를 사용하고있었습니다)를 활성화하는 것이 었습니다. 결국 나는 덧붙였다

Host bitbucket.org 
StrictHostKeyChecking no 
IdentityFile /Users/sara/.ssh/id_rsa 

내 ~/.ssh/config 파일에 계속해서 암호를 물어 보았 기 때문에. 패스 프레이즈를 완전히 제거하고 싶지는 않았지만 스크립트를 사용 가능하게 만들었습니다. Launchd에서 이중 항목을 지운 후에 (내 plist는 System 폴더와 User 폴더에 모두 있음) 결국 어젯밤에 올바르게 실행되었습니다.

답변

0

환경 변수 GIT_TRACE=1을 설정하여 실행중인 명령과 잘못 된 위치를 표시 할 수 있습니다.

즉,이 스크립트에는 인증이 없으므로 계속해서 문제를 추측 할 것입니다. 대부분 쉘에서 스크립트를 실행할 때 키가 들어있는 ssh-agent가 실행 중일 수 있습니다. launchd를 실행할 때 에이전트가 설정되지 않고 키가 기본 파일 중 하나에 없거나 암호로 보호되어 있습니다.

이 같은 것을 포함하는 쉘 스크립트 래퍼에 환경 변수 GIT_SSH를 지정하여이 문제를 해결할 수 있습니다

#!/bin/sh 
exec ssh -i "path/to/my/unencrypted/ssh/key" "[email protected]" 

chmod +x에 잊지 마세요.

+0

답변 해 주셔서 감사합니다. 나는 이것을 시도했지만, 아직 꽤 일하지는 않았다. 지금 내가 어디에 있는지 원래 질문을 봅니다. 나는 매우 가까이에있다 ... –

+0

디렉토리가 아니라 파일 이름을 가리켜 야한다. 이것이'~/.ssh/id_rsa' 나'~/.ssh/id_dsa'의 기본값이라면 특별한 wrapper와 함께 작동해야합니다. –

+0

죄송합니다. 전체적인 의견을 읽지 못했습니다. 경로의 초기 슬래시가 누락 된 것 같아요.'/ Users/sara/.ssh/id_rsa' 또는 유사해야합니다. –