因工作的原因需要在局域网内多台机器文件互传,均为Linux CentOS系统。此为背景。
scp和rsync 均可实现文件的复制,但相比较,scp占用系统资源较小,rsync速度较快。当小文件众多时,rsync会导致硬盘I/O非常高,而scp基本不影响系统正常使用。可根据需要这俩选其一实现文件复制。
一、scp 命令
scp 是secure copy的缩写,scp是Linux系统下基于ssh登录进行安全的远程文件拷贝命令。
可以实现本地文件复制到远程服务器,也可以将远程文件复制到本地。
1. 从本地复制到远程服务器
- scp -r local_folder remote_username@remote_ip:remote_folder_pwd
将local_folder整个文件夹复制到remote_folder_pwd,将建立remote_folder_pwd/local_folder文件夹
后续需要输入密码,不能使用nohup直接放至后台;- scp -r local_folder/ remote_username@remote_ip:remote_folder_pwd
在local_folder后面加了/,会将该文件夹下的所有文件复制到remote_folder_pwd,但不会建立remote_folder_pwd/local_folder文件夹
2.从远程服务器复制到本地
- scp -r remote_username@remote_ip:remote_folder_pwd local_folder
二、rsync 命令
rsync 是remote sync的缩写。使用rsync备份数据时,不会直接覆盖以前的数据(如果数据已经存在),而是先判断已存在的数据和新数据的差异(默认规则是文件大小或修改时间有差异),只有数据不相同时才会把不相同的部分覆盖。在仅作增量数据的copy时比scp灵活。
一般CentOS默认安装rsync,若使用 rsync -v
提示找不到命令,可使用yum install -y rsync
安装。
1.从本地复制到远程服务器
- rsync -av local_folder remote_username@remote_ip:remote_folder_pwd
或者- rsync -av local_folder remote_username@remote_ip::remote_folder_pwd
2.从远程服务器复制到本地
- rsync -av remote_username@remote_ip:remote_folder_pwd local_folder
或者- rsync -av remote_username@remote_ip::remote_folder_pwd local_folder
单个冒号和双冒号的区别:使用rsync在远程传输数据前,是需要进行登陆认证的,这个过程可使用ssh协议也可以使用rsync协议完成。单冒号(:)使用的是ssh协议;双冒号(::)使用的是rsync协议。
3.只保留源文件的内容
默认情况下,rsync只确保源文件的所有内容(明确排除的文件除外)都复制到目标目录。它不会使两个目录保持不同,并且不会删除文件。如果要使目标目录成为源目录的镜像副本,则使用--delete选项。可删除只存在目标目录,不存在于源目录的文件。
- rsync -av --delete test1/ test2/
若test2中原有文件,但test1中没有,经过此操作,test1和test2文件会完全相同。test1目录一旦做了改变,test2也会随之相应改变。
4.增量备份
增量备份算是一个经常使用的场景了。两台服务器之间进行文件定期备份,无需所有文件都copy一遍,仅复制有变动的文件。
具体做法是,第一次同步是全量备份,所有文件在基准目录里面同步一份。以后每一次同步都是增量备份,只同步源目录与基准目录之间有变动的部分,将这部分保存在一个新的目标目录。这个新的目标目录之中,也是包含所有文件,但实际上,只有那些变动过的文件是存在于该目录,其他没有变动的文件都是指向基准目录文件的硬链接。
--link-dest
参数用来指定同步时的基准目录。
$ rsync -a --delete --link-dest /compare/path /source/path /target/path
上面命令中,--link-dest
参数指定基准目录/compare/path
,然后源目录/source/path
跟基准目录进行比较,找出变动的文件,将它们拷贝到目标目录/target/path
。那些没变动的文件则会生成硬链接。这个命令的第一次备份时是全量备份,后面就都是增量备份了。
三、将scp和rsync后台运行
一般服务器之间复制文件都比较大,为防止误操作,最好在后台运行。但因为需要和远程服务器之间的ssh通讯多是需要密码的,所以不能直接使用nohup 放置于后台。无论是scp还是rsync都可操作如下:
- 1.scp -r remote_username@remote_ip:remote_folder_pwd local_folder
或者
- 输入密码,回车
- Ctrl +z,挂起当前进程;
- bg,让挂起的进程继续进行;
- disown -h 将这个作业忽略HUP信号
后台和前台任务的切换
jobs //查看任务,返回任务编号n;
bg %n //将编号为n的任务转后台运行;
fg %n //将编号为n的任务转前台运行;
Ctrl+z //挂起当前任务;
Ctrl+c //结束当前任务。
disown -h %n //将这个作业忽略HUP信号
scp不支持断点续传,挂起scp进程可能导致数据缺失。倾向于使用rsync。
如果有其他任务需要使用nohup后台运行,但执行时却忘记了使用nohup,也可参照此方法进行设置。
参考:1. Linux之scp命令及后台运行scp