我有一个小脚本,它循环遍历文件夹的所有文件并执行(通常是持久的)命令。基本上是
for file in ./folder/*;
do
./bin/myProgram $file > ./done/$file
done
Run Code Online (Sandbox Code Playgroud)
(请忽略语法错误,这只是伪代码)。
我现在想同时运行这个脚本两次。显然,如果 ./done/$file 存在,则不需要执行。所以我把脚本改成了
for file in ./folder/*;
do
[ -f ./done/$file ] || ./bin/myProgram $file >./done/$file
done
Run Code Online (Sandbox Code Playgroud)
所以基本上问题是:两个脚本(或通常不止一个脚本)是否可能实际上处于同一点并检查done失败且命令运行两次的文件是否存在?
这将是完美的,但我非常怀疑。这太容易了 :D 如果他们处理同一个文件可能发生,是否有可能以某种方式“同步”脚本?
我有一个令人尴尬的并行过程,它创建了大量几乎(但不完全)相同的文件。有没有办法“即时”存档文件,以便数据不会占用不必要的空间?
进程本身接受命令行参数并将创建的每个文件的名称打印到标准输出。我正在调用它,parallel --gnu它负责分配输入(来自另一个进程)和收集输出:
arg_generating_process | parallel --gnu my_process | magic_otf_compressor
Run Code Online (Sandbox Code Playgroud)
管道第一部分的简单示例bash:
for ((f = 0; $f < 100000; f++)); do touch $f; echo $f; done
Run Code Online (Sandbox Code Playgroud)
怎么可能magic_otf_compressor长得像?它应该将每个输入行视为文件名,将每个文件复制到压缩.tar存档(处理所有文件的存档相同!),然后将其删除。(实际上,打印每个处理文件的名称应该就足够了,另一个| parallel --gnu rm可以负责删除文件。)
有没有这样的工具?我不考虑单独压缩每个文件,这会浪费太多空间。我已经研究过archivemount(将文件系统保留在内存中 -> 不可能,我的文件太大太多)和avfs(无法让它与 FUSE 一起工作)。我错过了什么?
我离自己破解这样一个工具只有一步之遥,但之前肯定有人做过......
编辑:基本上我想我正在寻找一个标准输入前端libtar(而不是从命令行tar读取参数的命令行前端)。
我有以下 bash 脚本:
for i in {0800..9999}; do
for j in {001..032}; do
wget http://example.com/"$i-$j".jpg
done
done
Run Code Online (Sandbox Code Playgroud)
所有照片都存在,实际上每次迭代都不依赖于另一个。如何在控制线程数的情况下并行化它?
假设我有多个并行运行的 bash 脚本,代码如下:
#!/bin/bash
tail -f /dev/null &
echo "pid is "$!
Run Code Online (Sandbox Code Playgroud)
为$!保证给我最近的后台任务的PID该脚本,或者是最近的后台任务在全球范围?我只是好奇,当它返回的 PID 来自另一个脚本中启动的进程时,依赖此功能是否会导致竞争条件。
这是我现在所做的,
sort -T /some_dir/ --parallel=4 -uo file_sort.csv -k 1,3 file_unsort.csv
该文件是 90GB,我收到此错误消息
sort: close failed: /some_dir/sortmdWWn4: Disk quota exceeded
以前,我没有使用 -T 选项,显然 tmp 目录不足以处理这个问题。我当前的目录有大约 200GB 的可用空间。排序临时文件还不够吗?
我不知道并行选项是否会影响事情。
我在高级目录中有几个子目录。每个子目录都有几个文件和一个 for 循环 shell 脚本。每个子目录中都存在相同的 for 循环脚本。我想进入每个子目录并在多个终端中并行运行 for 循环脚本。我试过这个,但它似乎是连续执行的(一个接一个),但我想并行运行所有这些。
find dir_* -type f -execdir sh for_loop.sh {} \;
Run Code Online (Sandbox Code Playgroud) 在 bash 脚本中,我有一个这样的程序
for i in {1..1000}
do
foo i
done
Run Code Online (Sandbox Code Playgroud)
我用参数调用函数foo1000 次i
如果我想让它在多进程中运行,但不是同时运行,我该怎么办?
所以如果我有
for i in {1..1000}
do
foo i &
done
Run Code Online (Sandbox Code Playgroud)
它会同时启动所有 1000 个进程,这不是我想要的。
有没有办法确保始终有 100 个进程在运行?如果某些过程完成,则开始一些新的过程,直到所有 1000 次迭代完成。或者,我可以等到所有 100 个都完成后,再运行另外 100 个。
我在跑A file | B --params > file.txt。由于我想加快处理速度,所以我使用了parallel -j+0< a.txt并发运行 20 个作业。a.txt 包含所有命令:
A file1 | B --params > file1.txt
A file2 | B --params > file2.txt
A fileN | B --params > fileN.txt
Run Code Online (Sandbox Code Playgroud)
这种方式安全吗?并行运行时,来自不同程序的标准输出会被弄乱吗?
我正在考虑使搜索更快和/或更好的方法,主要使用fgrepor ag。and不区分大小写地搜索单词at$HOME并将匹配列表重定向到的代码vim
find -L $HOME -xtype f -name "*.tex" \
-exec fgrep -l -i "and" {} + 2>/dev/null | vim -R -
Run Code Online (Sandbox Code Playgroud)
这是更快,有ag因为并行的和ack
find -L $HOME -xtype f -name "*.tex" \
-exec ag -l -i "and" {} + 2>/dev/null | vim -R -
Run Code Online (Sandbox Code Playgroud)
小群的平均统计信息fgrep,并ag通过time
fgrep ag terdon1 terdon2 terdon3 muru
user 0.41s 0.32s 0.14s 0.22s 0.18s 0.12s
sys 0.46s 0.44s 0.26s 0.28s 0.30s …Run Code Online (Sandbox Code Playgroud) parallelism ×10
shell-script ×4
bash ×3
gnu-parallel ×2
ag ×1
disk-usage ×1
files ×1
filesystems ×1
fuse ×1
gnu ×1
grep ×1
ksh ×1
large-files ×1
output ×1
pipe ×1
scripting ×1
sort ×1
tar ×1
time ×1
wget ×1