是的,我知道这是经典。我已经用谷歌搜索了所有内容,但仍然不起作用。我有以下脚本:
#First go to SVN repo folder
cd $svnrepos
# Just make sure we have write access to backup-folder
if [ -d "$bakdest" ] && [ -w "$bakdest" ] ; then
# Now $repo has folder names = project names
for repo in *; do
# do svn dump for each project
echo "Taking backup/svndump for: $repo"
echo "Executing : svnadmin dump $repo > $bakdest/$repo-$bakdate.svn.dump \n"
# Now finally execute the backup
svnadmin dump $repo > $bakdest/$repo-$bakdate.svn.dump
# You can go an extra mile by applying tar-gz compression to svn-dumps
# We also would like to save the dump to remote place/usb
# USB/other directory exists, copy the dump there
echo "Going to copy $repo dump to $baktousb directory...\n"
/usr/bin/scp -v $bakdest/$repo-$bakdate.svn.dump $baktousb/$repo-$bakdate.svn.dump
done
else
echo "Unable to continue SVN backup process."
echo "$bakdest is *NOT* a directory or you do not have write permission."
fi
# End of backup script
echo "\n\n================================="
echo " - Backup Complete, THANK YOU :-]"
一切在 shell 中工作正常,但是当它作为 cron 作业执行时,它根本不执行 scp (但会创建备份)。是的,我有一个空洞的解释。不明白为什么它不起作用。
答案1
问题是您可能ssh-agent
在交互式环境中运行,但不在 cron 中运行,并且您的 ssh 密钥文件名与默认文件名不同。
要解决此问题,您可以在 scp 命令行中显式指定 ssh 密钥,即scp -i $SSH_KEY_FILENAME
或~/.ssh/config
为您的主机指定适当的条目,即:
Host backuphost
IdentityFile SSH_KEY_FILENAME
要测试您的脚本,您可以尝试通过env -i /path/to/your/script
它来运行它,这应该重置您的环境并模仿 cron 环境。
答案2
假设是Linux。
1. 执行 cron 作业的默认 shell 非常有限 ( sh
),使用以下命令启动脚本:
#!/bin/bash
2.在 cron 作业STDOUT
中STDERR
重定向系统邮件。检查你的邮箱。
3.使用此答案中的方法检查您的脚本:https://unix.stackexchange.com/a/56503/16841
4.在 cron 环境中检查 PATH 变量以及您调用的所有二进制文件的位置。位于哪里svnadmin
?使用完整路径名。