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