我需要并行运行一些命令,包括 SCP。为此,我使用 GNU Parallel。问题是我不知道如何将密码传递给 SCP。这是与我正在运行的类似的一行:
ls 2011_* | parallel scp {} user@domain
Run Code Online (Sandbox Code Playgroud)
如果ls找到3个文件,scp同时询问3次密码,我只能将密码输入到最后一个进程来提示输入。
我暂时解决了使用公钥连接的问题,但由于公司政策,这在将来不会成为一个选择。我阅读了 SCP 手册页,但找不到选项,但我非常有信心 Parallel 应该有一个选项允许我输入密码。
有人知道解决这个问题的方法吗?
编辑:我想知道是否有一种方法可以告诉parallel密码,以便它可以在scp每次询问时提供密码。也许有这样的事情:
ls 2011_* | parallel scp {} user@domain < file_with_password.txt
Run Code Online (Sandbox Code Playgroud)
但指定重定向STDIN是 forscp而不是 for lsor parallel。
在 bash 中,我正在运行 GnuPG 来解密一些文件,并且我希望将输出重定向到具有相同名称但具有不同扩展名的文件。基本上,如果我的文件被命名
file1.sc.xz.gpg
Run Code Online (Sandbox Code Playgroud)
运行 GnuPG 工具后出现的文件我想存储在另一个名为
file1.sc.xz
Run Code Online (Sandbox Code Playgroud)
我目前正在尝试
find . -type f | parallel "gpg {} > {}.sc.xz"
Run Code Online (Sandbox Code Playgroud)
但这会生成一个名为 file1.sc.xz.gpg.sc.xz 的文件。我怎样才能做到这一点?
稍后编辑:我想在一个单独的 bash 命令中执行此操作,而无需事先知道文件名。
假设我使用并行进行foo.sh调用bar.sh:
# foo.sh
#! /bin/bash
parallel -N 3 bar.sh ::: $(seq 10)
Run Code Online (Sandbox Code Playgroud)
我的bar.sh工作方式是这样的:如果设置了环境变量(例如DEBUG=1),那么它将输出大量调试信息。
理想情况下,我想简单地执行我的foo.sh这样:
$ DEBUG=1 foo.sh
Run Code Online (Sandbox Code Playgroud)
通常,foo.sh有价值$DEBUG并且bar.sh能够看到它。但现在我使用 GNU parallel 来调用bar.sh,这是一个本地程序, mybar.sh不再有DEBUG值集。
我读到,--env只有在我设置了远程执行的情况下才有效-S,从我的尝试来看,它似乎对我不起作用。
有没有办法让我的并行化bar.sh简单地“继承”我的环境设置foo.sh?我真的不想在bar.sh并行调用时详细说明每个环境变量及其值。
TIA
给定一个由管道组合的多个命令的任务:
cat input/file1.json | jq '.responses[0] | {labelAnnotations: .labelAnnotations}' > output/file1.json
现在,有数千个输入 JSON 文件,我喜欢利用 GNU Parallel 来并行化所有进程。我怎么能这么做呢?像这样的东西吗?
parallel cat {} | jq '...' > output/{./} ::: input/*.json
注意:如果里面有管道,事情会变得更加复杂jq注意:如果过滤器
我正在尝试使用不同的参数并行化粒子模拟以节省一些时间。因此,我想GNUparallel用于为不同的参数运行 bash 脚本。该脚本读取一个文件,然后执行模拟,例如:
$bash script <<< input file
然而:-
$cd ~/parameter_files ls | parallel bash script <<< {}
根本不起作用。我是 Linux 和 GNUparallel 的新手,所以希望有人可以提供帮助。
(GNU Parallel 的新功能)
我的目标是在多个核心上运行具有不同参数的相同 Rscript。我的第一个问题是让它在我的笔记本电脑上运行(2 个真实核心,4 个虚拟核心),然后我将其移植到 64 个核心的笔记本电脑上。
现在:
我有一个 Rscript,“Test.R”,它接受参数,做一件事(比如添加一些数字,然后将其写入文件),然后停止。
我有一个“commands.txt”文件,其中包含以下内容:
/Users/name/anaconda3/lib/R/bin/Rscript Test.R 5 100 100
/Users/name/anaconda3/lib/R/bin/Rscript Test.R 5 100 1000
/Users/name/anaconda3/lib/R/bin/Rscript Test.R 5 100 1000
/Users/name/anaconda3/lib/R/bin/Rscript Test.R 5 100 1000
/Users/name/anaconda3/lib/R/bin/Rscript Test.R 50 100 1000
/Users/name/anaconda3/lib/R/bin/Rscript Test.R 50 200 1000
Run Code Online (Sandbox Code Playgroud)
所以这告诉GNU并行使用R运行Test.R(我已经使用anaconda安装了它)
在终端中(导航到 Test.R 和 Commands.txt 所在的桌面后),我使用以下命令:
parallel --jobs 2 < commands.txt
Run Code Online (Sandbox Code Playgroud)
我想要做的是使用 2 个核心,并运行commands.txt 中的命令,直到所有任务完成。(我尝试过此命令的变体,例如将 2 更改为 1,在这种情况下,其中 2 个核心以 100% 的速度运行,另外 2 个核心以 20-30% 的速度运行)。
当我运行此命令时,所有 4 个核心都达到 100%(从 htop 可以看出),并且前 2 个作业完成,并且没有更多作业完成,尽管所有 4 个核心仍处于 100%。 …
假设我在从标准输入接收的一组项目上并行运行 gnu,并根据某些标准进行拆分:
cat content | parallel -j 4 my_command
Run Code Online (Sandbox Code Playgroud)
如何访问作业编号,以便我可以将并行执行的作业编号/ID 作为参数传递给命令(以便每个并行执行块具有唯一编号):
cat content | parallel -j 4 my_command -n ???
Run Code Online (Sandbox Code Playgroud)
(这甚至可能吗?现在查看手册页)
我有一个脚本文件
文件名:test_sem_zsh.sh
main() {
echo "Happy day"
}
export -f main
sem --id testing --fg main
Run Code Online (Sandbox Code Playgroud)
我正在尝试使用运行它zsh
$ zsh test_sem_zsh.sh
test_sem_zsh.sh:export:4: invalid option(s)
zsh:1: command not found: main
Run Code Online (Sandbox Code Playgroud)
1) main command not found它说两个错误2) export:4: invalid option(s)
当我尝试使用它时bash它在哪里工作
$ sh test_sem_zsh.sh
Happy day
Run Code Online (Sandbox Code Playgroud)
那么如何让这个脚本zsh也与
file.xml是一个 74G 的大文件,我必须尽快对其进行 grep 单个正则表达式。我正在尝试使用 GNU 来做到这一点parallel:
parallel --pipe --block 10M --ungroup LC_ALL=C grep -iF "test.*pattern" < file.xml
Run Code Online (Sandbox Code Playgroud)
--pipepart由于它比 更快,我如何通过使用来实现它--pipe?
通过增加或减少块的大小(例如 20M 而不是 10M,或者 10M 而不是 20M),它会变得更快吗?
我希望受益于parallelmacOS 上命令的所有潜力(似乎存在 2 个版本,GNU 和 Ole Tange 的版本,但我不确定)。
使用以下命令:
parallel -j8 find {} ::: *
Run Code Online (Sandbox Code Playgroud)
如果我位于包含8个子目录的目录中,我会有很大的性能。但是,如果所有这些子目录除了只有一个之外都具有较小的内容,那么我将只有一个线程可以在唯一的“大”目录上工作。
有没有办法遵循这个“大目录”的并行化?我的意思是,剩下的唯一线程可以得到其他线程的帮助吗(之前的线程适用于小子目录)?
find理想的情况是,当上面的命令行中的命令找到所有小子时,并行命令“自动切换” 。也许是我问得太多了?
另一个潜在的优化(如果存在):考虑公共树目录结构:是否有一种类似于命令的方法make -j8,将每个当前线程分配给子(sub-(sub-....))))目录一旦探索了当前目录(别忘了,我主要想在findLinux 命令中使用这种优化),另一个线程探索另一个目录 sub-(sub-(sub- ....)))) 目录?
当然,运行的总线程数不大于parallel命令指定的数量(parallel -j8在我上面的示例中):我们可以说,如果树元素的数量(1个节点=1个目录)大于线程数,我们不能超过这个数字。
我知道在递归上下文中并行化很棘手,但当我想在大树结构中查找文件时,也许我可以获得一个重要因素?
这就是为什么我以 command 为例make -j8:我不知道它是如何编码的,但这让我认为我们可以对parallel/find帖子开头的几个命令行执行相同的操作。
最后,我想得到您关于这两个问题的建议,更一般地说,目前这些优化建议什么是可能的,什么是不可能的,以便使用经典find命令更快地找到文件。
更新1:正如@OleTange所说,我不知道我想要gupdatedb索引的内容的先验目录结构。因此,很难提前知道maxdepth。您的解决方案很有趣,但第一次执行find不是多线程的,您不使用parallel命令。gupdatedb我有点惊讶的是,不存在多线程版本:在纸面上,这是可行的,但一旦我们想在gupdatedbMacOS 10.15 的 GNU 脚本中对其进行编码,那就更困难了。
如果有人有其他建议,我会接受!