Skip to content

Instantly share code, notes, and snippets.

@horsley
Last active July 16, 2018 10:17
Show Gist options
  • Star 1 You must be signed in to star a gist
  • Fork 1 You must be signed in to fork a gist
  • Save horsley/6094304 to your computer and use it in GitHub Desktop.
Save horsley/6094304 to your computer and use it in GitHub Desktop.
rsync shell 拉取模式,其实除非你要用inotify做实时备份,否则定时备份根本就用不着用rsync daemon,直接通过shell拉取就好。当然要配好无密码的公约密码登录,让备份服务器可以访问到待备份的数据。
#!/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