我有一个简单的 bash 脚本可以运行:
cat full_path.csv | parallel --progress -j +0 'echo -n {},; pdfgrep -c [^_] {};' > path_count.csv
Run Code Online (Sandbox Code Playgroud)
Parallel 的进度指示器"--progress",写入文件path_count.csv。我只想echo {}和pdfgrep {}写入文件,同时显示--progress到屏幕输出。
如果我做 :
cat full_path.csv | parallel --progress -j +0 'echo -n {},>>path_count.csv; pdfgrep -c [^_] {}>>path_count.csv;'
Run Code Online (Sandbox Code Playgroud)
文件 path_count 仍然是乱码。
任何帮助表示赞赏。谢谢阿尔文
我想这个问题/问题可以通过满足以下一个(或多个)问题来解决
1) 如何显示剩余的工作?2)我如何漂亮的输出--eta
1) 我已经检查了手册页,我目前在我的函数中使用 $PARALLEL_SEQ,但是我怎样才能获得剩余的工作?Parallel 帮助我编译了大约 800 个文件,我想知道我的剩余工作。
2)或者,有没有更好(更好)的输出方式--eta?我的输出看起来很乱。我只想看到一个 ETA。
我使用的并行标志: --no-notice --keep-order --group
输出示例:
819: Compiling form: USER_Q ok
ETA: 8s 13left 0.61avg local:4/819/100%/0.6s
820: Compiling form: USER_RESERVE_STOCK ok
ETA: 7s 12left 0.61avg local:4/820/100%/0.6s
821: Compiling form: USERS_AUTO ok
ETA: 7s 11left 0.61avg local:4/821/100%/0.6s
822: Compiling form: USERS ok
ETA: 6s 10left 0.61avg local:4/822/100%/0.6s
823: Compiling form: USERS_MENU ok
ETA: 6s 9left 0.61avg local:4/823/100%/0.6s
824: Compiling form: USER_SUPP ok
ETA: 4s 8left 0.61avg local:4/824/100%/0.6s
825: …Run Code Online (Sandbox Code Playgroud) 嵌套调用的正确方法是GNU parallel什么?
愚蠢的例子:
seq 1 100 | parallel echo {} | parallel seq {} 1000
Run Code Online (Sandbox Code Playgroud)
我的理解是,在 8 个 CPU 的机器上,每个并行将启动 8 个作业,总共 64 个作业。如果您调用的内容比seq这更重要,则可能会使盒子过载。有没有办法限制作业数量但仍然充分利用并行性?
正如标题中所说,我想知道该-k选项(强烈)是否会影响 GNU 并行的速度。
在man parallel_tutorial存在关于讨论--ungroup和--line-buffer,其声称--linebuffer,其unmixes输出线,比要慢得多--ungroup。那么-k当工作数量很大时,也许也会导致大幅放缓?
(我没有在man parallel或 中找到这个主题man parallel_tutorial;我也没有在谷歌上找到任何东西。不过我还没有完成man parallel,所以如果我错过了一些搜索较少的东西,请原谅。)
parallel当我在多台主机上运行相同命令时,是否可以在gnu输出的前面加上前缀?
我在一个工作池中有10台工作计算机,其中任何一台都可以接管工作,我想通过grep在所有日志文件中找出是哪个工作人员接管了:
parallel --nonall -S host1,host2,host3 grep job_id_123 /var/log/my_log.log
Run Code Online (Sandbox Code Playgroud)
打印类似:
initing job_id_123
doing phase1 job_id_123
doing phase2 job_id_123
wrapping up job_id_123
Run Code Online (Sandbox Code Playgroud)
我想要的是
host2: initing job_id_123
host2: doing phase1 job_id_123
host3: doing phase2 job_id_123
host1: wrapping up job_id_123
Run Code Online (Sandbox Code Playgroud)
我知道我可以这样做:
parallel --nonall -S host1,host2,host3 "hostname && grep job_id_123 /var/log/my_log.log"
Run Code Online (Sandbox Code Playgroud)
但是前缀是我所希望的。
我使用GNU parallel 20160422上Ubuntu precise (12.04.5 LTS)
我正在处理大数据,正在尝试并行化流程功能。我可以使用多个线程,每个用户处理的都是不同的线程(我有20万个用户)。
每个线程应n在输出文件中附加文件的第一行,该文件在所有线程之间共享一个输出文件。
我编写了一个Java程序来执行head -n 256 thread_processed.txt >> output(每个线程都会执行此操作)
我需要以原子方式编写输出文件。
如果线程A从0到9写了行,线程B从10到19写了行,则输出应为:[0...9 10... 19]。线不能重叠,不能像[0 1 2 17 18 3 4 ...]
如何在bash脚本中管理对输出文件的并发写访问?
我已经看过几个关于这个主题的问题,但我没有能力将其转化为我的具体问题.我有一个for循环遍历子目录,然后在每个目录内的压缩文本文件上执行.sh脚本.我想并行化这个过程,但我正在努力应用gnu parallel.
这是我的循环:
for d in ./*/ ; do (cd "$d" && script.sh); done
Run Code Online (Sandbox Code Playgroud)
我知道我需要并行输入一个列表,所以我一直在尝试这个:
ls -d */ | parallel cd && script.sh
Run Code Online (Sandbox Code Playgroud)
虽然这似乎已经开始,但是当gzip尝试解压缩目录中的一个txt文件时,我收到一个错误,说该文件不存在:
gzip: *.txt.gz: No such file or directory
Run Code Online (Sandbox Code Playgroud)
但是,当我运行原始for循环时,除了需要一个世纪才能完成之外我没有任何问题.此外,我在使用并行时只获得一次gzip错误,考虑到我有超过1000个子目录,这是非常奇怪的.
我的问题是:
在我的案例中如何让Parallel工作?如何并行将.sh脚本的应用程序并行化到自己子目录中的1000个文件?即 - 我的问题的解决方案是什么?我必须取得进步.
我错过了什么?语法,循环,坏脚本?我想学习.
并行实际上是否尝试并行运行所有这些.sh脚本?为什么我的每个.txt.gz文件都没有出错?
并行是应用程序的最佳选择吗?还有其他选择更适合我的需求吗?
我有数百个文件,命名如下:
RG1-t.txt
RG1-n.txt
RG2-t.txt
RG2-n.txt
等等...
我想使用GNU并行在它们上运行脚本,但是我很难获取文件的基本名称,因此RG1,RG2等...这样我就可以运行:
ls RG*.txt | parallel "command.sh {basename}-t.txt {basename}-n.txt > {basename}.out"
Run Code Online (Sandbox Code Playgroud)
导致文件RG1.out,RG2.out等。有什么想法吗?
我正在尝试编写并行压缩/加密备份脚本,以使用GNU parallel,xz和GnuPG进行归档。脚本的核心部分是:
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" \
| pv > $TARGET/$FILENAME
Run Code Online (Sandbox Code Playgroud)
没有GnuPG加密,它会很好地工作(解压缩和解压缩工作),但是添加并行加密后,它解密失败,并出现以下错误:
[don't know]: invalid packet (ctb=0a)
gpg: WARNING: encrypted message has been manipulated!
gpg: decrypt_message failed: Unexpected error
: Truncated tar archive
tar: Error exit delayed from previous errors.
Run Code Online (Sandbox Code Playgroud)
因为未压缩的大小与gnu parallel的块大小相同(大约125M),所以我认为这与GnuPG对部分块加密的支持有关。我怎么解决这个问题?
费耶
关于随机数生成的另一个并行gpg加密问题
https://unix.stackexchange.com/questions/105059/parallel-pausing-and-resuming
我只想打印当前(递归)目录中的所有文件,而仅打印出有错误的文件,并在完成替换后将变量分配给1。
#!/bin/bash
lint_failed=0
find . -path ./vendor -prune -o -name '*.php' | parallel -j 4 sh -c 'php -l {} || echo -e "[FAIL] {}" && lint_failed=1';
if [ "$lint_failed" -eq "1" ]; then
exit 1
fi
Run Code Online (Sandbox Code Playgroud)
范例:
[失败] ./app/Model/Example.php
上面的代码找不到任何错误,但是如果我运行php -l ./app/Model/Example.php,则会返回错误。
gnu-parallel ×10
bash ×4
gnu ×3
ubuntu ×2
encryption ×1
gnupg ×1
pgp ×1
php ×1
phplint ×1
shell ×1