多rsync并行提速脚本异常,求有效优化方案
并行rsync提速方案及问题解决
为什么你的nohup后台方案失效?
进程状态显示为T(停止状态),通常是因为rsync后台运行时,终端的标准输入/输出未正确处理,导致进程被终端信号(如SIGTSTP)挂起。虽然可以通过重定向IO临时解决,但更可靠的是用专门的并行任务管理方式。
可行的并行rsync方案
1. 用Python并发库管控并行任务
利用concurrent.futures.ThreadPoolExecutor(IO密集型任务优先用线程池)控制5个并行rsync进程,避免shell后台的不可控问题:
import subprocess from concurrent.futures import ThreadPoolExecutor def sync_directory(dir_name): rsync_cmd = 'rsync --partial --append --progress -av root@my.hopto.org:"/media/{}" ./test/'.format(dir_name) print(f"启动同步任务: {rsync_cmd}") result = subprocess.run(rsync_cmd, shell=True) if result.returncode == 0: print(f"目录 {dir_name} 同步完成") else: print(f"目录 {dir_name} 同步失败,返回码: {result.returncode}") # 获取远程服务器/media/下的目录列表 ls_cmd = "ssh root@my.hopto.org ls /media/" output = subprocess.run(ls_cmd, shell=True, capture_output=True, text=True).stdout dir_list = output.splitlines() # 启动线程池,最多并行5个任务 with ThreadPoolExecutor(max_workers=5) as executor: # 只处理前6个目录(索引0-5) for idx, dir_name in enumerate(dir_list): if idx > 5: break executor.submit(sync_directory, dir_name)
这个方案由Python原生管控并行任务,能直观监控每个任务的完成状态,无需依赖shell后台机制。
2. 用GNU Parallel批量启动并行rsync
如果不想写Python脚本,直接用GNU Parallel工具可快速实现并发控制:
# 获取远程前6个目录,并行启动5个rsync任务 ssh root@my.hopto.org ls /media/ | head -6 | parallel -j 5 rsync --partial --append --progress -av root@my.hopto.org:"/media/{}" ./test/
-j 5:指定最大并发数为5head -6:过滤出前6个目录(和你原脚本逻辑一致)- Parallel会自动分配任务,确保同时运行的进程不超过5个
3. 优化rsync单进程速度(配合并行效果更好)
即使启用并行,优化rsync本身的参数也能进一步提升单进程传输效率:
- 调整块大小:大文件传输时,用
--block-size=10M(默认约700KB)减少网络交互次数 - 启用压缩:传输文本/未压缩文件时,添加
-z参数(或在ssh层面用--rsh='ssh -C',避免重复压缩) - 稳定ssh连接:用
--rsh='ssh -o TCPKeepAlive=yes -o ServerAliveInterval=30'防止连接超时断开 - 跳过增量检查(首次传输):如果是第一次同步无历史文件,添加
--whole-file直接传输整个文件,节省校验时间 - 精简同步参数:不需要权限/时间同步时,去掉
-a的部分特性,改用-r(递归)+按需参数
修复原nohup方案(应急用,不推荐)
如果坚持用shell后台方式,需要重定向rsync的标准输入/输出到/dev/null,避免终端IO导致进程挂起:
cmd = 'nohup rsync --partial --append --progress -av root@my.hopto.org:"/media/{}" ./test/ > /dev/null 2>&1 &'.format(a)
但这种方式无法监控任务状态,出现问题难以排查,优先推荐前两种方案。
内容的提问来源于stack exchange,提问作者whitebear
相关产品推荐
相关产品推荐

