parallel来自moreutils是一个很好的工具,除其他外,它可以m在nCPU 上均匀分布独立的任务。有人知道可以为多台机器完成相同任务的工具吗?这样的工具当然不必了解多台机器或网络或类似的概念——我只是在谈论将m任务分配到N 集群中,集群中的i N_i任务并行运行。
今天我使用我自己的 BASH 脚本来完成同样的事情,但是一个更精简和干净的工具会很棒。有人知道吗?
我一直在尝试处理findwith的输出parallel,这反过来又调用了一个shell(需要一些文本替换)。我观察到一些奇怪的行为,我无法真正向自己解释。
在每个目录中有一堆文件,将它们称为file1.xtc, file2.xtc. 其中一些具有诸如file1.part0002.xtc等名称。如果从其传递的文件find具有该*.part000x.*名称,则我需要删除该*.part000x.*位,以便生成的命令类似于
command -f file1.part0001.xtc -s file1.tpr
Run Code Online (Sandbox Code Playgroud)
我使用find和parallel达到这个效果,但是parallel的替换(特别是{.}位)还不够(他们删除了.xtc扩展名,留下了.part0001单独的),所以这是我用来检查输出的命令:
find 1st 2nd 3rd -name '*.xtc' -print0 | parallel -0 sh -c 'name=""; name="{.}"; echo {.} ${name%.*}.tpr'
Run Code Online (Sandbox Code Playgroud)
如果我使用上面的命令,首先声明name并为其分配一个空字符串(或其他任何内容),结果是
file1.part0001 file1.tpr
Run Code Online (Sandbox Code Playgroud)
根据需要(这些是我需要用于命令的名称)。但是,如果我运行这个
find 1st 2nd 3rd -name '*.xtc' -print0 | parallel -0 sh -c 'name="{.}"; echo {.} ${name%.*}.tpr'
Run Code Online (Sandbox Code Playgroud)
结果是:
file1.part0001 .tpr
Run Code Online (Sandbox Code Playgroud)
或者它表现得好像 …
如果我使用 运行命令nice,那么我可以看到它的进程具有预期的 niceness 值:
在一个终端中:
nice sleep 17
Run Code Online (Sandbox Code Playgroud)
在另一个:
$ ps -aoni,comm | grep sleep
10 sleep
Run Code Online (Sandbox Code Playgroud)
但是尝试对GNU 并行(版本20161222,Debian 9.3)做同样的事情,我失败了:
parallel --nice 10 sleep ::: 17
$ ps -aoni,comm | grep sleep
0 sleep
Run Code Online (Sandbox Code Playgroud)
我可能遗漏了一些明显的东西,但是什么?
更新:也许这只是一个错误,因为它适用于旧版本......
我有包含一些 mp4 文件的文件夹,我想从每个文件中并行提取图像并将其另存为:
文件名_编号.bmp
其中文件名是输入文件名
如何使用并行和 ffmpeg 做到这一点
我有一个 bash 功能:
println(){echo "$1" "$2" "$3"}
Run Code Online (Sandbox Code Playgroud)
和
export -f println
Run Code Online (Sandbox Code Playgroud)
我想使用 GNU parallel 来运行 println。该命令应接受以下数组的输入:
a1=(a b c)
a2=(x y)
a3=(z1 z2)
Run Code Online (Sandbox Code Playgroud)
它应该输出以下内容:
a x a3
a y a3
b x a3
b y a3
c x a3
c y a3
Run Code Online (Sandbox Code Playgroud)
哪个命令可以做到这一点?我希望命令如下:
parallel ... println ... a1 ... a2 .... a3
Run Code Online (Sandbox Code Playgroud)
谢谢!
ls *.txt | parallel 'echo Starting on file {}; mkdir {.}; cd {.}; longCMD3 ../{} > /dev/null; echo Finished file {}'
Run Code Online (Sandbox Code Playgroud)
这个 liner 部分工作,除了 longCMD3 需要大约 3 分钟,但第一和第二个 echo 命令几乎同时打印。我试过放入
wait
Run Code Online (Sandbox Code Playgroud)
在最后的回声之前,但这没有区别。
如何确保仅在 longCMD3 完成后才打印最终回声?
这是一个例子
假设我只有 4 个内核:
ls
foo1.txt foo2.txt foo3.txt foo4.txt foo5.txt foo6.txt
Run Code Online (Sandbox Code Playgroud)
我的期望:
Starting on file foo1.txt
Starting on file foo2.txt
Starting on file foo3.txt
Starting on file foo4.txt
Run Code Online (Sandbox Code Playgroud)
那么 longCMD3 至少需要 2 分钟才能完成其中一个文件
Finished file foo1.txt
Starting on file foo5.txt
Run Code Online (Sandbox Code Playgroud)
但我得到的是:
Starting on file foo1.txt …Run Code Online (Sandbox Code Playgroud) 我有一个目录
~/root/
|-- bar
|-- eggs
|-- foo
|-- hello.txt
|-- script.sh
`-- spam
4 directories, 2 files
Run Code Online (Sandbox Code Playgroud)
find . -type d在~/root/收益中发行
.
./spam
./eggs
./bar
./foo
Run Code Online (Sandbox Code Playgroud)
然而,发行find . -type d | parallel "echo {}" ::: *收益率
bar
eggs
foo
hello.txt
script.sh
spam
Run Code Online (Sandbox Code Playgroud)
为什么非目录hello.txt和script.sh管道在这里?
我无法理解并行命令是如何工作的。
我需要运行这个简单的命令:(100 次)
curl https://jsonplaceholder.typicode.com/todos/1
curl https://jsonplaceholder.typicode.com/todos/2
curl https://jsonplaceholder.typicode.com/todos/3
...
curl https://jsonplaceholder.typicode.com/todos/100
Run Code Online (Sandbox Code Playgroud)
end 将输出重定向到名称如下的文件:
1.txt
2.txt
3.txt
....
100.txt
Run Code Online (Sandbox Code Playgroud) 我在 Linux 系统上有这样的文件:
10S1_S5_L002_chrm.fasta SRR3184711_chrm.fasta SRR3987378_chrm.fasta SRR4029368_chrm.fasta SRR5204465_chrm.fasta SRR5997546_chrm.fasta
13_S7_L003_chrm.fasta SRR3184712_chrm.fasta SRR3987379_chrm.fasta SRR4029369_chrm.fasta SRR5204520_chrm.fasta SRR5997547_chrm.fasta
14_S8_L003_chrm.fasta SRR3184713_chrm.fasta SRR3987380_chrm.fasta SRR4029370_chrm.fasta SRR5208699_chrm.fasta SRR5997548_chrm.fasta
17_S4_L002_chrm.fasta SRR3184714_chrm.fasta SRR3987415_chrm.fasta SRR4029371_chrm.fasta SRR5208700_chrm.fasta SRR5997549_chrm.fasta
3_S1_L001_chrm.fasta SRR3184715_chrm.fasta SRR3987433_chrm.fasta SRR4029372_chrm.fasta SRR5208701_chrm.fasta SRR5997550_chrm.fasta
4_S2_L001_chrm.fasta SRR3184716_chrm.fasta SRR3987482_chrm.fasta SRR4029373_chrm.fasta SRR5208770_chrm.fasta SRR5997551_chrm.fasta
50m_S10_L004_chrm.fasta SRR3184717_chrm.fasta SRR3987489_chrm.fasta SRR4029374_chrm.fasta SRR5208886_chrm.fasta SRR5997552_chrm.fasta
5_S3_L001_chrm.fasta SRR3184718_chrm.fasta SRR3987493_chrm.fasta SRR4029375_chrm.fasta SRR5211153_chrm.fasta SRR6050903_chrm.fasta
65m_S11_L005_chrm.fasta SRR3184719_chrm.fasta SRR3987495_chrm.fasta SRR4029376_chrm.fasta SRR5211162_chrm.fasta SRR6050905_chrm.fasta
6_S6_L002_chrm.fasta SRR3184720_chrm.fasta SRR3987647_chrm.fasta SRR4029377_chrm.fasta SRR5211163_chrm.fasta SRR6050920_chrm.fasta
70m_S12_L006_chrm.fasta SRR3184721_chrm.fasta SRR3987651_chrm.fasta SRR4029378_chrm.fasta SRR5215118_chrm.fasta SRR6050921_chrm.fasta
80m_S1_L002_chrm.fasta SRR3184722_chrm.fasta SRR3987657_chrm.fasta SRR4029379_chrm.fasta SRR5247122_chrm.fasta SRR6050958_chrm.fasta
Run Code Online (Sandbox Code Playgroud)
总共有 423 个,我被要求将它们分成 32 个部分,以便在 …
然而,尝试并行化 sed 操作,当并行版本工作时,它会返回错误的输出。
我想并行化的 sed 操作(有效)
sed 's/\s.*$// ; s/\(.*\)/\L\1/' < oldfile.txt > newfile.txt
Run Code Online (Sandbox Code Playgroud)
我的上述 sed 操作的并行版本(由于某种原因无法正常工作):
parallel -a oldfile.txt -k --block $BYTES --pipe-part "sed 's/\s.*$// ; s/\(.*\)/\L\1/'" > newfile.txt
Run Code Online (Sandbox Code Playgroud) gnu-parallel ×10
bash ×3
command-line ×2
find ×2
shell ×2
basename ×1
cluster ×1
ffmpeg ×1
parallelism ×1
pipe ×1
quoting ×1
sed ×1
variable ×1