Parallel搭配bbcp传文件报-x参数缺值错误求解
问题:Parallel并行调用bbcp时触发-x参数未赋值报错
搭配GNU Parallel批量并行执行bbcp文件传输任务时出现参数解析错误,完全相同的bbcp命令脱离Parallel直接执行可正常运行。
复现命令
cat testfiles.log | parallel --will-cite -j 5 bbcp -4 c -r -z -Vv -P 2 -S "ssh -x -a -oFallBackToRsh=no %I -l %U %H module load bbcp; bbcp" {} ./testing_parallel/
报错输出
bbcp: /source/path is a directory. bbcp: Network is unreachable unable to connect to port [::ffff:IP]:PortNumber bbcp: Unable to allocate more than 0 of 4 data streams. bbcp: Accept timed out on port PortNumber bbcp: Unable to allocate more than 0 of 4 data streams. Usage: bbcp [Options] [Inspec] Outspec Options: [-a [dir]] [-A] [-b [+]bf] [-B bsz] [-c [lvl]] [-C cfn] [-D] [-d path] [-e] [-E csa] [-f] [-F] [-g] [-h] [-i idfn] [-I slfn] [-k] [-K] [-L opts[@logurl]] [-l logf] [-m mode] [-n] [-N nio] [-o] [-O] [-p] [-P sec] [-r] [-R [args]] [-q qos] [-s snum] [-S srcxeq] [-T trgxeq] [-t sec] [-v] [-V] [-u loc] [-U wsz] [-w [=]wsz] [-x rate] [-y] [-z] [-Z pnf[:pnl]] [-4 [loc]] [-~] [-@ {copy|follow|ignore}] [-$] [-#] [--] I/Ospec: [user@][host:]file bbcp: Value not specified for '-x'.
问题根因
报错本质是GNU Parallel的参数拆分逻辑和bbcp的参数解析规则冲突:
-S参数内的SSH命令带有-x参数(作用为关闭SSH X11转发),Parallel处理嵌套引号的长参数时出现拆分错位,把属于SSH的-x错误识别成bbcp自身的-x参数——bbcp的-x作用是设置传输速率限制,必须传入数值,因此触发“-x参数未指定值”的报错。- 输出中出现的目录识别错误、网络不可达、数据流分配失败等问题,全都是参数错位后bbcp读取到错误入参导致的连带报错。
- 原命令中
-4 c存在笔误:-c是bbcp的校验级别参数,需要加短横线前缀,和代表强制IPv4的-4参数分开,这个笔误也会加重参数错位问题。
解决方法
按以下顺序排查修复:
- 第一优先级:给Parallel增加
-q参数,强制其原样传递后续命令的所有参数,不做额外的拆分处理,修正笔误后的命令如下:
cat testfiles.log | parallel --will-cite -j 5 -q bbcp -4 -c -r -z -Vv -P 2 -S "ssh -x -a -oFallBackToRsh=no %I -l %U %H module load bbcp; bbcp" {} ./testing_parallel/
- 如果加
-q后仍存在参数解析问题,就把单文件传输逻辑封装成Shell函数,导出后交给Parallel调用,彻底规避引号嵌套导致的参数拆分问题:
# 定义单文件传输函数 transfer_file() { bbcp -4 -c -r -z -Vv -P 2 -S "ssh -x -a -oFallBackToRsh=no %I -l %U %H module load bbcp; bbcp" "$1" ./testing_parallel/ } # 导出函数供Parallel子进程调用 export -f transfer_file # 执行并行传输 cat testfiles.log | parallel --will-cite -j 5 transfer_file {}
- 正式执行前可以先给Parallel加上
--dry-run参数,打印所有待执行的完整命令,和手动可正常运行的命令逐字符对比,确认参数无错位、无缺失后再去掉--dry-run实际执行。
内容的提问来源于stack exchange,提问作者ps5460
相关产品推荐
相关产品推荐

