如何保持特定数量的进程在运行?

如何保持特定数量的进程在运行?

我正在尝试编写一个 shell 脚本来将大量 .wav 文件转换为 .mp3。我使用“find”命令来查找它们,然后使用“lame”命令进行转换。我可以使用一个简单的 for 循环来实现此目的,但我需要使用多个并行进程来完成此操作。

我想要定义数量的进程,例如 4。开始在每个进程中转换文件。当一个文件在一个进程中完成转换时,我将其替换为下一个文件。解决这个问题的最佳方法是什么?

答案1

我建议将列表传递给xargs并使用-n和/或-P选项来控制在任何给定时间运行的进程数量。

答案2

make对此有好处。你需要一个Makefile类似的东西

%.mp3: %.wav
lame $(LAMEOPTS) $< $@

然后生成目标列表:

$ find . -name '*.wav' -type f | sed -e 's/\(.*\.\)wav$/all: \1mp3/' >>Makefile

现在,告诉make安排任务:

$ make -r -j4 -f Makefile

答案3

我很惊讶还没有人提到 GNU 并行。使用它,命令将非常简单:

find -type f -name '*.wav' -print0 | parallel -0 lame {} {.}.mp3

这要求将每个输入文件的扩展名替换为mp3.默认情况下,并行运行的作业数量与计算机上的 CPU 数量相同,但您可以使用 设置不同的值-j <i>integer</i>。开关 --dry-run 对于查看将执行哪些命令很有用。

答案4

如果您已经xjobs安装,您会发现这正是它设计的任务类型。特别是,检查选项的描述-j以调整创建的进程数量。

相关内容