我创建了一个脚本来创建一个mysqldump,将这个转储提交给我的本地Git,然后将这个Git推送到我的bitbucket帐户。当我通过终端(sh script.sh
)运行脚本时,脚本运行正常。我制作了一个Plist文件并添加了它,因此Launchd运行它。
Launchd按照计划每天凌晨3点迅速运行它,并且执行所有命令,除了将本地Git提交推送到bitbucket。我究竟做错了什么?
正如您从我的脚本中看到的,我尝试添加大量日志记录,但我得到的日志记录仍然没有告诉我为什么推送不起作用,只是它不起作用。
所以我的问题是双重的:
我的剧本:
#!/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的身份验证,我在我的钥匙串中使用我的用户名/ pw组合来推送https。
我使用Bitbucket instructions设置了SSH。我创建了一个看起来像这样的ssh.sh脚本(和chmod +x
'它):
#!/bin/sh
exec ssh -i "Users/sara/.ssh" "$@"
我已使用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位于系统和用户文件夹中),它终于在昨晚正确运行。
答案 0 :(得分:0)
您可以设置环境变量GIT_TRACE=1
以使git显示正在执行的命令以及出错的位置。
那就是说,这个脚本没有认证,所以我要继续猜测这就是问题所在。最有可能的是,当您从shell运行脚本时,您的ssh-agent运行时会包含您的密钥。运行launchd时,代理未设置,密钥不在其中一个默认文件中(或受密码保护)。
您可以通过将环境变量GIT_SSH
指向包含以下内容的shell脚本包装来解决此问题:
#!/bin/sh
exec ssh -i "path/to/my/unencrypted/ssh/key" "$@"
不要忘记chmod +x
。