我想下载多个文件并将它们保存到其名称的md5和中:
cat list | parallel -j4 "md5=$(wget -O - {} | tee tmpfile_{#} | md5sum | cut -d ' ' -f 1); mv tmpfile_{#} $md5"
Run Code Online (Sandbox Code Playgroud)
但问题是 bash 似乎在执行并行替换之前执行 wget 的东西{}...所以 wget 想要从http://{}
那么parallel如何在子命令执行之前替换它的变量呢?
我正在尝试执行简单的“并行”命令
parallel -S server1,server2,server3 echo "Number {}: Running on \`hostname\`" ::: 1 2 3
Run Code Online (Sandbox Code Playgroud)
它要求我提供三台服务器的密码,但什么也没发生。通常 ssh 连接到这些服务器工作正常。
当我登录到其中一台服务器时,系统警告我登录“notty”失败。
如何才能实现正确的执行呢?
我有一个通过命令行(Ubuntu)运行的 bash 程序,如下所示:
./extract_field.sh ABC001
Run Code Online (Sandbox Code Playgroud)
ABC001我想从给定的 shapefile 中提取的字段 ID在哪里。
要使用多个 ID 运行此脚本,我首先在list.txt文件中每行保存一个 ID :
ABC001
ABC014
ABC213
ABC427
Run Code Online (Sandbox Code Playgroud)
然后使用parallel以下方法调用脚本:
parallel -a list.txt ./extract_field.sh
Run Code Online (Sandbox Code Playgroud)
到现在为止还挺好。
但是,我计划进行更改,extract_field.sh因此需要两个参数而不是一个参数。如果我只是将文本文件更改为每行容纳两个参数,上述工作流程是否仍然有效?
ABC001 arg2a
ABC014 arg2b
ABC213 arg2c
ABC427 arg2d
Run Code Online (Sandbox Code Playgroud)
通过这种变化,我希望parallel -a list.txt ./extract_field.sh表现得像
./extract_field.sh ABC001 arg2a
./extract_field.sh ABC014 arg2b
Run Code Online (Sandbox Code Playgroud)
等等。
那正确吗?
我可以在询问之前先对其进行测试,但我决定先询问,因为脚本中的此更改可能需要我几个小时才能完成(尽管这听起来像是一个简单的更改)。
我正在学习 GNU 并行并尝试了以下操作:
$ for i in {1.txt,2.txt}; do time wc -l $i; done
100 1.txt
real 0m0.010s
user 0m0.000s
sys 0m0.010s
10000012 2.txt
real 0m0.069s
user 0m0.050s
sys 0m0.018s
Run Code Online (Sandbox Code Playgroud)
然后我用 重新运行上述命令parallel,但它减慢了速度。为什么?
$ for i in {1.txt,2.txt}; do time parallel --nonall wc -l $i; done
100 1.txt
real 0m0.325s
user 0m0.192s
sys 0m0.042s
10000012 2.txt
real 0m0.305s
user 0m0.220s
sys 0m0.043s
Run Code Online (Sandbox Code Playgroud) 我想加快我的归档操作,我通常会进行 23 GiB(一张蓝光)备份。
我发现了这个:How to do Large fileparallel Encryption using GnuPG and GNU parallel?
因为我根本不理解这段代码(从未使用过parallel):
tar --create --format=posix --preserve-permissions --same-owner --directory $BASE/$name --to-stdout . |
parallel --pipe --recend '' --keep-order --block-size 128M "xz -9 --check=sha256 |
gpg --encrypt --recipient $RECIPIENT;echo bLoCk EnD" |
pv > $TARGET/$FILENAME
Run Code Online (Sandbox Code Playgroud)
我想问一下有没有人可以帮我解析一下。谢谢。
我尝试使用 GNU 并行freesurfer preproc运行命令 recon-all我有一个 bash 患者列表数组,可以同时运行 8 个专利:
root@4d8896dfec6c:/tmp# echo ${ids[@]}
G001 G002 G003 G004 G005 G006 G007 G008
Run Code Online (Sandbox Code Playgroud)
并尝试使用命令运行:
echo ${ids[@]} | parallel --jobs 28 recon-all -s {.} -all -qcache
Run Code Online (Sandbox Code Playgroud)
它不起作用,因为我想我需要在 ls 表示中使用 bash 数组,例如:
ls ${ids[@]} | parallel --jobs 28 recon-all -s {.} -all -qcache
Run Code Online (Sandbox Code Playgroud)
我怎样才能做到这一点?
我正在运行 GNU 并行,一段时间后我得到:
parallel: Warning: no more file handles Raising ulimit -n or etc/security/limits.conf may help.
Run Code Online (Sandbox Code Playgroud)
为了克服这个问题,应该向并行命令添加什么参数?
我更改limits.conf为,unlimited但后来我无法使用sudo或登录我的盒子,同样的问题root就像这里ssh
这是我正在使用的代码片段。我有 2 个文件,第一个带有密码,第二个带有主机。
passPasswords_and_hosts() {
`sudo sshpass -p "$1" ssh -o ConnectTimeout=2 root@"$2" -o StrictHostKeyChecking=no "$command_linux"`
}
export -f testone
export -p command_linux
parallel --tag -k passPasswords_and_hosts :::: "$passwords" "$linux_hosts"
Run Code Online (Sandbox Code Playgroud) gnu-parallel ×7
bash ×2
bash-array ×1
command-line ×1
gpg ×1
password ×1
quoting ×1
remote ×1
shell-script ×1
ssh ×1
tar ×1
ulimit ×1
variable ×1
wget ×1
xz ×1