使用Snakemake跨服务器并行复制多文件的可行性及权限问题
用Snakemake实现跨服务器并行文件复制的方案及问题解决
可以用Snakemake实现跨服务器并行文件复制,你当前遇到的权限错误和代码逻辑问题直接相关,先梳理问题再给出修正方案:
你的代码存在的问题
- 路径逻辑混淆:
workdir设置为/path/on/server2/,如果Snakemake运行在server1上,本地根本不存在这个路径,Snakemake尝试检查目录权限时会直接触发错误;另外rule rename的input和output逻辑搞反,且input写的是server2的本地路径,Snakemake会默认检查本地是否存在该文件,自然报错。 - 私钥权限不符合要求:scp要求私钥文件权限必须是
600(仅所有者可读可写),如果你的/path/to/private_key.txt权限是755这类宽权限,会被ssh拒绝,触发权限错误。 - 远程/本地权限不匹配:ubuntu用户在server2上可能没有
/path/on/server2/{sample}的读取权限,或者server1上的运行用户没有/path/on/server1/的写入权限。
修正后的Snakemake代码
假设你在server1上运行Snakemake,要从server2复制文件到server1:
SAMPLES = ["BOB", "STEVE", "JOHN"] # 最终要生成的文件是server1上的路径 rule all: input: expand("/path/on/server1/{sample}", sample=SAMPLES) rule copy_from_server2: output: "/path/on/server1/{sample}" params: remote_path = "/path/on/server2/{sample}", server = "ubuntu@xxx.xxx.xxx.xxx", key = "/path/to/private_key.txt" # 用dummy文件避免Snakemake检查远程input的存在 input: touch("{sample}.dummy") shell: """ # 先确保私钥权限符合要求 chmod 600 {params.key} scp -i {params.key} -r {params.server}:{params.remote_path} {output} """
运行时指定并行数即可实现并行复制:
snakemake -j 3
替代方案
如果不想用Snakemake,这些工具也能实现并行复制:
- parallel + scp:直接用GNU Parallel批量并行执行scp命令
chmod 600 /path/to/private_key.txt parallel scp -i /path/to/private_key.txt -r ubuntu@xxx.xxx.xxx.xxx:/path/on/server2/{} /path/on/server1/ ::: BOB STEVE JOHN - parallel + rsync:rsync比scp更适合大文件/增量复制,结合parallel实现并行
parallel rsync -avz -e 'ssh -i /path/to/private_key.txt' ubuntu@xxx.xxx.xxx.xxx:/path/on/server2/{} /path/on/server1/ ::: BOB STEVE JOHN - Ansible:用synchronize模块批量并行同步,适合多机器管理场景,编写简单playbook即可实现
- Python脚本:用paramiko或scp库编写多线程/多进程脚本,可灵活控制复制逻辑和异常处理
内容的提问来源于stack exchange,提问作者user3224522
相关产品推荐
相关产品推荐

