在 Slurm 集群上,大体量的tar | ssh管道传输非常容易被系统“杀掉”,即使你人没断线,后台 I/O / 网络 / login node 的限额也会把进程 SIGKILL,导致tar 包尾部缺失 →Unexpected EOF。
例如,在Slurm 集群上迁移 conda 环境(几十 GB):
❌ 不推荐:
tar -czf(压缩太慢、CPU+IO重)tar | ssh(login node 很容易 kill)单次
scp(不支持断点)
✅推荐靠谱方案:rsync + --partial + --inplace
具体做法:rsync+ 断点续传
这是HPC 官方推荐方式,假设源服务器服务端口为3022,目的服务器服务端口为2022。
在 2022 端口(源)执行:
rsync -avh \ --partial \ --inplace \ --delete \ --numeric-ids \ --progress \ -e "ssh -p 3022" \ #连接目的服务器端口执行命令 /home/user/miniconda3/envs/my_env/ \ #源服务器文件夹/文件地址 lzh@209.167.43.117:/home/lzh/miniconda3/envs/my_env/ #目的服务器目的地址为什么这个一定成功?
--partial:中断不丢数据--inplace:避免重复写(大文件关键)rsync逐文件校验,不会生成损坏状态
即使被 Slurm 杀掉,重新执行同一条命令会从断点继续,直至传完文件。
💡你可以反复跑这条命令,直到命令很快结束,传输文件列表为空,仅sent少量Bytes(表示没有文件可传,仅发送一些控制信息),意味着文件传完,如下:
sending incremental file list share/gdb/auto-load/home/ sent 3.68M bytes received 7.92K bytes 19.17K bytes/sec total size is 8.48G speedup is 2,298.80 (DRY RUN)