我为我的电脑编写了备份脚本。备份方案如下:
root下的整个目录每天两次(上午3点和上午12点)绑定到tar.gz,此档案将使用gdrive app上传到google-drive。每凌晨3点。
这是脚本
#!/bin/bash
#Program: arklab backup script version 2.0
#Author: namil son
#Last modified date: 160508
#Contact: 21100352@handong.edu
#It should be executed as a super user
export LANG=en
MD=`date +%m%d`
TIME=`date +%y%m%d_%a_%H`
filename=`date +%y%m%d_%a_%H`.tar.gz
HOST=$HOSTNAME
backuproot="/local_share/backup/"
backup=`cat $backuproot/backup.conf`
gdriveID="blablabla" #This argument should be manually substituted to google-drive directory ID for each server.
#Start a new backup period at January first and June first.
if [ $MD = '0101' -o $MD = '0601' ]; then
mkdir $backuproot/`date +%y%m`
rm -rf $backuproot/`date --date '1 year ago' +%y%m`
echo $backuproot/`date +%y%m` > $backuproot/backup.conf #Save directory name for this period in backup.conf
backup=`cat $backuproot/backup.conf`
gdrive mkdir -p $gdriveID `date +%y%m` > $backup/dir
awk '{print $2}' $backup/dir > dirID
rm -f $backup/dir
fi
#make tar ball
tar -g $backup/snapshot -czpf $backup/$filename / --exclude=/tmp/* --exclude=/mnt/* --exclude=/media/* --exclude=/proc/* --exclude=/lost+found/* --exclude=/sys/* --exclude=/local_share/backup/* --exclude=/home/* \
--exclude=/share/*
#upload backup file using gdrive under the path written in dirID
if [ `date +%H` = '03' ]; then
gdrive upload -p `cat $backup/dirID` $backup/$filename
gdrive upload -p `cat $backup/dirID` $backup/`date --date '15 hour ago' +%y%m%d_%a_%H`.tar.gz
fi
这是问题!
在crontab上运行此脚本时,除了将tar ball上传到google-drive之外,它的效果非常好,但是在手动运行脚本时,整个脚本运行正常。在crontab上运行时,只有上传过程无效!
有人能帮助我吗?
Crontab条目是这样的:
0 3,12 * * * sh /local_share/backup/backup2.0.sh &>> /local_share/backup/backup.sh.log
答案 0 :(得分:2)
我有同样的情况。 这是我的解决方案
将命令gdrive更改为绝对路径更改为gdrive命令
示例:
不要像这样设置cron
0 1 * * * gdrive upload abc.tar.gz
使用绝对路径
0 1 * * * /usr/local/bin/gdrive upload abc.tar.gz
它将完美地运作
答案 1 :(得分:1)
我有完全相同的问题,但有细微差别。我在CentOS系统上使用gdrive。安装很好。作为root,我设置了gdrive。从命令行,'驱动器列表'工作得很好。我使用以下博客文章来设置gdrive:
http://linuxnewbieguide.org/?p=1078
我写了一个PHP脚本来备份一些目录。当我从命令行以root身份运行PHP脚本时,一切正常并上传到Google云端硬盘。
所以我扔了:
1 1 * * * php /root/my_backup_script.php
进入root的crontab。该脚本执行正常,但上传到Google云端硬盘并不正常。我做了一些调试,行:
drive upload --file /root/myfile.bz2
只是没有工作。唯一的命令行返回是一个空字符串。很混乱。我不是unix专家,但我认为当crontab作为用户运行时,它以用户身份运行(在本例中为root)。为了测试,我做了以下,这是非常不安全的,不推荐:
我在/root/.rootpassword
创建了一个root密码的文件chmod 500 .rootpassword
将crontab行更改为:
1 1 * * * cat /root/.rootpassword | sudo -kS php /root/my_backup_script.php
现在它可行,但这是一个可怕的解决方案,因为root密码存储在系统上的纯文本文件中。该文件只能由root读取,但它仍然是一个非常糟糕的解决方案。
我不知道为什么(同样,没有unix专家)我必须让root crontab以sudo命令运行才能使这个工作。我知道问题在于gdrive设置期间生成的gdrive令牌。当crontab运行时,令牌不匹配,上传失败。但是当你以root身份运行crontab sudo并运行php脚本时,它就可以了。
我想到了一种可能的解决方案,它不需要将root密码存储在系统上的文本文件中。我现在很累,并没有尝试过。我已经在这个问题上工作了大约4天,尝试了各种Google Drive备份解决方案......都失败了。它基本上是这样的:
在PHP / Apache解释器中运行gdrive设置。这将(可能)将gdrive令牌设置为apache。例如:
在/home/public_html/gdrive_setup.php创建一个PHP脚本。该文件需要逐步完成整个gdrive和令牌设置。
在浏览器中运行脚本,获取gdrive并设置令牌。
测试gdrive,写一个类似的PHP脚本:
$cmd = exec("drive list");
echo $cmd;
另存为gdrive_test.php并在浏览器中运行。如果它输出你的谷歌驱动器文件,它正在工作。
在php中编写备份脚本。将它放在一个不可索引的Web目录中,并像2DJAj23DAJE123.php一样随机调用它
现在,无论何时在Web浏览器中提取2DJAj23DAJE123.php,您的备份都应该运行。
最后,编辑root的crontab并添加:
1 1 * * * wget http://my-website.com/non-indexable-directory/2DJAj23DAJE123.php >/dev/null 2>&1
理论上这应该有用。没有密码存储。唯一的安全漏洞是,如果他们执行2DJAj23DAJE123.php,其他人可能会运行您的备份。
可以添加进一步的检查,例如在执行之前检查2DJAj23DAJE123.php开始时的系统时间并确保它与crontab运行时匹配。如果时间不匹配,只需退出脚本并不执行任何操作。
以上都是理论而未经过测试。我认为它应该有效,但我对此问题感到非常厌倦。
我希望这有用而且不会过于复杂,但Google Drive IS 很复杂,因为他们今年早些时候在身份验证方法中进行了切换。您在网上找到的很多帖子/博客文章都无法使用。
答案 2 :(得分:0)
我遇到了同样的问题,并通过指示drive
命令文件的位置来修复。
前:
/usr/sbin/drive upload --file xxx..
答案 3 :(得分:0)
有时会由于gdrive的配置路径而发生此问题,这意味着gdrive无法找到默认配置,因此为了避免此类问题,我们添加了--config
标志
gdrive upload --config /home/<you>/.gdrive -p <google_drive_folder_id> /path/to/file_to_be_uploaded