我有一台 24 核的旧 Mac,我想自动运行数百/数千个单核作业。我制作了一个在后台运行进程的 bash 脚本,但是如果我同时设置太多进程,计算机就会冻结(显然 300 个还可以,400 个太多了……)。
理想情况下,我想做的是运行 24 号,然后当一个完成时,运行 25 号,然后当下一个完成时,运行 26 号,依此类推。不幸的是,每个作业可能需要不同的、可变的运行时间,所以我不能做某种计时来设置它们在交错的时间运行。
我见过一些带有“等待”的东西,但我不确定我是否发送了 24 然后,比如说,带有等待命令的 976,它会给我所需的行为,还是会在第一个命令之后连续运行 976 24 完成?
编辑:谢谢,这很可能是重复的,但正如我看到问题的答案仅指向并行,我可以继续在这里探索如何使用 xargs 做到这一点吗?
原因是,有问题的 Mac 目前位于另一个大陆,我绝对需要它在接下来的几天内工作并运行所有这些作业 - 安装某些东西总是有可能弄乱机器,所以我不'此时我不想并行安装,而我实际上无法到达它。但它在 bash 中有 xargs,所以我正在探索使用它。
到目前为止,我已经重写了 bash 脚本,以满足 xargs 和并行所期望的情况,我可以使用各种输入来运行它。现在,我拥有的是一个 bash 脚本,它在文件夹中的每个文件上运行我的作业。我目前尝试过:
ls -d myfolder/* | | ls -d myfolder/* | xargs -P 2 -L 1 ~/bin/myscript.sh
但这似乎仍然同时运行它们,因此我不确定我做错了什么。 (这里我使用最多 2 个,这样我就可以继续查找和测试!我只在文件夹中放入 4 个 - 不想意外发送数百个)
最终编辑:啊哈!!!很久以后我才发现我做错了什么。 xargs 可能正在运行我的脚本并行,但不是我编写的要运行的脚本的程序。我编写了一个脚本,因为我无法弄清楚如何将文件名插入到参数列表中,该列表需要参数=值对。我最终想出了如何使用 xargs 中的 -I 标志来做到这一点。这终于奏效了:
ls -d myfolder/* | | ls -d myfolder/* | xargs -I foo -P 2 -L 1 myprogram arg1 arg2 arg3=foo arg4
(我认为 -I 和 -L 1 是多余的,但因为它有效,所以我不会弄乱它......)
在这里,myprogram 的参数列表中的 foo 被替换为每个文件名。我注意到,我花了很长时间才弄清楚的一个原因是大多数指令都带有 -I 使用 {} 作为要替换的元素,并且由于某种原因在我的 Mac 上它无法处理它。所以我想 - 我没有工作,但它与 foo 一起工作得很好。
答案1
答案2
我最近遇到了类似的问题。据我所知,你有两种选择:
和
例如,要将find
命令找到的每个 flac 文件转换为 ogg,我尝试运行:
find -name "*.flac" -print0 | xargs -0 -P 24 -L 1 oggenc
使用命令中的行-P 24
一次最多运行多个进程。我确信您可以使用它来根据您的需求进行自定义,但我们需要您的问题提供更多详细信息。-L 1
find