限制循环中进程的cpu限制

时间:2018-02-07 03:50:12

标签: bash loops ubuntu ffmpeg cpu-usage

我正在尝试在多个文件的循环中执行ffmpeg。我只希望一次运行一个实例,并且只使用50%的cpu。我一直在尝试cpulimit,但它在循环中表现不佳。

for i in {1..9}; do cpulimit -l 50 -- ffmpeg <all the options>; done

这会同时生成所有九个作业,它们全部归init所有,因此我必须打开htop才能杀死它们。

for i in {1..9}; do ffmpeg <all the options> & cpulimit -p $! -l 50; done

这挂起,ctrl+c继续下一个循环迭代。这些实例只能被SIGKILL杀死。

3 个答案:

答案 0 :(得分:3)

使用队列是可行的方法。我使用的简单解决方案是Task Spooler。您可以使用-threads限制ffmpeg使用的核心数。这里有一些代码供您使用:

ts sh -c "ffmpeg -i INPUT.mp4 -threads 4 OUTPUT.mp4"
  • 您可以使用以下内容将同时任务的最大数量设置为1:ts -S 1
  • 要查看当前队列,请运行ts

答案 1 :(得分:0)

如果希望-threads选项对编码器起作用,则应将其放在-i参数之后,输出文件名之前-您当前的选项仅告诉解码部分使用单个线程。因此,要使所有线程都使用一个线程,您需要在-i选项之前和之后都使用-threads 1。所以你可以这样:

ffmpeg -threads 1 -i INPUT.mp4 -threads 1 OUTPUT.mp4

答案 2 :(得分:0)

您应该在前台运行它。这样,循环将按预期工作。

$ cpulimit --help
...
-f  --foreground   launch target process in foreground and wait for it to exit

这对我有用。

for file in *.mp4; do
    cpulimit -f -l 100 -- ffmpeg -i "$file" <your options>
done