Last active
July 16, 2018 10:17
-
-
Save horsley/6094304 to your computer and use it in GitHub Desktop.
rsync shell 拉取模式,其实除非你要用inotify做实时备份,否则定时备份根本就用不着用rsync daemon,直接通过shell拉取就好。当然要配好无密码的公约密码登录,让备份服务器可以访问到待备份的数据。
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#!/usr/sbin/php | |
<?php | |
/* | |
* Rsync备份脚本 | |
*/ | |
set_time_limit(0); | |
date_default_timezone_set('Asia/Shanghai'); | |
define('CONF_SRC', 'backup_src'); | |
define('CONF_DST', 'backup_dest'); | |
define('CONF_CLEAR', 'backup_clear'); | |
define('CONF_DSTNAME', 'backup_dest_dirname'); | |
define('TODAY_STR', date('Y-m-d', strtotime('now'))); | |
define('YESTERDAY_STR', date('Y-m-d', strtotime('-1 day'))); | |
define('COPY_CMD', 'cp -R -u '); | |
define('RSYNC_CMD', 'rsync -ahuzP --delete '); | |
define('RSYNC_OUTPUT_FILTER', " | sed '0,/^$/d'"); //过滤输出中间的文件列表 | |
define('MKDIR_CMD', 'mkdir -p '); | |
define('RM_CMD', 'rm -rf '); | |
//备份任务配置信息数组 | |
$config = array( | |
/* | |
'任务名' => array ( | |
CONF_SRC => '要备份的文件或目录的源地址,是目录的话要在末尾加斜杠', | |
CONF_DST => '存放备份的本地目录的地址', | |
CONF_CLEAR => '(可选)清除一定时间前的备份', | |
CONF_DSTNAME => '(可选)备份的文件或目录的名字,不选用则默认使用CONF_SRC里的文件名' | |
), | |
*/ | |
); | |
//下面开始是备份步骤 | |
foreach ($config as $backup_item => $backup_conf) { | |
$local_filename = empty($backup_conf[CONF_DSTNAME]) ? basename($backup_conf[CONF_SRC]) : $backup_conf[CONF_DSTNAME]; | |
$path_yesterday = $backup_conf[CONF_DST] . $local_filename . '/' . YESTERDAY_STR; | |
$path_today = $backup_conf[CONF_DST] . $local_filename . '/' . TODAY_STR; | |
$path_old = $backup_conf[CONF_DST] . $local_filename . '/' . date('Y-m-d', strtotime($backup_conf[CONF_CLEAR])); | |
echo "=============================================================================\n"; | |
echo " Backup job [{$backup_item}] start!\n"; | |
echo " Source: {$backup_conf[CONF_SRC]}\n"; | |
echo " Destination: {$path_today}\n"; | |
echo "=============================================================================\n\n"; | |
system(MKDIR_CMD . $path_today); | |
if (file_exists($path_yesterday)) { | |
echo "Found yesterday's backup, copying for base...\n"; | |
system(COPY_CMD . $path_yesterday . '/.' . ' ' . $path_today); //复制目录内的内容,而不要最顶级的目录 | |
echo "Copy complete!\n"; | |
} | |
echo "Now start to rsync files..\n"; | |
system(RSYNC_CMD . $backup_conf[CONF_SRC] . ' ' . $path_today . ' ' . RSYNC_OUTPUT_FILTER); | |
echo "Rsync complete\n"; | |
if (!empty($backup_conf[CONF_CLEAR]) && file_exists($path_old)) { | |
echo "Clearing old backups\n"; | |
system(RM_CMD . $path_old); | |
echo "Clearing complete\n"; | |
} | |
echo "Backup job [{$backup_item}] done!\n\n"; | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment